当前位置: 首页 > 知识库问答 >
问题:

Android FragmentStatePagerAdapter在重新加载中间片段时返回空白屏幕

潘雅珺
2023-03-14

我正在尝试使用FragmentStatePagerAdapter和ViewPager制作一个包含4个选项卡的应用程序。

当我第一次运行应用程序时,如果我按顺序(0到3)选择选项卡,一切正常,然后如果我尝试执行返回(3到0)的方式,选项卡1将显示一个空白屏幕,如果,在那之后,我选择选项卡2,然后也是空的,如果我转到选项卡0,然后再次按顺序执行选项卡2返回生活,有时选项卡1返回生活,但我没有找到任何顺序。。。

我知道这是一团糟...问题是选项卡1使用失败,选项卡2失败了几次,选项卡0和3总是工作正常。如果我交换碎片的位置一切都是一样的,有些我认为与碎片代码不相关...

在logcat中没有显示错误,调试片段表明一切都按照它应该的方式进行。。。

几天来,我一直在试图修复它,但运气不好(很明显…),我已经尝试重写getItemPosition()以返回POSITION\u NONE,我已经尝试创建我自己的FragmentStatePagerAdapter,如下所示http://speakman.net.nz/blog/2014/02/20/a-bug-in-and-a-fix-for-the-way-fragmentstatepageradapter-handles-fragment-restoration/但没什么。。。还有一些对我不起作用的事情。

一些代码:主类

 public class Main extends FragmentActivity implements ActionBar.TabListener {
        private MyPageAdapter mPagerAdapter;
        private ViewPager mPager;

    @Override
    protected void onCreate(Bundle si) {
        super.onCreate(si);
        setContentView(R.layout.activity_main);
        init();
    }

        private void init() {
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        if (mPagerAdapter == null) {

            mPagerAdapter = new PaginaAdapter(getSupportFragmentManager());

            mPager = (ViewPager) findViewById(R.id.pager);
            mPager.setAdapter(mPagerAdapter);
            mPager.requestTransparentRegion(mPager);


            mPager.setOnPageChangeListener(new viewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });

            // Tab creation
            for (int i = 0; i < mPagerAdapter.getCount(); i++) {
                View tabView = getLayoutInflater().inflate(R.layout.tab, null);
                ((ImageView) tabView.findViewById(R.id.tabIcon))
                .setImageDrawable(getResources().getDrawable(mPagerAdapter.getIcon(i)));

                           actionBar.addTab(actionBar.newTab().setCustomView(tabView).setTabListener(this));
            }

        }

    }

        @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        mPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {

    }

适配器

public class MyPageAdapter extends FragmentStatePagerAdapter {
     public MyPageAdapter(FragmentManager fm) {
          super(fm);
     }

     @Override
     public Fragment getItem(int position) {

        Fragment fragment = null;

        switch (position) {
        case 0:
            fragment = new InitFragment();
            break;
        case 1:
            fragment = new MusicFragment();
            break;
        case 2:
            fragment = new VideoFragment();
            break;
        case 3:
            fragment = new PicFragment();
            break;
        }

        return fragment;
     }

        @Override
    public int getCount() {
        return 4;
    }

....

}

谢谢

更新:我的片段在单独的类中,它们不是静态的,这很重要吗?我刚刚意识到的另一件事是,在我触摸标签后,它似乎正在破坏碎片,因为如果我慢慢滑动,我可以看到碎片,但突然一切都消失了

共有2个答案

谢夜洛
2023-03-14

尝试使用FragmentPagerAdapter

MyPageAdapter .java

public class MyPageAdapter extends FragmentPagerAdapter {

    public MyPageAdapter (FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {

         switch (position) {
    case 0:
        fragment = new InitFragment();
        break;
    case 1:
        fragment = new MusicFragment();
        break;
    case 2:
        fragment = new VideoFragment();
        break;
    case 3:
        fragment = new PicFragment();
        break;
    }


        return null;
    }

    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 4;
    }

}
丌官高远
2023-03-14

我建议您使用FragmentPagerAdapter而不是FragmentStatePagerAdapter。似乎您只希望每个选项卡有3个选项卡和一个片段,这听起来不太消耗内存(只要不是充满了位图等)。当使用FragmentStatePagerAdapter时,您负责在重新加载时恢复每个Frament的状态,使用FragmentPagerAdapter系统将保留View层次结构,这就是您想要的。

 类似资料:
  • 问题内容: 我只是很好奇,因为我已经在FragmentActivity中设置了Fragment选项卡,如何从FragmentActivity或Fragment本身重新加载片段,以清除并重新加载该选项卡。我本质上需要重新选择选项卡以替换片段时发生的相同事情。有一种简单的方法可以执行此操作并重新加载片段吗? 问题答案: 创建一个方法,该方法开始FragmentTransaction,分离片段,然后提交

  • 我在我的应用程序中使用导航栏,每次我选择一个项目时,它都会加载一个片段。 我能够使用相同的文本字段和按钮保存片段的状态,但有一个片段可以加载地图、添加标记、集群并执行。 每次我转到另一个菜单项并返回时,它都会重新加载所有内容,例如AsyncTask、Cluster、Markers。我如何停止此片段以不再重新创建地图并在返回时保存状态: Udate 1:我更新了代码,但问题仍然存在 主要活动: 主片

  • 我有一个由片段填充的ViewPager。特别是,我有一个片段,它显示了Addresses对象的列表和一个允许创建新地址的列表。添加新地址的过程如下: 因此,当添加新地址时,我回到AddressListFragment,它是ViewPager中的活动地址。我需要更新该片段,以便更新列表与新添加的地址时,我回来它!我需要在那个片段上重写一个特定的方法吗? 提前道谢!

  • 我正在使用AngularJS和Ionic框架构建一个应用程序。我的应用程序需要有一个注销按钮。当用户按下注销按钮时,我想重新加载页面,以便重新引导应用程序,并清除所有缓存数据。基于这个StackOverflow问题,我应该能够只做<<代码>$窗口。地方重新加载(true)。如果我只是通过ionic serve在浏览器中运行该应用程序,效果很好。然而,当我在实际设备上运行它时,屏幕会变为空白,再也不

  • 我在主活动中有以下代码 可扩展置标语言 有时当我打开我的应用程序时,只会显示白屏。我已经使用AsyncTask将数据库从资产文件夹复制到设备,共享首选项将设置字体类型和大小。谁能帮我解决这个问题。谢谢你。 在提出问题之前,我已经阅读了以下问题 Android应用程序启动时的白色背景 android闪屏前几秒钟的白色背景 闪屏活动背景色

  • 我在过去的两个小时里一直在试图解决这个问题。试过很多东西。 该片段似乎正在向我的适配器传递空上下文。我尝试在onCreate和onCreateView和onActivityCreated中初始化上下文变量。同样的结果。