【问题标题】:Tab Fragments don't show up in fragment标签片段不显示在片段中
【发布时间】:2021-03-21 12:28:29
【问题描述】:

我有一个问题。 我正在处理 1 个活动(mainActivity),我只是用导航视图切换片段。 我的一个片段有一个选项卡式布局。但不知何故,标签没有显示出来。

这是我的 fragment_home.xml

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:layout_constraintBottom_toTopOf="parent"
android:orientation="vertical"
tools:context=".MainActivity"
android:background="@color/beige">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/green"
    android:minHeight="?attr/actionBarSize"
    android:theme="?attr/actionBarTheme">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/home_screen"
        android:textSize="25sp"
        android:textStyle="bold"
        android:textColor="@color/black"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title" />


</androidx.appcompat.widget.Toolbar>

<com.google.android.material.tabs.TabLayout
    android:id="@+id/tabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabBackground="@drawable/tab_background"
    app:tabIndicatorColor="@color/black"
    app:tabSelectedTextColor="@color/black"
    android:layout_below="@+id/toolbar">

    <com.google.android.material.tabs.TabItem
        android:id="@+id/tab1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/recipes_tab" />

    <com.google.android.material.tabs.TabItem
        android:id="@+id/tab2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/fav_tab" />

</com.google.android.material.tabs.TabLayout>

<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tabLayout">

</androidx.viewpager.widget.ViewPager>

这是我的 HomeFragment.java

public class HomeFragment extends Fragment {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_home, container, false);

    TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabLayout);
    TabItem tab1 = (TabItem) view.findViewById(R.id.tab1);
    TabItem tab2 = (TabItem) view.findViewById(R.id.tab2);
    final ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewPager);


    PageAdapter pageAdapter = new PageAdapter(getFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(pageAdapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());

            if(tab.getPosition() == 0)
            {
                pageAdapter.notifyDataSetChanged();
            }
            else if(tab.getPosition() == 1)
            {
                pageAdapter.notifyDataSetChanged();
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));


    return inflater.inflate(R.layout.fragment_home, container, false);
}

}

选项卡应该只打印出“Hello blank fragment”,如您在以下 .xml 和 .java 代码中所见:

fragment_tab1.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=".tab1">

<!-- TODO: Update blank fragment layout -->
<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/hello_blank_fragment" />

tab1.java

public class tab1 extends Fragment {

public tab1() {

}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


    return inflater.inflate(R.layout.fragment_tab1, container, false);
}

}

提前致谢

【问题讨论】:

  • 如果我理解正确,你想在片段内部而不是在主片段中显示 TabLayout?
  • 完全正确,我在主要活动 onCreate() 方法中调用了这个片段。它可以工作,但不知何故标签无法正常工作。
  • 好的!我有一个目标相同的项目。等一下! ;)
  • 顺便说一下,我建议你总是以大写字母开头的类名。看看它是否有效,并记住在答案左侧的按钮中将答案设置为正确。如果它是您正在寻找的东西。

标签: java android android-fragments tabs


【解决方案1】:

在 HomeFragment 中

    private TabLayout tabLayout;
    private ViewPager viewPager;

 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_inbox, container, false);

        tabLayout = view.findViewById(R.id.TabLayoutInBox);
        viewPager = view.findViewById(R.id.ViewPager2InBox);

        //Set Adapter PageAdapter and glue it together
        viewPager.setAdapter(new ViewPagerAdapterLayout(getFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT));
        //Glue TabLayout and ViewPager together
        tabLayout.setupWithViewPager(viewPager);

        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        return view;
    }

您需要创建一个适配器类来在片段之间切换

public class ViewPagerAdapterLayout extends FragmentStatePagerAdapter {
    //How many tabs the adapter will have
    private static int COUNT = 2;

    public ViewPagerAdapterLayout(@NonNull FragmentManager fm, int behavior) {
        super(fm, behavior);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        switch (position){
            //Each tablayout has a number
            case 0:
                return new Tab1();
            case 1:
                return new Tab2();
            default:
                return new Tab1();
        }
    }

    @Override
    public int getCount() {
        return COUNT;
    }
    
    //You can give the name of the tabs in here if u want
    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
       switch (position){
           case 1:
               return "TAB 1";
           default:
               return "TAB 2";
       }
    }
}

【讨论】:

  • 是否也可以将我的页面标题名称保留在 .xml 中?
  • 嗯,老实说我是去年12月开始学习android的,所以我不太了解。但我相信,确实如此。对不起;p
  • 好的,我刚刚知道如何做到这一点。您必须替换 'tabLayout.setupWithViewPager(viewPager);'与 'tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));'它对我有用。只为未来;)
【解决方案2】:

所以,关于 Matheus 的好建议,我在 HomeFragment 中有 1 个小改动需要更改,因此在执行程序时不要更改选项卡的标题。

首页片段

private TabLayout tabLayout;
private ViewPager viewPager;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_home, container, false);

    tabLayout = view.findViewById(R.id.tabLayout);
    viewPager = view.findViewById(R.id.viewPager);

    viewPager.setAdapter(new ViewPagerAdapterLayout(getFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT));

    //tabLayout.setupWithViewPager(viewPager);
    tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));


    return view;
}

这样做,您可以完全删除 getPageTitle 方法。

我希望这也能帮助一些人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多