ViewPager上没有显示任何片段

时间:2017-12-10 12:09:01

标签: java android android-fragments

我的ViewPager没有显示任何片段,即使它为我的" Review部分"加载片段。我在"评级部分"中使用了相同的代码。它工作,甚至尝试重做ViewPager和适配器,但仍然没有进展。顺便说一下,我是在一个片段中这样做的。

我在适配器中放入一个日志,以显示该片段是否正常工作,并更改我的Viewpager的背景颜色以检查它是否可见。即使ViewPager可见但片段仍未显示。

更新:我发现由我用来替换片段的活动引起的问题。

这里是代码片段(在我的活动中同时包含"评级部分"以及"审核部分"。

SubSectionFragment_Rating subSectionFragment_rating = new SubSectionFragment_Rating();
    manager = getSupportFragmentManager();
    manager.beginTransaction().replace(R.id.ratingSection,subSectionFragment_rating, subSectionFragment_rating.getTag()).commit();

    SubSectionFragment_ReviewAndInstructions subSectionFragment = new SubSectionFragment_ReviewAndInstructions();
    manager = getSupportFragmentManager();
    manager.beginTransaction().replace(R.id.subTab,subSectionFragment, subSectionFragment.getTag()).commit();

ViewPager is visible

Should display this fragment in ViewPager

Review.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.hybridelements.openchef.fragment_activities.fragment_subs.SubSectionFragment_ReviewAndInstructions">

<RelativeLayout
    android:id="@+id/main_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:elevation="6dp"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tab_layout"
        android:background="@android:color/holo_green_dark"/>

</RelativeLayout>

Review.java(代码的一部分)

viewPager = (ViewPager) rootView.findViewById(R.id.pager);
    final SubPagerAdapter_ReviewAndInstructions adapter = new SubPagerAdapter_ReviewAndInstructions(getActivity().getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

SubPagerAdapter_ReviewAndInstructions.java

public SubPagerAdapter_ReviewAndInstructions(FragmentManager fm, int NumOfTabs){
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {
    switch (position){
        case 0:
            ReviewsFragment subTab1 = new ReviewsFragment();
            Log.d("ReviewAndInstruction","ReviewsFragment loaded");
            return subTab1;
        default:
            return null;
    }

}

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

2 个答案:

答案 0 :(得分:2)

由于@Yupi建议从getActivity().getSupportFragmentManager()更改为getChildFragment(),问题已解决。在问题发生期间,当更改为getChildFragment()时出现错误

  

java.lang.NullPointerException:尝试调用虚方法&#39; java.lang.Object android.util.SparseArray.get(int)&#39;在空对象引用上

要修复此错误,我需要更改启动片段事务的活动,因此这里是嵌套片段问题的解决方案。

ViewItem.Java( BEFORE

FragmentManager manager;

manager = getSupportFragmentManager();

ViewItem.Java( AFTER

FragmentTransaction manager;

manager = getSupportFragmentManager().beginTransaction();

SubPagerFragment_ReviewAndInstructions.java( BEFORE

final SubPagerAdapter_ReviewAndInstructions adapter = new SubPagerAdapter_ReviewAndInstructions(getActivity().getSupportFragmentManager(), tabLayout.getTabCount());

SubPagerFragment_ReviewAndInstructions.java( AFTER

final SubPagerAdapter_ReviewAndInstructions adapter = new SubPagerAdapter_ReviewAndInstructions(getChildFragmentManager(), tabLayout.getTabCount());

<强>结果

Fragment correctly displayed

答案 1 :(得分:0)

就我而言,childFragmentManageraddToBackStack仍然无法解决我的问题,this解决方案可能会起作用。通过@ burning-violet解决方案的组合。

  1. childFragmentManager用于构造ViewPager
  2. 使用FragmentStatePageAdapter
  3. override restoreState()
  4. 如果不希望添加到Backstack,则不使用addToBackStack(null) //此可选项

restoreState()尝试捕获只会使错误(NPE)保持沉默,必须对其进行相应的修复。

相关问题