• <legend id='TQBmk'><style id='TQBmk'><dir id='TQBmk'><q id='TQBmk'></q></dir></style></legend>
  • <i id='TQBmk'><tr id='TQBmk'><dt id='TQBmk'><q id='TQBmk'><span id='TQBmk'><b id='TQBmk'><form id='TQBmk'><ins id='TQBmk'></ins><ul id='TQBmk'></ul><sub id='TQBmk'></sub></form><legend id='TQBmk'></legend><bdo id='TQBmk'><pre id='TQBmk'><center id='TQBmk'></center></pre></bdo></b><th id='TQBmk'></th></span></q></dt></tr></i><div id='TQBmk'><tfoot id='TQBmk'></tfoot><dl id='TQBmk'><fieldset id='TQBmk'></fieldset></dl></div>
      <bdo id='TQBmk'></bdo><ul id='TQBmk'></ul>

    1. <tfoot id='TQBmk'></tfoot>

        <small id='TQBmk'></small><noframes id='TQBmk'>

      1. 方向更改时的 DialogFragment 回调

        时间:2023-08-28
        <tfoot id='HjonV'></tfoot>

        <small id='HjonV'></small><noframes id='HjonV'>

      2. <legend id='HjonV'><style id='HjonV'><dir id='HjonV'><q id='HjonV'></q></dir></style></legend>

        <i id='HjonV'><tr id='HjonV'><dt id='HjonV'><q id='HjonV'><span id='HjonV'><b id='HjonV'><form id='HjonV'><ins id='HjonV'></ins><ul id='HjonV'></ul><sub id='HjonV'></sub></form><legend id='HjonV'></legend><bdo id='HjonV'><pre id='HjonV'><center id='HjonV'></center></pre></bdo></b><th id='HjonV'></th></span></q></dt></tr></i><div id='HjonV'><tfoot id='HjonV'></tfoot><dl id='HjonV'><fieldset id='HjonV'></fieldset></dl></div>
          <tbody id='HjonV'></tbody>
          <bdo id='HjonV'></bdo><ul id='HjonV'></ul>
                • 本文介绍了方向更改时的 DialogFragment 回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我正在迁移当前使用 Activity.showDialog(DIALOG_ID); 的对话框,以使用 android参考.

                  I'm migrating my dialogs, currently using Activity.showDialog(DIALOG_ID);, to use the DialogFragment system as discussed in the android reference.

                  在我的开发过程中,使用回调将某些事件传递回打开对话框的活动/片段时出现了一个问题:

                  There's a question that arose during my development when using callbacks to deliver some event back to the activity/fragment that opened the dialog:

                  这是一个简单对话框的示例代码:

                  Here's some example code of a simple dialog:

                  public class DialogTest extends DialogFragment {
                  
                  public interface DialogTestListener {
                      public void onDialogPositiveClick(DialogFragment dialog);
                  }
                  
                  // Use this instance of the interface to deliver action events
                  static DialogTestListener mListener;
                  
                  public static DialogTest newInstance(Activity activity, int titleId, int messageId) {
                      udateListener(activity);
                      DialogTest frag = new DialogTest();
                      Bundle args = new Bundle();
                      args.putInt("titleId", titleId);
                      args.putInt("messageId", messageId);
                      frag.setArguments(args);
                      return frag;
                  }
                  
                  public static void udateListener(Activity activity) {
                      try {
                          // Instantiate the NoticeDialogListener so we can send events with it
                          mListener = (DialogTestListener) activity;
                      } catch (ClassCastException e) {
                          // The activity doesn't implement the interface, throw exception
                          throw new ClassCastException(activity.toString() + " must implement DialogTestListener");
                      }
                  }
                  
                  
                  @Override
                  public Dialog onCreateDialog(Bundle savedInstanceState) {
                      int titleId = getArguments().getInt("titleId");
                      int messageId = getArguments().getInt("messageId");
                  
                      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                      // dialog title
                      builder.setTitle(titleId);
                      // dialog message
                      builder.setMessage(messageId);
                  
                      // dialog negative button
                      builder.setNegativeButton("No", new OnClickListener() {
                                 public void onClick(DialogInterface dialog, int id) {}});
                      // dialog positive button
                      builder.setPositiveButton("Yes", new OnClickListener() {
                          public void onClick(DialogInterface dialog, int id) {
                              mListener.onDialogPositiveClick(DialogTest.this);
                          }});
                  
                      // create the Dialog object and return it
                      return builder.create();
                  }}
                  

                  下面是一些调用它的活动代码:

                  And here's some activity code calling it:

                  public class SomeActivity extends FragmentActivity implements DialogTestListener {
                  private EditText mUserName;
                  @Override
                  public void onCreate(Bundle savedInstanceState) {
                      // setup ui
                      super.onCreate(savedInstanceState);
                      setContentView(R.layout.ui_user_edit);
                      // name input
                      mUserName = (EditText) findViewById(R.id.userEdit_editTextName);
                  }
                  
                  @Override
                  public void onDialogPositiveClick(DialogFragment dialog) {
                      Log.d(TAG, this.toString());
                      mUserName.setText(mUserName.getText() + "1");
                  }
                  
                  private void showDialog() {
                      DialogTest test = DialogTest.newInstance(SomeActivity.this, R.string.someTitleText, R.string.someMessageText);
                      test.show(getSupportFragmentManager(), "testDialog");
                  }}
                  

                  代码几乎就是您所看到的参考.问题是,一旦您进行方向更改,当显示对话框时,它会按预期停止工作-->由于活动生命周期,活动和对话框都被重建,对话框现在没有正确的引用新的重建活动.

                  The code is pretty much what you see the reference. Problem is, that once you do a orientation change, when a dialog is shown, it stops working as expected --> Due to the activity lifecycle, both, the activity and the dialog are rebuild, and the dialog now does not have the proper reference to the new rebuilt activity.

                  我在我的活动 onResume 方法中添加了以下代码:

                  I added the following code to my activitys onResume method:

                      @Override
                  protected void onResume() {
                      super.onResume();
                      DialogTest.udateListener(this);
                  }
                  

                  这样做,我得到了预期的行为,当方向改变发生时,对话框将事件发送回新的重建活动.

                  Doing this, I get the expected behavior, and the dialog sends events back to the new rebuilt activity when an orientation change occured.

                  我的问题是:处理在方向更改期间由 FragmentActivity 打开的 DialogFragment 之间的回调的最佳实践"是什么?

                  My question is: What is the 'best practice' to handle the callbacks between the DialogFragment which was opened by a FragmentActivity during an orientation change?

                  最好的问候

                  推荐答案

                  是的,这是我自己一直陷入的常见陷阱.首先让我说,您在 onResume() 中调用 DialogTest.udateListener() 的解决方案似乎完全适合我.

                  Yeah, this is a common trap I'm falling in all the time myself. First of all let me say that your solution of calling DialogTest.udateListener() in onResume() seems to be fully appropriate to me.

                  另一种方法是使用 ResultReceiver,它可以序列化为 Parcelable:

                  An alternative way would be to use a ResultReceiver which can be serialized as a Parcelable:

                  public class DialogTest extends DialogFragment {
                  
                  public static DialogTest newInstance(ResultReceiver receiver, int titleId, int messageId) {
                      DialogTest frag = new DialogTest();
                      Bundle args = new Bundle();
                      args.putParcelable("receiver", receiver);
                      args.putInt("titleId", titleId);
                      args.putInt("messageId", messageId);
                      frag.setArguments(args);
                      return frag;
                  }
                  
                  @Override
                  public Dialog onCreateDialog(Bundle savedInstanceState) {
                      int titleId = getArguments().getInt("titleId");
                      int messageId = getArguments().getInt("messageId");
                      ResultReceiver receiver = getArguments().getParcelable("receiver");
                  
                      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                      // dialog title
                      builder.setTitle(titleId);
                      // dialog message
                      builder.setMessage(messageId);
                  
                      // dialog negative button
                      builder.setNegativeButton("No", new OnClickListener() {
                          public void onClick(DialogInterface dialog, int id) {
                              receiver.sendResult(Activity.RESULT_CANCEL, null);
                          }});
                      // dialog positive button
                      builder.setPositiveButton("Yes", new OnClickListener() {
                          public void onClick(DialogInterface dialog, int id) {
                              receiver.sendResult(Activity.RESULT_OK, null);
                          }});
                  
                      // create the Dialog object and return it
                      return builder.create();
                  }}
                  

                  然后您可以像这样处理 Receiver 中的所有内容:

                  Then you can handle everything in the Receiver like this:

                  protected void onReceiveResult(int resultCode, Bundle resultData) {
                      if (getActivity() != null){
                          // Handle result
                      }
                  }
                  

                  查看 ResultReceiver 无法适应屏幕旋转了解更多详情.所以最后你可能仍然需要用你的 Activity 重新连接 ResultReceiver.唯一的区别是您将 ActivityDialogFragment 解耦.

                  Check out ResultReceiver doesn't survire to screen rotation for more details. So in the end you probably still need to rewire the ResultReceiver with your Activity. The only difference is that you decouple the Activity from the DialogFragment.

                  这篇关于方向更改时的 DialogFragment 回调的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:在活动之上创建一个透明对话框 下一篇:活动作为android中的对话框

                  相关文章

                  最新文章

                  <legend id='GodVg'><style id='GodVg'><dir id='GodVg'><q id='GodVg'></q></dir></style></legend>
                • <small id='GodVg'></small><noframes id='GodVg'>

                • <i id='GodVg'><tr id='GodVg'><dt id='GodVg'><q id='GodVg'><span id='GodVg'><b id='GodVg'><form id='GodVg'><ins id='GodVg'></ins><ul id='GodVg'></ul><sub id='GodVg'></sub></form><legend id='GodVg'></legend><bdo id='GodVg'><pre id='GodVg'><center id='GodVg'></center></pre></bdo></b><th id='GodVg'></th></span></q></dt></tr></i><div id='GodVg'><tfoot id='GodVg'></tfoot><dl id='GodVg'><fieldset id='GodVg'></fieldset></dl></div>
                    • <bdo id='GodVg'></bdo><ul id='GodVg'></ul>

                      <tfoot id='GodVg'></tfoot>