【问题标题】:VIewPager display error when returns from another fragment从另一个片段返回时,VIewPager 显示错误
【发布时间】:2017-10-21 08:41:14
【问题描述】:

结构如下:我只想使用一个 Activity 和几个片段来构建我的应用程序。在 MainActivity 中有一个 FrameLayout 作为容器工作。一开始会将Fragment_Base添加到容器中,其中有一个TabLayout和一个ViewPager,包含三个选项卡:Tab1、Tab2和Tab3,都是片段。

然后在 Tab1 中有一个按钮。单击它时,Framelayout(容器)将被 Fragment_Search 替换。它确实有效,并且显示了一个新的 Fragment_Search。但是当我点击手机上的返回按钮并返回到之前的片段时,出现了问题。

这里是变化:

这是带有 3 个选项卡的 Fragment_Base 的原始状态

点击Tab1上的Button,跳转到Fragment_Search

返回 Fragment_Base,结果出错了。

如您所见,Tab1 中的所有小部件都消失了,但在我滑动到 Tab2->Tab3->Tab2->Tab1 后它们又出现了。 Tab2 的背景是橙色的,然后就消失了。更诡异的是,TabLayout中tab2的指示条位置不对,滑动到tab3->tab2也是正常的。

这是一些代码:

  1. 在 MainActivity.java 中,OnCreate():

    if (findViewById(R.id.framelayout_base) != null) {
    
        if (savedInstanceState != null) {
            return ;
        }
    
        Frag_Base frag_base = new Frag_Base();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.framelayout_base, frag_base)
                .commit();
    
    }
    
  2. 在 Fragment_Base.java 中,OnCreateView():

    View view = inflater.inflate(R.layout.fragment_base, container, false);
    
    fragmentActivity = getActivity();
    
    // initial views
    mViewPager = view.findViewById(R.id.viewPager_);
    mFragmentPagerAdapter = new MainFragmentPagerAdapter(fragmentActivity.getSupportFragmentManager());
    mViewPager.setAdapter(mFragmentPagerAdapter);
    
    mTabLayout = view.findViewById(R.id.tabLayout_);
    mTabLayout.setupWithViewPager(mViewPager);
    
    mTabLayout.getTabAt(0).setIcon(R.drawable.ic_search);
    mTabLayout.getTabAt(1).setIcon(R.drawable.ic_star);
    mTabLayout.getTabAt(2).setIcon(R.drawable.ic_profile);
    
  3. 在 MainFragmentPagerAdapter.java 中,getItem(int position):

    switch (position) {
        case 0:
            return new Fragment1();
        case 1:
            return new Fragment2();
        case 2:
            return new Fragment3();
    
        default:
            return null;
    }
    
  4. 在 Fragment1.java 中,OnClick(View view):

    case R.id.fab_gotoSearch:
    
            Log.d(TAG, "onClick: "+"go to search");
    
            Frag_Search frag_search = new Frag_Search();
            getFragmentManager().beginTransaction()
                    .replace(R.id.framelayout_base, frag_search)
                    .addToBackStack(null)
                    .commit();
    
            break;
    

编辑 实际上,所有日志都是白色的,但这里是所有片段的日志:

10-21 09:34:25.923 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onAttach: 
10-21 09:34:25.923 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onCreate: 
10-21 09:34:25.925 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onCreateView: 
10-21 09:34:25.974 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onStart: 
10-21 09:34:25.976 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onResume: 
10-21 09:34:26.015 5537-5537/com.project.nanfang.music_n D/Fragment1: onAttach: 
10-21 09:34:26.015 5537-5537/com.project.nanfang.music_n D/Fragment1: onCreate: 
10-21 09:34:26.015 5537-5537/com.project.nanfang.music_n D/Fragment2: onAttach: 
10-21 09:34:26.015 5537-5537/com.project.nanfang.music_n D/Fragment2: onCreate: 
10-21 09:34:26.016 5537-5537/com.project.nanfang.music_n D/Fragment1: onCreateView: 
10-21 09:34:26.090 5537-5537/com.project.nanfang.music_n D/Fragment1: onStart: 
10-21 09:34:26.090 5537-5537/com.project.nanfang.music_n D/Fragment1: onResume: 
10-21 09:34:26.090 5537-5537/com.project.nanfang.music_n D/Fragment2: onCreateView: 
10-21 09:34:26.093 5537-5537/com.project.nanfang.music_n D/Fragment2: onStart: 
10-21 09:34:26.093 5537-5537/com.project.nanfang.music_n D/Fragment2: onResume: 
10-21 09:34:41.028 5537-5537/com.project.nanfang.music_n D/Fragment3: onAttach: 
10-21 09:34:41.028 5537-5537/com.project.nanfang.music_n D/Fragment3: onCreate: 
10-21 09:34:41.028 5537-5537/com.project.nanfang.music_n D/Fragment3: onCreateView: 
10-21 09:34:41.030 5537-5537/com.project.nanfang.music_n D/Fragment3: onStart: 
10-21 09:34:41.030 5537-5537/com.project.nanfang.music_n D/Fragment3: onResume: 
10-21 09:34:46.933 5537-5537/com.project.nanfang.music_n D/Fragment1: onPause: 
10-21 09:34:46.933 5537-5537/com.project.nanfang.music_n D/Fragment1: onStop: 
10-21 09:34:51.374 5537-5537/com.project.nanfang.music_n D/Fragment1: onCreateView: 
10-21 09:34:51.410 5537-5537/com.project.nanfang.music_n D/Fragment1: onStart: 
10-21 09:34:51.411 5537-5537/com.project.nanfang.music_n D/Fragment1: onResume: 
10-21 09:35:01.860 5537-5537/com.project.nanfang.music_n D/Fragment3: onPause: 
10-21 09:35:01.860 5537-5537/com.project.nanfang.music_n D/Fragment3: onStop: 
10-21 09:35:08.150 5537-5537/com.project.nanfang.music_n D/Fragment1: onClick: go to search
10-21 09:35:08.152 5537-5537/com.project.nanfang.music_n D/Frag_Search: onAttach: 
10-21 09:35:08.152 5537-5537/com.project.nanfang.music_n D/Frag_Search: onCreate: 
10-21 09:35:08.152 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onPause: 
10-21 09:35:08.152 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onStop: 
10-21 09:35:08.159 5537-5537/com.project.nanfang.music_n D/Frag_Search: onCreateView: 
10-21 09:35:08.243 5537-5537/com.project.nanfang.music_n D/Frag_Search: onStart: 
10-21 09:35:08.243 5537-5537/com.project.nanfang.music_n D/Frag_Search: onResume: 
10-21 09:35:13.843 5537-5537/com.project.nanfang.music_n D/Frag_Search: onPause: 
10-21 09:35:13.843 5537-5537/com.project.nanfang.music_n D/Frag_Search: onStop: 
10-21 09:35:13.854 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onCreateView: 
10-21 09:35:13.874 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onStart: 
10-21 09:35:13.874 5537-5537/com.project.nanfang.music_n D/Fragment_Base: onResume: 

好像回到 Fragment_Base 后,Fragment1 并没有调用 OnCreate()。是这个问题吗?

【问题讨论】:

  • 发布您的错误日志

标签: java android android-fragments


【解决方案1】:

嗯...我清理并重建项目,然后一切顺利...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多