为膨胀的RadioGroup创建onChangeListener

时间:2012-06-19 17:44:55

标签: android android-layout layout-inflater

我在XML中创建了一个RadioGroup布局。所以我动态创建它:

RadioGroup segmentRadioGroup = new RadioGroup(parentActivity);
inflater.inflate(R.layout.segm_btn_stores, segmentRadioGroup);           
segmentRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int i) {
            showMap();
        }
    });

哦,它不起作用! showMap没有被解雇!

但是......等等。如果我们这样做会怎么样?

RadioGroup segmentRadioGroup = (RadioGroup) inflater.inflate(R.layout.segm_btn_stores, null);

它......有效。为什么?在这两种情况下,segmentRadioGroup都是RadioGroup。如果我通过之前创建的segmentRadioGroup而不是null,那么它也无效。

2 个答案:

答案 0 :(得分:3)

RadioGroup segmentRadioGroup = new RadioGroup(parentActivity);

在上面一行中,您创建了一个“空”RadioGroup。然后...

inflater.inflate(R.layout.segm_btn_stores, segmentRadioGroup);

...在上面一行中,您从布局文件中膨胀了另一个RadioGroup,然后将其“添加”到第一个RadioGroup。这里的逻辑似乎是RadioGroup扩展(并且实际上是IS)LinearLayoutRadioGroup包含另一个RadioGroup是合法的。

segmentRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { ...});

最后,在上面的一行中,您将侦听器设置在外部/父RadioGroup上,而不是内部RadioGroup上。因此,永远不会为内部onCheckedChanged(...)调用RadioGroup方法。

嗯,这是我能想到的唯一逻辑。

用你的第二种方法......

RadioGroup segmentRadioGroup = (RadioGroup) inflater.inflate(R.layout.segm_btn_stores, null);

您只是在没有外部父布局的情况下对一个RadioGroup进行充气,因为您将'null'作为第二个参数传递。

答案 1 :(得分:0)

这应该有效:

RadioGroup segmentRadioGroup = inflater.inflate(R.layout.segm_btn_stores, null);           
segmentRadioGroup.setOnCheckedChangeListener(
      new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                showMap();
            }
      });
// add to the parent layout here..