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

标签 android listview android-fragments

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

相关文章:

android - Android 应用程序关闭时如何保持 Web 套接字连接处于 Activity 状态

android - 如何为我的 ListView 实现适配器以显示 iPhone 联系人列表

Android:具有处理程序和可运行的 ListView 中的多个计时器。 2个问题

c# - 用于列标题的 ListView ContextMenuStrip

java - 试图找到 CH34xAndroidDriver.isConnected() 何时变为真

java - 如何将 fragment 的值设置为不同的 Activity

android - PreferenceFragment - getPreferenceManager() 和 getPreferenceScreen() 之间的区别?

java - Intent 对象显示错误 Android

android - 选择所有 ListViewItem 的 CheckBox

android-fragments - Espresso 执行单击片段中的按钮