【问题标题】:RadioButton Listener inside a DialogFragmentDialogFragment 中的 RadioButton 侦听器
【发布时间】:2013-09-27 08:02:45
【问题描述】:

我尝试实现 RadioGroup 视图并将其放入 DialogFragment 中,但出现了问题。我已经按照本教程进行操作

http://developer.android.com/guide/topics/ui/controls/radiobutton.html

而是Activity,view是在DialogFragment中初始化的:

public class MenuDialog extends DialogFragment {

    public MenuDialog(){}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.menu_layout, container);
        this.getDialog().setTitle("title");
        return view;
    }

public void onRadioButtonClicked(View view) {
    boolean checked = ((RadioButton) view).isChecked();
    switch(view.getId()) {
    case R.id.radio1:
        if(checked) {
            Log.i("MENU", ((RadioButton)view).getText());
        }
        break;
    case R.id.radio2:
        if(checked) {
            Log.i("MENU", ((RadioButton)view).getText());
        }
        break;
    case R.id.radio3:
        if(checked) {
            Log.i("MENU", ((RadioButton)view).getText());
        }
        break;
    case R.id.radio4:
        if(checked) {
            Log.i("MENU", ((RadioButton)view).getText());
        }
        break;
    }
    this.getDialog().dismiss();
}

}

xml:

<?xml version="1.0" encoding="utf-8"?>

<RadioGroup
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/radio_group" >

    <RadioButton
        android:id="@+id/radio1"
        android:text="20" />

    <RadioButton
        android:id="@+id/radio2"
        android:text="40" />

    <RadioButton
        android:id="@+id/radio3"
        android:text="60" />

    <RadioButton
        android:id="@+id/radio4"
        android:text="80" />
</RadioGroup>

onRadioButtonClicked 监听器它的实现方式与教程相同。现在,当启动对话框时,如果我点击一个单选按钮,我会收到此错误:

09-27 09:41:08.018: E/AndroidRuntime(7447): FATAL EXCEPTION: main
09-27 09:41:08.018: E/AndroidRuntime(7447): java.lang.IllegalStateException: Could not
 find a method onRadioButtonClicked(View) in the activity class 
android.view.ContextThemeWrapper for onClick handler on view class 
android.widget.RadioButton with id 'radio1'

怎么了?

【问题讨论】:

  • 那么监听器是怎么实现的,问题是监听器没有找到,请贴出你的监听器和xml
  • 帖子修改时缺少代码

标签: android radio-button listener


【解决方案1】:

我宁愿在片段内部实现点击处理程序并动态添加侦听器(通过 java 而不是 XML)。 所以我会做这样的事情:

public class MenuDialog extends DialogFragment implements OnClickListener{
[...]    
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.menu_layout, container);
    view.findViewById(R.id.radio1).setOnClickListener(this);
    view.findViewById(R.id.radio2).setOnClickListener(this);
    //and so on [...]
    this.getDialog().setTitle("title");
    return view;
}

@Override
public void onClick(View v){
    [...]
}

【讨论】:

  • 或者使用 OnCheckedChangeListener 代替 OnClickListener
【解决方案2】:

问题是,如果您在 xml 文件中为任何 View 指定 onClick 回调属性,它应该位于 Activity 代码中,而不是片段代码中

【讨论】:

  • 所以我需要修改onCreateView代码并手动添加监听器?
  • 如果你想直接从片段中关联 onClick 回调和视图,是的,你应该从片段的onCreateView() 设置 OnClickListener
【解决方案3】:

你需要把听众和广播组联系起来,你可以这样做

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.menu_layout, container);
    this.getDialog().setTitle("title");
    view.findViewById(R.id.radio_group).setOnCheckedChangeListener(...);
    return view;
}

【讨论】:

    【解决方案4】:

    为您的片段实现 RadioButton.OnCheckedChangeListener。 setOnCheckedChangeListener 根据您的单选按钮。

    public class MenuDialog extends DialogFragment implements RadioButton.OnCheckedChangeListener{
    
    //..
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.menu_layout, container);
        this.getDialog().setTitle("title");
    
        ((RadioButton)view.findViewById(R.id.radio1)).setOnCheckedChangeListener(this);
        ((RadioButton)view.findViewById(R.id.radio2)).setOnCheckedChangeListener(this);
        // and so on
    
        return view;
    }
    
    @Override
    public void onCheckedChanged(CompoundButton v, boolean checked) {
        switch(v.getId()) {
            case R.id.radio1: 
                // todo
                break;
            case R.id.radio2: 
                // todo
                break;
            // and so on.. 
        }
        this.getDialog().dismiss();
    }
    

    顺便说一句,按照http://developer.android.com/guide/topics/ui/controls/radiobutton.html 的说明,删除片段中的 onRadioButtonClicked() 和 xml 中 RadioButton 的“android:onClick="onRadioButtonClicked"”

    【讨论】:

      【解决方案5】:

      也许我有点晚了,但发现了这个解决方案。适用于 API 23

      YourDialogFragment.kt

      override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
          return requireActivity().let {
              AlertDialog.Builder(it)
                  .setTitle("Your title here")
                  .setSingleChoiceItems(
                     R.array.answersStringAray, // resource in res/values/arrays.xml
                     1, // value of choosed item in array above 
                     clickListener // Implements DialogInterface.OnClickListener
                  )
                  .setNegativeButton(R.string.cancel, clickListener)
                  .create()
          }
      }
      

      YourViewModel.kt

      class YourViewModel : ViewModel(), DialogInterface.OnClickListener {
      
          override fun onClick(dialog: DialogInterface?, which: Int) {
              when (which) {
                  DialogInterface.BUTTON_POSITIVE -> {}
                  DialogInterface.BUTTON_NEGATIVE -> {}
                  DialogInterface.BUTTON_NEUTRAL -> {}
                  0 -> {} // all your answers would be non-negative
                  1 -> {}
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        • 2014-02-15
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        相关资源
        最近更新 更多