gpt4 book ai didi

android - ViewPager 中的 Fragment 失去了它的 View

转载 作者:搜寻专家 更新时间:2023-11-01 07:50:14 26 4
gpt4 key购买 nike

我使用 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 2Fragment 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com