在MainActivity中如何访问除activity_main.xml外其他XML布局的控件元素
如何访问非主布局XML文件中的控件元素
findViewById 是基于当前Activity加载的根布局来搜索控件的,你默认调用setContentView(R.layout.activity_main)的话,只会在activity_main对应的布局树中查找控件,其他未加载到当前视图树的XML文件中的控件自然无法被找到,可按你的实际使用场景选择对应解决方法:
- 方法1:手动加载目标XML布局后查找控件
如果包含目标控件的XML需要单独使用,先通过LayoutInflater把目标布局转成View对象,再基于这个View查找内部控件即可:
// 替换下方的item_layout为你存放btnElementInside_items_xml的布局文件名 View itemLayout = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_layout, null); ImageView button = itemLayout.findViewById(R.id.btnElementInside_items_xml); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(), "Test", Toast.LENGTH_SHORT).show(); } }); // 如果需要展示这个布局,可以将它添加到activity_main的容器控件中,示例如下: LinearLayout rootContainer = findViewById(R.id.你activity_main里的容器控件id); rootContainer.addView(itemLayout);
- 方法2:目标XML是RecyclerView/ListView等列表的子项布局
不要在Activity中直接查找子项内的控件,要在对应Adapter的onCreateViewHolder或onBindViewHolder方法中,通过加载得到的itemView对象查找对应控件,再设置点击事件。 - 方法3:目标XML通过
标签嵌入到activity_main.xml中
这种情况直接用Activity的findViewById就可以找到控件,如果查找失败请检查标签配置是否正确,以及控件id拼写是否和布局文件中一致,确认没有id重名问题。
注意:不要在布局还没有加载到视图树的时候调用findViewById,否则会返回null触发空指针异常。
内容的提问来源于stack exchange,提问作者Fábio Monteiro
相关产品推荐
相关产品推荐

