我使用 Android Studio 的选项卡式 Activity 开始了一个新项目。它使用 ViewPager 和 3 个 fragment ( fragment 1、 fragment 2 和 fragment 3)创建了一个 Activity 。 我将 fragment1 更改为有一个 listView 和一个 TextView,我在创建 fragment 时对其进行了初始化。 listView 中的数据是从 SQL 数据库中读取的。 当应用程序启动时,显示 fragment1 并且 listView 显示从 SQL 读取的数据。 当我从 fragment1 滑动到 fragment2 并返回时,fragment1 正确显示 ListView 。但是,当我滑动到 fragment3 并返回到 fragment1 时, ListView 数据丢失并且我得到一个空白屏幕,尽管 textview 显示正确。 当我将应用程序更改为只有 2 个 fragment 时,它不会发生,我可以从 fragment1 滑动到 fragment2 并返回多次而不会丢失任何数据。当我添加第三个 fragment 时,数据在第一次滑动到 fragment 3 时丢失,但如果我仅在 fragment 1 和 fragment 2 之间滑动则不会丢失。 知道为什么会这样吗?
最佳答案
这是因为默认情况下 ViewPager
有一个名为 setOffscreenPageLimit(int i)
的函数。这告诉 ViewPager
有多少 Fragments
需要存储在内存中。默认情况下它是“2”。因此,当您从 Fragment 1 滑动到 Fragment 2 时,它仍会将 Fragment 1 保留在内存中,不会将其从内存中删除。但是,当您滑动到 Fragment 3 时,它会在内存中包含 Fragment 2 和 Fragment 3,因此它会删除 Fragment 1.
这就是为什么当您返回到您的第一个 fragment 时,它已经丢失了它的 View 或数据。
尝试使用
mViewPager.setOffscreenPageLimit(your total fragment count +1);
或更好的解决方案
当您在 ViewPager
中滑动时,不要替换
您的 fragment 。 Push
它到 backstack,当你返回它时,检查 backstack,如果 fragment 在那里,然后 Pop
它并显示它。
代码如下:
public void pushFragments(String tag, Fragment fragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
if (manager.findFragmentByTag(tag) == null) {
ft.add(R.id.frame_container, fragment, tag);
}
String tagOne="com........Frag_one"; //your fragment class name
String tagTwo="com........Frag_two";
String tagThree="com........Frag_three";
String tagFour="com........Frag_profile";
Fragment fragmentOne = manager.findFragmentByTag(tagOne);
Fragment fragmentTwo = manager.findFragmentByTag(tagTwo);
Fragment fragmentThree = manager.findFragmentByTag(tagThree);
Fragment fragmentFour = manager.findFragmentByTag(tagFour);
manager.executePendingTransactions();
// Hide all Fragment
if (fragmentOne != null) {
ft.hide(fragmentOne);
}
if (fragmentTwo != null) {
ft.hide(fragmentTwo);
}
if (fragmentThree != null) {
ft.hide(fragmentThree);
}
if (fragmentFour != null) {
ft.hide(fragmentFour);
}
// Show current Fragment
if (tag.equals(tagOne)) {
if (fragmentOne != null) {
ft.show(fragmentOne);
}
}
if (tag.equals(tagTwo)) {
if (fragmentTwo != null) {
ft.show(fragmentTwo);
}
}
if (tag.equals(tagThree)) {
if (fragmentThree != null) {
ft.show(fragmentThree);
}
}
if (tag.equals(tagFour)) {
if (fragmentFour != null) {
ft.show(fragmentFour);
}
}
ft.commit();
}
你是这样调用它的:
Fragment fragment = new Frag_one();
pushFragments(fragment.getClass().getName(),fragment);
关于android - ViewPager 中的 Fragment 失去了它的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35756512/