Android:使用findViewById时需要引用视图吗?

时间:2016-05-23 12:38:17

标签: java android xml view reference

这更多是出于好奇。我有这个片段:

View mView = mInflater.inflate(R.layout.myButton, null);
ImageButton button = (ImageButton) mView.findViewById(R.id.mButton);
button.setOnClickListener(new View.OnClickListener() {
   public void onClick(View v) {
       ...

首先我尝试了没有 mView - 引用,它按预期工作。所以它也在 developer.android.com

Buttons部分中进行了描述。

但是, mView也可以。

我的问题是,真的需要引用它吗?它背后的目的可能是什么?

为什么它两种方式都有效?任何给定的用法都有任何缺点吗?

感谢。

2 个答案:

答案 0 :(得分:1)

  

为什么它兼顾两种方式?

如果两种方式都有效,那么它可能意味着两种不同的东西。首先,您也将myButton.xml传递给setContentView。在这种情况下,作为视图层次结构的一部分,Activity具有标识为mButton的视图。它按预期工作,但当然,OnClickListener在膨胀布局的情况下目的较少,除非您将膨胀的视图添加到Activity的视图层次结构中。如果您未将myButton.xml传递给setContentView,则表示您有两个单独的布局,其中包含具有相同ID的相同ImageButton。在这种情况下,有关OnClickListener的注意事项也是有效的。

答案 1 :(得分:1)

你有两种情况:

案例1

(Button) findViewById(R.id.mButton);

您正在参与活动,其中Activity.findViewById()将浏览实际的活动视图树。 从您使用setContentView()addContentView(..)或其他inflater方法的那一刻起,此活动就会有一个视图

案例2

(Button) mView.findViewById(R.id.mButton);

您正在使用View.findViewById()在另一个视图中搜索 视图。例如,此方法用于从Fragment获取视图。