【问题标题】:Clarification regarding findViewById(int id) method in Android关于 Android 中 findViewById(int id) 方法的说明
【发布时间】:2016-05-26 10:17:08
【问题描述】:

我正在经历 Head First Android 开发,我有点困惑 这个方法 --> findViewById(int id)

我在“activity_find_beer.xml”文件中有以下按钮:

<Button
android:id="@+id/find_beer"
android:text="@string/find_beer"
android:onClick="onClickFindBeer" />

以及来自 FindBeerActivity.java 类的以下代码,它获取用户选择的啤酒并在文本视图中显示相同的啤酒。

public class FindBeerActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_find_beer);
    }
    //Call when the button gets clicked
    public void onClickFindBeer(View view) {
        //Get a reference to the TextView
    TextView brands = (TextView) findViewById(R.id.brands);
       //Get a reference to the Spinner
    Spinner color = (Spinner) findViewById(R.id.color);
       //Get the selected item in the Spinner
    String beerType = String.valueOf(color.getSelectedItem());
       //Display the selected item
    brands.setText(beerType);
    }
    }
  1. 我的问题是 onClickFindBeer(View view) 采用 View 类型的方法 对象作为参数,但在我刚才提到的 xml 中 android:onClick="onClickFindBeer" 当用户点击 button ,方法 onClickFindBeer 被调用...谁在传递对象 类型 View 到 onClickFindBeer(View view) ...是什么东西 隐含的?

  2. 第二,在developer.android.com我看到方法 findViewById(int id) 都在 Activity 类 中( https://developer.android.com/reference/android/app/Activity.html ) 以及 View 类 https://developer.android.com/reference/android/view/View.html ...我不清楚哪个类(活动或视图) 当我调用 findViewById() 时调用 findViewById(int id) 方法 来自 onClickFindBeer(查看视图){}。

如果有人能说明这一点,我们将不胜感激。

问候。

【问题讨论】:

    标签: java android android-activity


    【解决方案1】:
    1. 该方法采用View 参数,因为它是在Button 类的超类中实现的(它是public class Button extends TextView。)。添加到 XML 的视图实际上是 java 类。当您为这样的 XML 项设置属性时,它会相应地从特定的 java 类构造对象。 View 类的 onClick 方法为 onClick(View v)。通过设置 XML,您只是要求 Button 类查找输入的方法,但其签名始终以 View 作为参数,它指的是单击的视图。
    2. findViewById 必须在视图组上调用。但 Actyvity 类实现它以搜索由 setContentView() 方法分配给它的视图中的项目。

    【讨论】:

    • 感谢 Malith 抽出时间回复。
    【解决方案2】:
    1. 它在某种程度上是隐含的。在构建您的应用程序时,XML 文件实际上被转换为 Java 文件。当你点击视图时,视图被传递到 onClickFindBeer(View view) 函数中。
    2. 活动在此处调用 findViewById()。您可以通过在按住 Ctrl 的同时单击 findViewByID 来查看方法声明。对于视图,您必须使用视图调用它。例如,

      view.findViewById();

    【讨论】:

    • 我正在寻找一种方法来确认调用了哪个类(活动或视图)findViewById()。 :) ...
    • 您可以浏览代码以查看实际调用的内容。 Android 是开源的,您可以查看大部分代码。您可以右键单击方法并使用“转到”选项导航到声明、超类等。并了解事情是如何运作的。试试看,如果你明白我想说什么,请告诉我。
    【解决方案3】:
    1. 它叫JAVA Reflection,被android使用

    2.

    据我所知,主要区别在于,当您从活动中使用OnClickListener 时,它会与特定对象(例如 Textview、Button)连接

    find_beer.setOnClickListener 及以下代码在按下 someButton 时执行。

    android:onClick = "onClickFindBeer"用于直接在视图的Activity中处理点击而不需要实现任何接口

    【讨论】:

    • 你需要看他的第二个问题。他在问将调用哪个findViewById()。不是 Activity 和 View 是什么意思..!!
    • 正是......这就是我要问的......哪个类(活动或视图),findViewById()方法将被调用?
    【解决方案4】:
    1. 您已将 onClickBeer 方法分配给您的按钮。单击按钮时,对象(在本例中为按钮)将传递给您分配给它的方法。 Button 是一种 View 对象,因此您有一个更通用的 View 对象作为参数,但您完全可以将其转换为按钮对象。

    2. findViewById 通过“上下文”调用,这是获取系统资源的一种方式。您要求系统将特定对象返回给您,然后您可以使用该对象。值得一读上下文。

    希望能回答您的一些问题。

    【讨论】:

      【解决方案5】:

      根据上面的示例,android:onClick 方法是被调用的方法,因为在 java 类中调用 onclick 方法时,它需要调用 onClickListener

      原因是另一个问题。据我所知,它属于视图类,因为它总是引用您设计中的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多