Android 在对话框片段中单击句柄按钮

Android 在对话框片段中单击句柄按钮,android,buttonclick,android-dialogfragment,Android,Buttonclick,Android Dialogfragment,我有一个扩展DialogFragment的片段,我有一个自定义布局,其中包含两个EditText和两个按钮-ok和cancel。我的对话框显示得很好,使用onCreateView方法指定布局,但我不知道如何处理按钮单击。在onCreateView方法中,button.setOnClickListener不工作。这可能有一个简单的解决方案,但我被困了几个小时。我将非常感谢您的建议或示例代码 另外,我不想使用AlertDialog,因为在这种情况下,当点击ok按钮时,对话框会自动关闭,我无法对edi

我有一个扩展DialogFragment的片段,我有一个自定义布局,其中包含两个EditText和两个按钮-ok和cancel。我的对话框显示得很好,使用onCreateView方法指定布局,但我不知道如何处理按钮单击。在onCreateView方法中,button.setOnClickListener不工作。这可能有一个简单的解决方案,但我被困了几个小时。我将非常感谢您的建议或示例代码

另外,我不想使用AlertDialog,因为在这种情况下,当点击ok按钮时,对话框会自动关闭,我无法对edittext进行验证(例如:当用户按下ok按钮,edittext为空时,我不希望对话框消失)。这就是我选择创建自定义对话框并轻松管理按钮行为的方法。

按照这些方法操作

Dialog dl = mDialogFragment.getDialog();
Button btn = dl.findViewById(R.id.btn);
btn.setOnClickListener(this);

这是我正在使用的对话框的代码(对话框的实际GUI在布局资源confirm_Dialog.xml中定义):

将使用以下行创建该对话框

confirm_dialog = new ConfirmDialog(this, message);
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG);
接口定义用于确保调用方(片段或活动)实现处理控制器抛出的事件的方法。也就是说,调用此对话框的片段或活动必须实现给定的接口。

也许有更好的解决办法,但这就是我想出来的。希望有帮助

以下是从FragmentDialog类中点击对话框的取消按钮的示例:

我使用了android.support.v4.app.DialogFragment

public class MyDialogFragment extends DialogFragment { 
    public MyDialogFragment(){}     
    public static String TAG = "info Dialog";
    Button btn;   
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.info_layout, container);
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        btn=(Button)view.findViewById(R.id.close_dialog_btn_info_layout);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                getDialog().dismiss();
            }
        });

        return view;
    }





}

另一个选项是让自定义的
对话框片段
类实现
OnClickListener
。然后,您只需
setOnClickListener
来处理要单击的任何视图,并在
onClick
中捕捉单击

// 1. implement OnClickListener
public class MyDialogFragment extends DialogFragment implements View.OnClickListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.my_dialog_layout, null);

        // 2. set click listeners on desired views 
        view.findViewById(R.id.my_view_1).setOnClickListener(this);
        view.findViewById(R.id.my_view_2).setOnClickListener(this);


        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setView(view)
                // ...
        return builder.create();
    }   

    // 3. capture the clicks and respond depending on which view
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.my_view_1:
                // do something
                break;
            case R.id.my_view_2:
                // do something
                break;
            default:
                break;
        }
    }
}

这在活动中很容易,但在DialogFragment中,我们会编写更多的代码

在DialogFragment类中,在ActivityCreated方法上查看rutin findView

btn_ocak = (Button) view.findViewById(R.id.btn_cal_ocak);
    btn_subat = (Button) view.findViewById(R.id.btn_cal_subat);
    btn_mart = (Button) view.findViewById(R.id.btn_cal_mart);
    btn_nisan = (Button) view.findViewById(R.id.btn_cal_nisan);


 btn_ocak.setOnClickListener(this);
    btn_subat.setOnClickListener(this);
    btn_mart.setOnClickListener(this);
    btn_nisan.setOnClickListener(this);
在类中实现onClick-OnClickListener

public class CalendarPopUp extends DialogFragment implements View.OnClickListener
在onClick方法中执行您想要的操作,通过执行这些操作,我们激活了视图的onClick事件

   @Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.btn_cal_ocak:
            seciliAy = "Ocak";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_subat:
            seciliAy = "Subat";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_mart:
            seciliAy = "Mart";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_nisan:
            seciliAy = "Nisan";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_mayis:
            seciliAy = "Mayıs";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_haziran:
            seciliAy = "Haziran";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_temmuz:
            seciliAy = "Temmuz";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_agustos:
            seciliAy = "Agustos";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_eylul:
            seciliAy = "Eylül";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_ekim:
            seciliAy = "Ekim";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_kasim:
            seciliAy = "Kasım";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        case R.id.btn_cal_aralik:
            seciliAy = "Aralık";
            setMonthOnShare(seciliAy);
            mCallback.onSelectedData(seciliAy);
            dismiss();
            break;
        default:
            break;
    }
}
如果您想知道如何传递值,请遵循以下步骤 或

class MyDialog extends DialogFragment {
   public View.OnClickListener onButtonOk;
   public EditText edit_text;

   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
       LayoutInflater li = LayoutInflater.from(builder.getContext());
       View view = li.inflate(R.layout.custom_dialog, null);
       Button buttonOK = view.findViewById(R.id.button_ok);
       edit_text = view.findViewById(R.id.edit_text);
       buttonOk.setOnClickListener(onButtonOk);
       builder.setView(view);

       return builder.create();
   }

}


// use
final MyDialog dialog=new MyDialog();
dialog.onButtonOk=new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(v.getContext(), dialog.edit_text.getText(), Toast.LENGTH_SHORT).show();
    }
};
dialog.show(getSupportFragmentManager(),null);

谢谢你。我已经找到了这样的解决方案。buttonOk.setOnClickListener(新视图.OnClickListener(){@Override public void onClick(视图视图){}});但也许你的解决方案也能奏效。反正是Thx
getDialog()
返回空值!这样设置onClickListener对我不起作用。它给了我错误。我找到了解决问题的方法,并将其作为对第一个答案的评论。不管怎样,谢谢您的回复。如果您从xml资源中扩展布局,这是有效的。如果您是以编程方式创建布局,那么在按钮引用上就有了ta调用setOnClickListener。我遇到的问题是:myButton.setOnClickListener(新OnClickListener(){}给了我错误,所以解决方案是使用myButton.setOnClickListener(新视图.OnClickListener(){}.我不知道为什么它没有以这种方式识别我的侦听器,但它确实识别了..这是我想到的同一个解决方案,但我犹豫是否采用这种方式,因为片段应该有默认构造函数。此外,我不知道如何将接口设为“调用者”在Args Bundle中。你知道吗?当你的片段被重新实例化(例如在配置更改后或在后台被销毁)并且你点击一个按钮后,这将与NPE一起崩溃。当片段管理器重新创建片段时,会调用默认构造函数。
class MyDialog extends DialogFragment {
   public View.OnClickListener onButtonOk;
   public EditText edit_text;

   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
       LayoutInflater li = LayoutInflater.from(builder.getContext());
       View view = li.inflate(R.layout.custom_dialog, null);
       Button buttonOK = view.findViewById(R.id.button_ok);
       edit_text = view.findViewById(R.id.edit_text);
       buttonOk.setOnClickListener(onButtonOk);
       builder.setView(view);

       return builder.create();
   }

}


// use
final MyDialog dialog=new MyDialog();
dialog.onButtonOk=new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(v.getContext(), dialog.edit_text.getText(), Toast.LENGTH_SHORT).show();
    }
};
dialog.show(getSupportFragmentManager(),null);