【问题标题】:Communicate between fragment and fragment dialog在片段和片段对话框之间进行通信
【发布时间】:2014-10-21 09:51:14
【问题描述】:

我研究了关于片段和片段对话框之间通信的 SO,我发现 setTargetFragment 和接口是一种方法。但是当我尝试 setTargetFragment 时出现此错误。

Fragment 类型中的方法 setTargetFragment(Fragment, int) 不适用于参数 (SettingsDetailsFragment, int)。直到现在我还没有使用片段,而且我是 android 的新手。 所以我有这个片段:

   public class SettingsDetailsFragment extends Fragment implements
        NoticeDialogFragment.EmailChangedListner {

        public void emailUpdateFromDialog()
        {
         DialogFragment modifyEmailFragment = new ModifyEmailFragment();
        //here is where i get the error
        modifyEmailFragment.setTargetFragment(this, 0);`enter code here`

        modifyEmailFragment.show(getActivity().getFragmentManager(),
            "email");
  }
}

  // class where i have the interface
  public class NoticeDialogFragment extends DialogFragment {
    public interface EmailChangedListner {
    public void emailChanged(String text);
  }

}

 // the dialogFragment
 public class ModifyEmailFragment extends DialogFragment {

   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    final View v_iew = inflater.inflate(R.layout.email_dialog, null);

    builder.setView(v_iew)

            // Add action buttons
            .setPositiveButton(R.string.modifyBtn_settings,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {

                            EditText userEmail = (EditText) v_iew
                                    .findViewById(R.id.modifyEmail);
                            boolean validateEmail = BookMeUtils
                                    .validateEmail(userEmail.getText()
                                            .toString());

                            if (validateEmail == false) {
                                BookMeUtils.enterValidEmail(getActivity());
                            }

                            if (!(userEmail.getText().toString().length() == 0)) {

                                if (validateEmail == true) {
                                    Fragment parentFragment = getTargetFragment();
                                    ((EmailChangedListner) parentFragment)
                                            .emailChanged(userEmail
                                                    .getText().toString());
                                }
                            } else {

                            }
                        }
                    })
            .setNegativeButton(R.string.cancel_r,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            ModifyEmailFragment.this.getDialog().cancel();
                        }
                    });

    return builder.create();
}

}

【问题讨论】:

    标签: android dialog fragment communication


    【解决方案1】:

    您的片段将设置监听器并实现 EmailChangedListner :

    public class SettingsDetailsFragment extends Fragment implements
                EmailChangedListner {
    
                public void emailUpdateFromDialog()
                {
                 DialogFragment modifyEmailFragment = new ModifyEmailFragment();        
                modifyEmailFragment.setListener(SettingsDetailsFragment.this);
    
                modifyEmailFragment.show(getActivity().getFragmentManager(),
                    "email");
                }
           }
    

    Dialog Fragment 将具有接口和侦听器对象:

    // the dialogFragment
     public class ModifyEmailFragment extends DialogFragment {
    
       EmailChangedListner listener;
    
       public void setListener(EmailChangedListner listener) {
            this.listener = listener;
       }
    
       @Override
       public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    
        // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();
    
        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        final View v_iew = inflater.inflate(R.layout.email_dialog, null);
    
        builder.setView(v_iew)
    
                // Add action buttons
                .setPositiveButton(R.string.modifyBtn_settings,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int id) {
    
                                EditText userEmail = (EditText) v_iew
                                        .findViewById(R.id.modifyEmail);
                                boolean validateEmail = BookMeUtils
                                        .validateEmail(userEmail.getText()
                                                .toString());
    
                                if (validateEmail == false) {
                                    BookMeUtils.enterValidEmail(getActivity());
                                }
    
                                if (!(userEmail.getText().toString().length() == 0)) {
    
                                    if (validateEmail == true) {
                                        Fragment parentFragment = getTargetFragment();
                                        listener.emailChanged(userEmail
                                                        .getText().toString());
                                    }
                                } else {
    
                                }
                            }
                        })
                .setNegativeButton(R.string.cancel_r,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                ModifyEmailFragment.this.getDialog().cancel();
                            }
                        });
    
        return builder.create();
       }
    
    
      public interface EmailChangedListner {
        public void emailChanged(String text);
      }
    
    }
    

    【讨论】:

    • 好的,我明白了,但我在我的 dialogFragment EmailChangedListner 监听器中进行了修改; public void setListener(EmailChangedListner listener) { this.listener = listener; } 带有 SettingsDetailsFragment 监听器; public void setListener(SettingsDetailsFragment listener) { this.listener = listener;并添加了 ((EmailChangedListner) listener) .emailChanged(userEmail .getText().toString());
    【解决方案2】:

    检查Fragment 在您的SettingsDetailsFragment 类中的导入。是导入android.support.v4.app.Fragment还是android.app.Fragment

    可能是您将android.support.v4.appFragment 设置为android.app 的DialogFragment 的目标。

    【讨论】:

    • 好的,我尝试使用 android.app 进行修改,现在我可以使用 setTargetFragment 但我在其他类中有其他问题...我有一个适配器,当我调用 settingsDetailsFragment 现在想要返回 Fragment 不返回SettingsDetailsFragment.newInstance(position);
    • 但是我设法用下面的答案解决了这个问题但是感谢您的提示,我不知道这是 android.support.v4.app 和 android.app.fragment 之间的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多