Android 处理 DialogFragment 中的按钮点击

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12112061/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 09:46:15  来源:igfitidea点击:

handle button clicks in a DialogFragment

androidbuttonclickandroid-dialogfragment

提问by Sandra

I have Fragment that extends DialogFragment and I have a custom layout for it which contains two edittexts and two buttons - ok and cancel. My dialog displays just fine, using the onCreateView method for specifying the layout, but I don't know how to handle button clicks. Inside the onCreateView method, button.setOnClickListener doesn't work. This may have a simple solution, but I am stuck for several hours. I would very much appreciate an advice or example code.

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

P.S I don't want to use AlertDialog, because in this case when clicking on the ok button, the dialog automatically dismisses itself, and I can't do a validation on the edittext's (example: when the user presses ok button and the edittext's are empty I don't want the dialog to disappear). That is way I went with the option for creating a custom dialog and easily manage the buttons behavior.

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

采纳答案by nandeesh

Do along these lines

沿着这些路线做

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

回答by type-a1pha

This is the code for a Dialog I'm using (the actual GUI for the dialog is defined in the layout resource confirm_dialog.xml):

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

public class ConfirmDialog extends DialogFragment {

    public static String TAG = "Confirm Dialog";

    public interface ConfirmDialogCompliant {
        public void doOkConfirmClick();
        public void doCancelConfirmClick();
    }

    private ConfirmDialogCompliant caller;
    private String message;

    public ConfirmDialog(ConfirmDialogCompliant caller, String message){
        super();
        this.caller = caller;
        this.message = message;
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.confirm_dialog, container, false);
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        ((TextView) view.findViewById(R.id.textview_confirm)).setText(message);
        ((Button) view.findViewById(R.id.ok_confirm_button)).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // When button is clicked, call up to owning activity.
                caller.doOkConfirmClick();
            }
        });
        ((Button) view.findViewById(R.id.cancel_confirm_button)).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // When button is clicked, call up to owning activity.
                caller.doCancelConfirmClick();
            }
        });
        return view;
    }

}

The dialog is created with the following lines

该对话框是用以下几行创建的

confirm_dialog = new ConfirmDialog(this, message);
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG);

The interface definition is used to assure that the caller (Fragment or Activity) implements the methods to handle the events thrown by the controller. That is, a Fragment or Activity calling this dialog must implement the given interface.
Maybe there is a better solution but this is the one I figured out. Hope it helps!

接口定义用于确保调用者(Fragment 或 Activity)实现处理控制器抛出的事件的方法。也就是说,调用此对话框的 Fragment 或 Activity 必须实现给定的接口。
也许有更好的解决方案,但这是我想出的解决方案。希望能帮助到你!

回答by Gal Rom

here is an example to handel a cancel button click on a dialog from the FragmentDialog class:

这是一个在 FragmentDialog 类中单击对话框上的取消按钮的示例:

i used android.support.v4.app.DialogFragment;

我用 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;
    }





}

回答by Suragch

Another option is to let your custom DialogFragmentclass implement OnClickListener. Then you just setOnClickListenerfor whatever views you want to handle clicks on and catch the clicks in onClick.

另一种选择是让您的自定义DialogFragment类实现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;
        }
    }
}

回答by Sam

Its easy in activity but in DialogFragment we do some more codes.

它在活动中很容易,但在 DialogFragment 中我们做了更多的代码。

Inside the DialogFragment class do your rutin findView on onActivityCreatedmethod

在 DialogFragment 类中执行你的 rutin findView ononActivityCreated方法

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);

Implement onClick OnClickListener to your class

为您的类实现 onClick OnClickListener

public class CalendarPopUp extends DialogFragment implements View.OnClickListener

and do what you want inside onClick method, by doing these we activated the onClick events of our views

并在 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;
    }
}

and if you wonder how to pass values follow these step clike_here

如果您想知道如何传递值,请按照以下步骤 clike_here

回答by Peter

or

或者

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);