【问题标题】:findViewByID not work in tab layoutfindViewByID 在选项卡布局中不起作用
【发布时间】:2018-07-06 00:55:07
【问题描述】:

我使用与本教程匹配的选项卡布局:

tab layout tutorial androidhive

它工作正常,但是当我向 fragment_one.xml 添加一个按钮时,我不能对这个按钮使用 setOnClickListener 因为 findViewById 在 MainActivity.java 中不起作用

MainActivity 波纹管代码:

public class MainActivity extends AppCompatActivity {
Button button;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           Snackbar.make(view, "Replace with your own action",Snackbar.LENGTH_LONG).setAction("Action", null).show();
        }
    });
}

应用因以下错误而停止: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.Button.setOnClickListener”

按钮应该在哪里定义和setOnClickListener?

【问题讨论】:

  • 按钮在哪里?显示你的布局
  • 您必须在片段类中找到按钮并为它设置 onclick 侦听器,而不是在活动中
  • 按钮在 fragment_one.xml @DroiDev

标签: android fragment android-tablayout


【解决方案1】:

即使片段由活动托管,它也有自己的布局(在活动的布局中包含),因此您必须在其java class 中定义片段的视图.

在大多数情况下,片段会有自己的 Java 类供您管理和操作,因此在您的情况下,它应该如下所示:

public class OneFragment extends Fragment{

    public OneFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_one, container, false);
        Button button=view.findViewById(R.id.myButtonInFragment);
        return view;
    }

}

如果您想从其父 Activity 访问此按钮,可以通过将按钮设为 public 来实现:

public class OneFragment extends Fragment{

   public Button button;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_one, container, false);
        button=view.findViewById(R.id.myButtonInFragment);
        return view;
    }
}

然后,使用您的activity 中的片段实例访问它:

OneFragment myFragment=new OneFragment();

将片段附加到活动后,您可以使用:

myFragment.button.setClickEnabled(false);

但是,不建议在 Fragment 之外访问 Fragment 的子项,应尽可能避免。

【讨论】:

  • 在其他类中访问按钮的最佳方式是什么?
【解决方案2】:
public class MainActivity extends AppCompatActivity {
    Button button;
    Fragment fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fragment = new Fragment();


        View view = fragment.getView();
        if (view !=null) {
             view.findViewById(R.id.button);

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多