【问题标题】:RadioGroup onCheckChanged(RadioGroup radioGroup, int checkedId) not working correctly with dynamic formsRadioGroup onCheckChanged(RadioGroup radioGroup, int checkedId) 在动态表单中不能正常工作
【发布时间】:2015-09-10 18:31:55
【问题描述】:

Android 上的动态表单可能非常令人困惑,我遇到了这种特定情况,我通过 RadioGroupAppCompatRadioButtons 创建选项列表,其中 checkedId 与动态 RadioGroup 不相关:

String [] options = new String[] {"Option 1", "Option 2", "Option 3", "Option 4"};

 private void buildDynamicRadioGroup(){
    final LinearLayout linearLayout = new LinearLayout(MyActivity.class);
    final RadioGroup radioGroup = new RadioGroup(MyActivity.class);
    for(String option: options){
       final AppCompatRadioButton radioButton = new AppCompatRadioButton(MyActivity.class);
       radioButton.setText(option);
       radioGroup.addView(radioButton);
    }
    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
             Log.d("Checked Group Count", group.getChildCount()); // this is always 4
             Log.d("Option Id", checkedId); // this prints correctly the first time              
        }
    });
    linearLayout.addView(radioGroup);
 }

第一次调用 buildDynamicRadioGroup() 看起来不错,但是对方法的每次添加调用(即 n > 1)checkedId 反映了通过调用此方法构建的 AppCompatRadioButton 的总数,而不是有问题的RadioGroup 的实际checkedId...

例如:对方法的第二次调用打印 4,如果在 RadioButtons 的 2 组中选择了 2 项,则打印 6,因为有 6 个 AppCompatRadioButtons

任何人都知道如何处理这个问题,所以我只能在 RadioGroup 的上下文中得到 checkedId 吗?

【问题讨论】:

    标签: android radio-group


    【解决方案1】:

    就在今天,我遇到了同样的问题,并在寻找解决方案时发现了您的问题。唯一的区别是我从 XML 资源加载 RadioButtons

    对我来说,问题是所有单选按钮都有相同的 ID。在切换单选按钮的状态时,RadioGroup 正在使用这些 ID。

    我可以通过在将单选按钮添加到RadioGroup 之前更改单选按钮的 ID 来解决我的问题。因此,我只是添加一个随机的正 ID:

    private View createViewForButton(                                            
            final Context context,                                               
            final Option radioButton) {                                          
    
        final View view =                                                        
            getLayoutInflater(context).inflate(R.layout.form_radiobutton, null); 
    
        final RadioButton label = (RadioButton) view.findViewById(R.id.label_view);    
        label.setText(radioButton.getValue());                                   
    
        makeButtonWorkingInRadioGroup(view);                                     
    
        return view;                                                             
    }                                                                            
    
    private void makeButtonWorkingInRadioGroup(final View view) {                
        // The radio group requires all RadioButtons to have different IDs to    
        // work correctly. This wouldn't work else as we are loading all         
        // RadioButtons from the same XML file having the same ID definition.    
        view.setId(View.generateViewId());                                                  
    }                                                                            
    

    确保您设置的 ID 为正数。如果 ID 为负数,它也不起作用。

    【讨论】:

    • 哇,这是我的第二个猜测,我忘了发布。但是当我们这样做时,我们重叠的可能性很小。我这样做:int id = 12345; for (String option : options) { ... radioButton.setText(option); radio.setId(id + 1); id += 1; ...
    • 一般来说:可以生成 2^31 个可能的值。当您有四个单选按钮(例如)时,碰撞概率约为 6 * 2^-31,小于 8 * 2^-31 = 2^-29。因为您的算法在真实硬件上运行,您必须将其与那里产生的错误概率(翻转位等)进行比较。这个概率要高得多,你不必关心以这种方式产生的碰撞。我知道当你开始随机算法时很难习惯这种计算,但这就是现实。
    • 在特殊情况下:我也停止使用 Random。 View 有一个特殊的静态方法来生成 viewId,在这里可以很好地使用它:View.generateViewId()。
    • 我每天都学到新东西。我一直使用我的方法,但这更容易。
    猜你喜欢
    • 2017-05-16
    • 2018-06-05
    • 2012-06-25
    • 2012-05-03
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多