片段切换视图是否被重用?

时间:2014-05-15 11:22:24

标签: android android-fragments

我有一个带有FrameLayout的Activity,需要根据用户输入显示不同的片段。

我用来显示片段的代码是:

private void showFragment(Fragment fragment, Bundle args, boolean addToBackStack) {

    if (args != null) {
        fragment.setArguments(args);
    }

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.setCustomAnimations(R.anim.activity_open_translate, R.anim.activity_close_scale);

    fragmentTransaction.replace(R.id.main_frame, fragment);

    if (addToBackStack) {
        fragmentTransaction.addToBackStack(fragment.getClass().getName());
    }
    fragmentTransaction.commit();
}

这称为:

if (contactPickFragment == null) {
    contactPickFragment = new ContactPickFragment();
}
showFragment(contactPickFragment, args, true);

这一切都很好。现在,如果用户进入一个片段,则按下并返回到同一个片段,我内部的所有视图保持不变。例如,我在片段中有一个EditText,用户在里面编辑了一些内容。如果用户返回到片段,则相同的文本仍然存在。我不希望这种情况发生。如何重置视图中的所有内容?

我已经在Fragment的onCreateView()中添加了代码来清除文本,并且从调试中我看到它被调用,但是文本永远不会被清除。我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

如果您不希望显示上一个实例中的数据,只需在每次显示时创建ContactPickFragment的新实例。

清除onCreateView()中的数据无效,因为在onCreateView()之后恢复了视图状态。您的片段在onCreateView()之前没有视图,因此Android之前不可能应用之前的状态。在onCreateView()期间在视图上设置的值将被其先前的值覆盖。

答案 1 :(得分:0)

作为一般答案,没有办法刷新"片段的视图,而不是用自己的另一个实例替换片段(可能使用您想要刷新/更新的参数初始化)。

答案 2 :(得分:0)

可以重复使用您的片段并刷新您的观看状态。你无法从onCreateView中做到这一点,正如@antonyt所指出的那样。

相反,覆盖onViewStateRestored并按照您喜欢的方式设置视图的状态。

类似的东西:

@Override
public void onViewStateRestored(Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);
    View view = getView();

    // Code to call view.findViewById to grab the views you want
    // and set them to a specific state goes here
}

重复使用片段是有好处的。其中最重要的是,如果你的片段存在内存泄漏(这比你想象的要容易得多),你将通过创建无数的内容来加剧这个问题。