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)可以避免这种情况,但是您在此处的示例不包含为此所需的任何代码。
但是,似乎从中提取代码的教程中存在错误。
在 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)可以避免这种情况,但是您在此处的示例不包含为此所需的任何代码。
但是,似乎从中提取代码的教程中存在错误。