如何在显示时将数据传递给 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);
}
请注意,面向用户的代码永远不应硬编码,而应使用字符串资源。
事实上,当您需要将参数传递给自定义对话框片段时,您会在实际使用它们之前将其捆绑。
示例:
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);
}
请注意,面向用户的代码永远不应硬编码,而应使用字符串资源。