如何在显示时将数据传递给 Dialog Fragment

How to pass data to Dialog Fragment while It's showing

事实上,当您需要将参数传递给自定义对话框片段时,您会在实际使用它们之前将其捆绑。

示例:

class MyDFrag extends DialogFragment{

      //Empty Construct
      public MyDFrag(){}

      public static MyDFrag newInstance(){

          MyDFrag fragment = new MyDFrag();
          args = new Bundle();
          fragment.setArgument(args);

      }

}

这对大多数路径都非常有效,但前提是您在实际显示对话框片段之前传递此参数。

我的问题是我的对话框中有一个文本视图,当对话框当前正在显示时,我想在其父项 activity 发生某些事情时更改它的值。

显示对话框后传递参数不会影响此更改。

在我的 onCreate 中:

public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    textbox = (TextView) view.findViewById(R.id.textish);

    if(args.containsKey("status")){
        textbox.setText(getArguments().getString("status"));
    }

}

在对话框 class 中,我有一个设置文本视图值的 public 对话框,然后我会在某个时候在主 activity 中调用它。

public void setStatus(String value){
    args.putString("status", value);
}

所以当我准备好主 activity 时,我会调用

dialog.setStatus("ok");

这仅在我 运行 在显示对话框而不是在显示对话框之前编写代码时有效。有办法实现吗?

感谢建议,谢谢

public void setStatus(String value){

    if(textbox!=null){
        textbox.setText(value);
    }else{
        args.putString("status", value);
    }

}

我相信有几种方法可以做到这一点。 基本上,正如我所见,您想要的是能够向对话框异步发送一条消息,告知某些内容已更改并且 UI 需要更新。 我建议考虑使用 LocalBroadcastManager :https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

使用起来真的很简单 - 设置它的代码不多。你可以找到很多 如何使用它们的示例。 然后我会在创建或显示对话框时在对话框中设置一个接收器。 在您的父 activity 中,当您需要将更改通知对话框时,您将触发一条包含数据的消息。

根据您发布的内容,代码不会检测到 args 何时发生更改,因此它不会再次读取 args 来设置您的更改。

但是,如果您所做的只是再次从中读取一次,那么首先设置 args 是没有意义的,相反,我建议您直接在 setStatus 方法中设置文本,就像这样(无法将代码格式设置为出于某种原因正常工作):

public void setStatus(String value){ textbox.setText(value); }

请注意,面向用户的代码永远不应硬编码,而应使用字符串资源。