我通过编程方式使用RadioGroups和嵌套的RadioButtons。为某些行为创建和删除单选按钮。但是当我发起onCheckedChanged
事件时,问题就显露出来了。系统不会重置单选按钮计数器,即使在我移除了radioGroup中的所有单选按钮甚至删除RG之后也是如此。
当我试图捕获事件时发生这种冲突,例如检查特定的radioButton,但是我得到零点异常,因为单选按钮的索引(checkId)不等于实际状态。
我应该自己统计radioButtons并在onCheckedChanged事件中更正checkId吗?
看起来像拐杖。
这里有一些代码示例:
private static final String TAG = MainActivity.class.getSimpleName();
private RadioGroup rg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout ll = findViewById(R.id.someLL);
rg = new RadioGroup(this);
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
Log.d(TAG, "checked id: " + checkedId);
Log.d(TAG, "print text: " + ((RadioButton) group.getChildAt(checkedId)).getText() );
}
});
ll.addView(rg);
rebuildRG(Arrays.asList("one", "two", "three", "four", "five"));
rg.removeAllViews();
rebuildRG(Arrays.asList("111", "222", "333", "444"));
}
private void rebuildRG(List<String> data){
for(String i: data){
RadioButton rb = new RadioButton(this);
rb.setText(i);
rg.addView(rb);
}
}
Logcat:
D/MainActivity: checked id: 9
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.flexdecision.ak_lex.radiogroup, PID: 11604
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.RadioButton.getText()' on a null object reference
答案 0 :(得分:1)
您正在尝试使用checkedId
作为位置。请参阅下面的行。
((RadioButton) group.getChildAt(checkedId))
在回调中明确提到其ID
不是position
。见。
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//checkedId :- xml id of currently checked radio Button
}
和强>
getChildAt(int index) : - getChildAt()将索引作为参数而不是ID
解决方案
((RadioButton) group.findViewById(checkeId)).getText();
或者简单。
((RadioButton)findViewById(checkeId)).getText();