【问题标题】:No fragment showing on ViewPagerViewPager 上没有显示片段
【发布时间】:2019-04-10 21:54:23
【问题描述】:

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

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

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

这里是代码 sn-p(在我的活动中同时包含“评分部分”和“评论部分”。

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

审查.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;
}

【问题讨论】:

  • 确保你在 Fragment 的 OnCreateView 方法中返回了 rootview。
  • 我已经检查以确保每个 OnCreateView 方法都返回 rootView。仍然没有修复
  • 像这样尝试getChildFragmentManager()final SubPagerAdapter_ReviewAndInstructions adapter = new SubPagerAdapter_ReviewAndInstructions(getChildFragmentManager(), tabLayout.getTabCount());
  • 使用 getChildFragmentManager() 时。得到这个错误 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.util.SparseArray.get(int)' on an null object reference
  • 这是代码中其他地方的问题。使用 logcat 和引发异常的代码更新问题。

标签: java android android-fragments


【解决方案1】:

感谢@Yupi 提出将getActivity().getSupportFragmentManager() 更改为getChildFragment() 的建议,问题得以解决。在问题发生期间,更改为getChildFragment() 时出现错误

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object android.util.SparseArray.get(int)”

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

ViewItem.Java(之前

FragmentManager manager;

manager = getSupportFragmentManager();

ViewItem.Java(之后

FragmentTransaction manager;

manager = getSupportFragmentManager().beginTransaction();

SubPagerFragment_ReviewAndInstructions.java(之前

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

SubPagerFragment_ReviewAndInstructions.java(之后

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

结果

Fragment correctly displayed

【讨论】:

    【解决方案2】:

    在我的情况下,childFragmentManageraddToBackStack 仍然没有解决我的问题,this 解决方案可能会起作用。结合@burning-violet 解决方案。

    1. childFragmentManager 用于构造 ViewPager
    2. 使用FragmentStatePageAdapter
    3. override restoreState()
    4. 不使用addToBackStack(null) //这个可选的,如果你不想添加到后台堆栈

    restoreState() try catch 只会使错误静音 (NPE),它必须相应地修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-16
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多