android:单选按钮内的单选按钮

时间:2014-05-30 08:09:43

标签: android android-radiogroup

我对Android很新,这是我的第一个应用程序,所以如果我的问题不明确请更正,我很乐意添加更多关于我想要实现的信息。 我有一个动态建立的无线电组。在这个广播组中,我希望有另一个广播组,这取决于从第一组中选择的单选按钮。 所以,让我们说我有一个项目的数组列表,对于每个项目,我有一些可用的大小(即:XS,S,L)。如果我检查单选按钮" XS",我希望有另一个无线电组,其中包含所选尺寸的可用颜色XS。 我构建它的方法是动态创建一个无线电组及其单选按钮。在方法onCheckedChanged()中,我调用方法createRadioButtonsForAvailableColors()。这个创建了具有所选尺寸的必要颜色的单选按钮,但是一旦我在上部单元组中检查另一个尺寸,可用于此尺寸的新颜色将添加到为之前选择的尺寸显示的颜色。 谢谢。 这是我的创建方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_product_details);

    sizesList = getSizes(getIDFromPreviousActivity());
    createRadioButtonsForAvailableSizes(sizesList);     
}

这是我为包含可用尺寸的单选按钮的广播组创建的:

// creates the radio buttons with the available sizes   
public void createRadioButtonsForAvailableSizes(ArrayList<String>  sizeList) {
    productDetailsLayout = (LinearLayout) findViewById(R.id.productDetailsLayout);
    RadioGroup rg = new RadioGroup(this);
    rg.setOrientation(RadioGroup.HORIZONTAL);


    int n = sizeList.size();
    final RadioButton[] rb = new RadioButton[n];
    for(int i=0; i< sizeList.size(); i++) {
        colorList = getColors(getIDFromPreviousActivity(),sizeList.get(i));

         rg.setOrientation(RadioGroup.HORIZONTAL);
         rb[i] = new RadioButton(this);
         rg.addView(rb[i]);
         rb[i].setText(sizesList.get(i).toString());
         rb[i].setId(getIDForRadioButton(sizesList.get(i).toString()));
         rb[i].setButtonDrawable(R.drawable.radiobuttonunchecked);
         rb[i].setOnCheckedChangeListener(this);

    }
    productDetailsLayout.addView(rg);
    productDetailsLayout.setPadding(50, 50, 50, 50);
}

这是颜色的创建(与尺寸相同):

// create radio buttons for available colors
public void createRadioButtonsForAvailableColors(ArrayList<String>  colorList) {

    Log.d("createRadioButtonsForAvailableColors","");
    productDetailsLayout = (LinearLayout) findViewById(R.id.productDetailsLayout);
    RadioGroup rg = new RadioGroup(this);
    rg.setOrientation(RadioGroup.HORIZONTAL);


    int n = colorList.size();
    final RadioButton[] rb = new RadioButton[n];
    for(int i=0; i< colorList.size(); i++) {
        Log.d("color"+i,colorList.get(i));
         rg.setOrientation(RadioGroup.HORIZONTAL);
         rb[i] = new RadioButton(this);
         rg.addView(rb[i]);
         rb[i].setText(colorList.get(i).toString());
         rb[i].setId(getIDForRadioButton(colorList.get(i).toString()));
         rb[i].setButtonDrawable(R.drawable.radiobuttonunchecked);

         rb[i].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override public void onCheckedChanged(CompoundButton button, boolean isChecked) {
                    button.setButtonDrawable(isChecked ? R.drawable.radiobuttonchecked : R.drawable.radiobuttonunchecked);
                }
         });

    }
    productDetailsLayout.addView(rg);
    productDetailsLayout.setPadding(50, 50, 50, 50);
}

这是我的onCheckedChange方法:

     @Override 
 public void onCheckedChanged(CompoundButton button, boolean isChecked) {
        button.setButtonDrawable(isChecked ? R.drawable.radiobuttonchecked : R.drawable.radiobuttonunchecked);
        String text = button.getText().toString();
        int productID = getIDFromPreviousActivity();
        ArrayList<String> colorList = getColors(productID, text);
        createRadioButtonsForAvailableColors(colorList);
    }

内部组是正确创建的,但在检查第一组中的一个大小时,它会正常构建子组单选按钮。如果我单击一个尺寸,它会显示可用的颜色。但是,在更改选中的尺寸时,显示当前所选尺寸颜色的按钮会添加到之前显示的按钮中,以选择上一个尺寸。如何取消第一次选择尺寸时创建的内部按钮,并仅显示当前所选尺寸的可用颜色?

我认为这可能不是构建它的正确方法。所以,我有两个问题:

  1. 通常,最好的方法是什么?由于我的内部无线电组取决于从第一组中选择的单选按钮,我假设应该在onCheckedChange()方法内调用内部组的创建。我应该从这里开始另一项活动,还是可以在一项活动中完成所有活动?
  2. 如果我的方法是正确的,您能否告诉我如何删除创建的内部单选按钮,以防主组中的单选按钮被更改?
  3. 谢谢

1 个答案:

答案 0 :(得分:0)

所以,如果我理解了这一点,那么当您更改尺寸单选按钮的值时会出现问题,这意味着颜色不会消失。

  1. 那么,Java就是很多关于电子设备的问题,并没有什么可说的(我可能会采取类似的方式)。

  2. 您可以在开始添加内容之前在createRadioButtonsForAvailableColors方法中添加此内容:

  3. productDetailsLayout.removeViews(0, productDetailsLayout.getChildCount());

    RemoveViews将从一个位置开始删除任意数量的子视图(因此我将其传递给0以及子项的总数)。