RadioGroup checkedId(或getCheckedRadioButtonId())工作不正确

时间:2017-12-22 13:10:11

标签: java android radio-button radio-group

我通过编程方式使用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

1 个答案:

答案 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();