0

在一个 android Activity 类中,我看到了一个ButtonXML 文件的桥接,并且为单击侦听器设置它正在使用findViewById()

public class MyClass1 extends Activity implements OnClickListener {

    Button b;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.photo);

        b = (Button) findViewById(R.id.button1);    //This is where I have question
        b.setOnClickListener(this);
    }

    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:

            break;
        case R.id.button2:

            break;
        }
    }
}

但是至于引用 a RadioGroup(在另一个 Activity 类中),它并没有被指向 Object ,findViewById()因为它是Button

public class MyClass2 extends Activity implements OnCheckedChangeListener {

    RadioGroup rg;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.photo);

        //Why isn't this here? --> rg = (RadioGroup) findViewById(R.id.radiogroup);
        rg.setOnCheckedChangeListener(this);
    }

   @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        // TODO Auto-generated method stub
        switch (checkedId) {
        case R.id.rBad:

            break;
        case R.id.rGood:

            break;
        }
    }
}

我的意思是在onClick()onCheckedChanged()方法中都引用了对象的 id。

那么为什么b = (Button) findViewById(R.id.button1);在第一个代码片段中声明,而rg = (RadioGroup) findViewById(R.id.radiogroup);在第二个片段中没有。

它是否与其他对象相关RadioGroup或也适用于其他对象?

4

1 回答 1

2

RadioGroup 示例甚至不应该运行,因为从未分配 rg 变量,因此当您尝试设置 onCheckedChanged 侦听器时会创建 NullPointerException。本质上,Button 和 RadioGroup 类的使用应该没有区别,至少在这方面是这样。这更像是一个纯 Java 的东西,而不是 Android 特定的主题。

您可能偶然发现的是在 XML 代码中定义侦听器,如StackOverflow answer 中所示。然而,这并不直接适用于 onCheckedChanged 所以奇怪的是这里的情况是这样的......

编辑:

引自 Adam S:请注意,有一些视图注入库(例如 ButterKnife)可以避免这种情况,但您在此处的示例不包含任何所需的代码。

但是,从中获取代码的教程似乎有一个错误。

于 2015-06-06T13:36:10.887 回答