我正在使用Tabhost和Fragments构建一个带有标签布局的Android应用程序。
在其中一个标签(片段)中,我有一个textview,显示一个String变量的值。这个选项卡还有一个调用DialogFragment的按钮,我可以通过EditText框编辑所述字符串的值。
这一切都按预期工作,除了一个小故障:一旦DialogFragment被解除并且选项卡再次获得焦点,textview文本不会自动刷新。要刷新它我需要更改选项卡并返回。
是否有可以添加的指令,以便在解除DialogFragment时,重新加载/刷新其父活动?
提前致谢。
编辑:仍在寻找解决方案,无法弄清楚如何使用DialogFragment.isdetached
答案 0 :(得分:9)
要设置关键字,可以通过处理程序机制完成。
我有一个类似的情况,显示一个Fragment中的DialogFragment,DialogFragment应该在其中报告它的'解散碎片。
在你的情况下,你似乎使用(片段)活动而不是片段,但我认为这没有区别。
<强>步骤强>
<强>代码强>
public class YourActivity extends Activity {
...
public void someMethod() {
...
YourDialoagFragment yourDialoagFragment =
new YourDialoagFragment(new YourDialogFragmentDismissHandler());
yourDialoagFragment.show();
...
}
private class YourDialogFragmentDismissHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// refresh your textview's here
}
}
...
}
public class YourDialoagFragment extends DialoagFragment {
...
Handler handler;
public YourDialoagFragment(Handler handler) {
this.handler = handler
}
...
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
handler.sendEmptyMessage(0);
}
...
}
我希望这有帮助!
答案 1 :(得分:2)
我总是使用onAttach()方法的简单反馈(但我真的很喜欢stefanjunker解决方案)。只需让您的活动实现FeedbackListener并实现其方法,然后像这样扩展DialogFragment:
public class SomeDialog extends DialogFragment {
private FeedbackListener feedbackListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
feedbackListener = (FeedbackListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement FeedbackListener");
}
}
public void onButtonPushed(View view) {
feedbackListener.doSomething();
}
public interface FeedbackListener {
public void doSomething();
}
}
答案 2 :(得分:1)
你可以使用myDialogFragment.isDetached(),它在分离时返回一个布尔值,称为一个方法,你可以编写代码再次显示。
答案 3 :(得分:1)
您的问题是dialogFragment的操作会影响前一个片段的数据或视图。您希望在dialogfragment dismiss后刷新上一个片段的数据或视图。但是之前的dialogfragment的dismiss无法调用前一个片段的onCreateView()
或onCreate()
。
在这种困境中,你可以使用广播。刷新上一个片段的数据或视图的数据时。你可以发送广播。一旦前一个片段接收到广播,前一个片段现在可以刷新,而不是解除对话片段。我认为这是一个更好的解决方案,尤其是在多线程中。
答案 4 :(得分:0)
理想的答案是这样的:(这是我的应用程序的示例代码)
首先在DialogFragment中定义一个接口:
public interface PasswordCreatedCallback{
void refreshJobsScreen(boolean succesful);
}
和
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
callback = (PasswordCreatedCallback) getTargetFragment();
} catch (ClassCastException e) {
throw new ClassCastException("Calling fragment must implement PasswordCreatedListener interface");
}
}
来自父片段的setTargetFragment如下:
final PasswordCreateDialogFragment passwordDialog = PasswordCreateDialogFragment.newInstance("");
passwordDialog.setTargetFragment(ViewPagerFragment.this, Constants.PASSWORD_CREATED);
您可以随时调用回调方法,并通过回调方法通知您的父片段。
答案 5 :(得分:0)
我知道这不会回答你提出的问题,但我不知道为什么这会对你的情况起作用。如果这不起作用,还有一个解决方案。
在DialogFragment的代码中。
TextView tv = (TextView) getActivity().findViewById(R.id.Your_id);
tv.setText("new string");