处理DialogFragment中的按钮单击

San*_*dra 10 android buttonclick android-dialogfragment

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

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

typ*_*pha 9

这是我正在使用的Dialog的代码(对话框的实际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;
    }

}
Run Code Online (Sandbox Code Playgroud)

使用以下行创建对话框

confirm_dialog = new ConfirmDialog(this, message);
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG);
Run Code Online (Sandbox Code Playgroud)

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

  • 在重新实例化片段之后(在配置更改后或在后台销毁之后),当您点击一个按钮时,这将与NPE崩溃.当片段管理器重新创建片段时,将调用默认构造函数. (4认同)

Gal*_*Rom 8

这是一个例子,来自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;
    }





}
Run Code Online (Sandbox Code Playgroud)


nan*_*esh 6

沿着这些路线

Dialog dl = mDialogFragment.getDialog();
Button btn = dl.findViewById(R.id.btn);
btn.setOnClickListener(this);
Run Code Online (Sandbox Code Playgroud)

  • `getDialog()` 返回 null! (3认同)
  • 感谢你。我已经找到了这样的解决方案。buttonOk.setOnClickListener(new View.OnClickListener(){@Override public void onClick(View view){}}}); 但也许您的解决方案也可以。反正! (2认同)

Sur*_*gch 6

另一个选择是让您的自定义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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)