我有一个带有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()中添加了代码来清除文本,并且从调试中我看到它被调用,但是文本永远不会被清除。我在这里做错了什么?
答案 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
}
重复使用片段是有好处的。其中最重要的是,如果你的片段存在内存泄漏(这比你想象的要容易得多),你将通过创建无数的内容来加剧这个问题。