Button 和 RadioGroup 在引用上的区别

The difference between a Button and a RadioGroup in referencing

在 android Activity class 中,我看到桥接到 XML 文件的 Button 并且正在使用点击监听器的设置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;
        }
    }
}

但是至于引用 RadioGroup(在另一个 Activity class 中),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 相关或它也适用于其他对象?

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

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

编辑:

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

但是,似乎从中提取代码的教程中存在错误。