【问题标题】:Android: Need to reference view when using findViewById?Android:使用 findViewById 时需要参考视图吗?
【发布时间】:2016-05-23 12:38:16
【问题描述】:

这更多是出于好奇。我有这个sn-p:

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-reference,它按预期工作。所以在developer.android.comButtons-section中也有描述

但是,with mView 也可以。

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

为什么它是双向的?任何给定的用法都有什么缺点吗?

谢谢。

【问题讨论】:

    标签: java android xml view reference


    【解决方案1】:

    为什么它是双向的?

    如果它以两种方式起作用,则可能意味着两种不同的东西。首先,您也将myButton.xml 传递给setContentView。在这种情况下,Activity 作为其视图层次结构的一部分,有一个 ID 为 mButton 的视图。它按预期工作,但当然,OnClickListener,在膨胀布局的情况下目的较少,除非您将膨胀视图添加到Activity 的视图层次结构中。如果您没有将myButton.xml 传递给setContentView,则意味着您有两个独立的布局,其中包含相同的ImageButton 和相同的id。在这种情况下,关于OnClickListener 的考虑也是有效的。

    【讨论】:

    • 我确实有两种不同的布局,但是两者的id是怎么包含的呢?
    • id 是唯一的。它是在您第一次在编译时在您的一个布局中声明 @+id/ 时生成的。您可以按照自己喜欢的方式重复使用
    【解决方案2】:

    你有两种情况:

    案例一

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

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

    案例 2

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

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

    【讨论】:

    • 是的,我使用 addContentView() 的另一个视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多