android - 在 Android 中的类之外创建 CustomDialog 的监听器

标签 android android-fragments android-dialog android-dialogfragment

我正在尝试创建扩展 DialogFragment 类的自定义对话框按钮的监听器,并且我想在自定义对话框 fragment 类中找到自定义按钮的监听器。但是,当我尝试调用 CustomDialog Fragment 的 View 时,我是得到空异常。我所做的是在其他地方创建自定义对话框 fragment 的新实例并说

customdialog.getView().findViewById(R.id.custombutton);

但我变得空了。

public class CustomDialog extends DialogFragment {

public  final int RES_NONE = -1;
private  TextViewCustomFont dialogTitle, view2, dialogBodyBottom,
        dialogBodyTop;
private  EditTextCustomFont dialogEditText;
private  ButtonCustomFont dialogLeftButton;
private ButtonCustomFont dialogRightButton;
private  Typeface GothamBold, GothamMedium, GothamUltra;
private static  int title1, bodyTop1, bodyBottom1, EditTextHint1,
        leftButton1, rightButton1;
onSubmitListener mListener;

private  Dialog dialog;

interface onSubmitListener {
    void setOnSubmitListener(String arg);
}

public static CustomDialog newInstance(int title, int bodyTop,
        int bodyBottom, int EditTextHint, int leftButton, int rightButton) {

    title1 = title;
    bodyTop1 = bodyTop;
    bodyBottom1 = bodyBottom;
    EditTextHint1 = EditTextHint;
    leftButton1 = leftButton;
    rightButton1 = rightButton;

    CustomDialog frag = new CustomDialog();



    return frag;
}

public ButtonCustomFont getDialogLeftButton() {
    return dialogLeftButton;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    dialog = new Dialog(getActivity());
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    //dialog.setContentView(R.layout.dialog_layout);
    //dialog.show();

    initLayout();

    return dialog;
}

private void initLayout(){
    dialog.setContentView(R.layout.dialog_layout);
    setDialogView();
    setCustomDialog();
}

public void setDialogView(){    

    //Create an java object of each dialog view item
    dialogTitle = (TextViewCustomFont) dialog.findViewById(R.id.custom_dialog_title);
    dialogBodyTop = (TextViewCustomFont) dialog.findViewById(R.id.custom_dialog_body_top);
    dialogBodyBottom = (TextViewCustomFont) dialog.findViewById(R.id.custom_dialog_body_bottom);
    dialogEditText = (EditTextCustomFont) dialog.findViewById(R.id.custom_dialog_body_et);
    dialogLeftButton = (ButtonCustomFont) dialog.findViewById(R.id.custom_dialog_body_btn_left);
    dialogRightButton = (ButtonCustomFont)  }

public class LoginSelectionFragment extends Fragment {


public static LoginSelectionFragment newInstance() {

    LoginSelectionFragment fragment = new LoginSelectionFragment();
    return fragment;
}

@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.fragment_loginselection,
            container, false);
}

我正在尝试拉取 CustomDialog Fragment 的dialogLeftButton 并在 LoginSelectionFragment 内为其设置监听器。

这是我添加方法 2 后的样子。这是 LoginSelectionFragment 的一部分

private void TwoButtonTextEditTextDialog(){
    String title = getResources().getString(R.string.invalid_info_header);
    String body = getResources().getString(R.string.invalid_info_body);
    String body2 = getResources().getString(R.string.hint_newemail);
    String btn1 = getResources().getString(R.string.cancel_uppercase);
    String btn2 = getResources().getString(R.string.ok_alert);

    fragmentDialog = CustomDialog.newInstance(title, body, body2, RES_NONE, btn1, btn2);
    fragmentDialog.setCustomDialogFragmentListener(mDialogClickListener);
    fragmentDialog.show(getFragmentManager(), "");
}

private  CustomDialog.CustomDialogFragmentListener mDialogClickListener = new CustomDialog.CustomDialogFragmentListener(){ 

    @Override
    public void onNegativeClick() {
    // TODO Auto-generated method stub
    fragmentDialog.dismiss();
    }

    @Override
    public void onPositiveClick() {
    // TODO Auto-generated method stub
    fragmentDialog.dismiss();
    }

};


@Override
public void onNegativeClick() {
    // TODO Auto-generated method stub

}

@Override
public void onPositiveClick() {
    // TODO Auto-generated method stub

}

最佳答案

您可以创建一个方法 setDialogBu​​ttonClickListener(CustomDialog.OnButtonClickListener clickListener); 其中 CustomDialog.OnButtonClickListener 是一个内部静态接口(interface),这样您就可以监听任何地方的按钮。

示例如下所示,

   public class CustomDialog extends DialogFragment {

       .....
     public static CustomDialog newInstance(int title, int bodyTop,
        int bodyBottom, int EditTextHint, int leftButton, int rightButton) {

        CustomDialog frag = new CustomDialog();
        Bundle args = new Bundle();
        args.putInt("title", title);
        ......
        frag.setArguments(args);
        return frag;
    }

...
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");

        return new AlertDialog.Builder(getActivity())
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle(title)
                .setPositiveButton(android.R.string.ok, this)
                .setNegativeButton(android.R.string.cancel, this)
                 ....
                .create();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (listener != null) {
            switch (which) {
            case DialogInterface.BUTTON_POSITIVE:
                listener.onRightButtonClick();
            default:
                listener.onLeftButtonClick();
            }
        }
    }

    ...
    private CustomDialog.OnButtonClickListener mClickListener;
    ....

    public void setDialogButtonClickListener(CustomDialog.OnButtonClickListener clickListener){
         mClickListener = clickListener;
    }

    ...
    public static interface OnButtonClickListener {
       public void onLeftButtonClick();
       public void onRightButtonClick();
    }
    }

如果您从我发布的上述示例中注意到,我除了解决您在按钮上设置点击监听器的问题之外,还向您介绍了 Android 上的工厂设计模式,您可以看到为按钮标题和对话框标题创建静态字段,我已将它们设置在 bundle 参数中,然后在对话框的 onCreate() 方法中检索它们。

更多Fragment最佳实践可以看here

编辑

好的,为了给您提供帮助,我向您提供了 LoginSelectionFragment 的外观。

public class LoginSelectionFragment extends Fragment implements CustomDialog.OnButtonClickListener {

    ......// Method 1
    public void showDialog(String title , String message .....) {
         CustomDialog dialog = CustomDialog.getInstance(title , message...);
         dialog.setDialogButtonClickListener(this);
         dialog.show(getSupportFragmentManager(), null);
    }

        public void onLeftButtonClick(){
    ...// do something on left button click of dialog
    }
               public void onRightButtonClick(){
    // do something on right button click of dialog
    ..
    }

    // Method 2
public void showDialog2(String title , String message .....) {
         CustomDialog dialog = CustomDialog.getInstance(title , message...);
         dialog.setDialogButtonClickListener(mDialogClickListener);
         dialog.show(getSupportFragmentManager(), null);
}

private final CustomDialog.OnButtonClickListener mDialogClickListener = new CustomDialog.OnButtonClickListener() {
  public void onLeftButtonClick(){
        ...// do something on left button click of dialog
        }
                   public void onRightButtonClick(){
        // do something on right button click of dialog
        ..
        }
}
    }

现在,如果您查看方法 1,我们已为 showDialog() 方法提供了参数,以便您可以重用它来显示多个有时使用不同的参数,即,当您想显示具有不同标题、消息等的相同对话框时,可以使用此方法

方法2中,我们提供了一个匿名内部类来处理点击事件,您可以使用尽可能多的匿名内部类,因为您有不同种类的对话框,即具有不同UI和不同事件监听器的对话框相同的 Activity/fragment 。

享受吧!

关于android - 在 Android 中的类之外创建 CustomDialog 的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26874538/

相关文章:

android - java.lang.NoSuchFieldError : No field $stable of type I in class

android - 如何在按钮顶部创建对话框

java - 如何调用 Button 元素的另一个 Activity/类 onClick() 中定义的方法?

android - 使 android 按钮的背景半透明,

android - 错误 :org. gradle.wrapper.WrapperExecutor.forProjectDirectory(Ljava/io/File;Ljava/lang/Appendable;)Lorg/gradle/wrapper/WrapperExecutor;

android - 如何使用 viewpager 从选项卡布局中的 recyclerview 重新加载 fragment ?

安卓 fragment 问题

android - AlertDialog show() 给出 WindowManager BadTokenException

Android:不确定的水平进度(对话框)栏

java - 显示经纬度的 map 标记