Android - 解除DialogFragment时刷新“父”片段

时间:2012-03-09 23:30:45

标签: android android-fragments

我正在使用Tabhost和Fragments构建一个带有标签布局的Android应用程序。

在其中一个标签(片段)中,我有一个textview,显示一个String变量的值。这个选项卡还有一个调用DialogFragment的按钮,我可以通过EditText框编辑所述字符串的值。

这一切都按预期工作,除了一个小故障:一旦DialogFragment被解除并且选项卡再次获得焦点,textview文本不会自动刷新。要刷新它我需要更改选项卡并返回。

是否有可以添加的指令,以便在解除DialogFragment时,重新加载/刷新其父活动?

提前致谢。

编辑:仍在寻找解决方案,无法弄清楚如何使用DialogFragment.isdetached

6 个答案:

答案 0 :(得分:9)

要设置关键字,可以通过处理程序机制完成。

我有一个类似的情况,显示一个Fragment中的DialogFragment,DialogFragment应该在其中报告它的'解散碎片。

在你的情况下,你似乎使用(片段)活动而不是片段,但我认为这没有区别。

<强>步骤

  1. 在您的Activity中创建一个扩展Handler的私有类。覆盖onHandleMessage(),并在那里刷新TextView。
  2. 将YourDialogFragmentDismissHandler的实例传递给YourDialogFragment,例如通过构造函数
  3. 覆盖YourDialogFragment中的onDismiss(),并通过YourDialogFragmentDismissHandler的实例以最简单的方式发送一条消息。
  4. <强>代码

    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");