【问题标题】:why setOnClickListener not working for inflated button?为什么 setOnClickListener 不适用于充气按钮?
【发布时间】:2016-01-27 19:30:01
【问题描述】:

我是一个初学者,我正在从tab_fragment.xml 为按钮充气,当我尝试为该按钮设置 OnClickListener 时,它不起作用

LayoutInflater inflater=getLayoutInflater();
    View v=inflater.inflate(R.layout.tab_fragment, (ViewGroup) findViewById(R.id.line1));
    Button button= (Button) v.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
            viewPagerAdapter.addFrag(new Tab(), "two");
            viewPager.setAdapter(viewPagerAdapter);
            tabLayout.setupWithViewPager(viewPager);
        }
    });

这是我的 tab_fragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/line1"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
    <TextView
    android:layout_margin="50dp"
    android:text="some text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Button"
    android:id="@+id/button"
    android:layout_gravity="center_horizontal"
    />

</LinearLayout>

【问题讨论】:

    标签: android button onclicklistener android-inflate


    【解决方案1】:

    好的。知道了。该按钮是片段布局的一部分。所以你在活动类中没有按钮的实例。如果要处理活动类上的按钮单击行为,可以使活动实现 OnClickListener。然后像这样覆盖片段中的 onAttach() 方法:

    @Override
    public void onAttach(Context activity) {
        super.onAttach(activity);
        if(activity instanceof OnClickListener)
            mListener = (OnClickListener) activity;
        }
    }
    
    @Override
    public void onDetach() {
        mListener = null;
        super.onDetach();
    }
    

    然后在 onCreateView 方法上:

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle    savedInstanceState) {
        View v = inflater.inflate(R.layout.tab_fragment, container, false);
        Button button = (Button) v.findViewById(R.id.button);
        button.setOnClickListener(mListener);
        return v;
    }
    

    此外,将 onClick() 中 onClick() 中的逻辑从以下活动中移出:

    Override
    public void onClick(View view) {
        switch (view.getId() == R.id.button) {
              // move your logic here
        }
    }
    

    【讨论】:

      【解决方案2】:

      你应该在片段类中有这样的东西:

      @Nullable
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          View v = inflater.inflate(R.layout.tab_fragment, container, false);
          Button button = (Button) v.findViewById(R.id.button);
          button.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
                  viewPagerAdapter.addFrag(new Tab(), "two");
                  viewPager.setAdapter(viewPagerAdapter);
                  tabLayout.setupWithViewPager(viewPager);
              }
          });
          return v;
      }
      

      【讨论】:

      • 是的,但我想知道为什么当我从 MainActivity 打电话时它不起作用
      • 您想在活动按钮上添加监听器吗?抱歉,我不明白你到底想做什么。
      • 我想从活动而不是片段中添加侦听器。我可以从片段中添加监听器,但我想知道为什么它不能从活动中工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2019-08-28
      相关资源
      最近更新 更多