对ViewPager的多个选项卡布局使用单个片段类

马哈茂德·梅特韦

在TabsDemoApp中,我尝试使用一个Fragment并在三个XML布局之间切换,我看到了这些问题

“如何知道onCreateView函数中哪个选项卡处于活动状态?”

“在ViewPager的多个选项卡中使用单个片段”

我试图理解它并将其应用于此示例

这是完整的代码

TabLayoutAdapter

package com.example.tabsdemoapp;

import java.util.ArrayList;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;

public class TabLayoutAdapter extends FragmentStatePagerAdapter {

    int mNumOfTabs;

    public TabLayoutAdapter(@NonNull FragmentManager fm, int mNumOfTabs) {
        super(fm, mNumOfTabs);
        this.mNumOfTabs = mNumOfTabs;
    }


    @NonNull
    @Override
    public Fragment getItem(int position) {
        return TabFragment.newInstance(position);
    }

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

标签片段

package com.example.tabsdemoapp;

import android.content.Context;
import android.os.Bundle;
import android.provider.SyncStateContract;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class TabFragment extends Fragment {

    private static String ARG_POSITION = "position";
    private static int fragmentId = 0;

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

        if(container.getId() == R.id.tab1) {
            return inflater.inflate(R.layout.tab1, container, false);
        }else if(container.getId() == R.id.tab2){
            return inflater.inflate(R.layout.tab2, container, false);
        }else {
            return inflater.inflate(R.layout.tab3, container, false);
        }
    }


    public static TabFragment newInstance(int position) {
        TabFragment fragment = new TabFragment();
        Bundle bundle = new Bundle();
        bundle.putInt(ARG_POSITION, position);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragmentId = getArguments().getInt(ARG_POSITION,fragmentId);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        assert getTargetFragment() != null;
        getChildFragmentManager().beginTransaction().
                replace(R.id.container, getTargetFragment()).
                commit();
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }
}

main_activity.xml

   <LinearLayout 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"
    android:orientation="vertical"
    android:id="@+id/rootView"
    tools:context=".MainActivity">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/myTabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="186dp">

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

    <androidx.viewpager.widget.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/viewPager"
        app:elevation="5dp"
        >

    </androidx.viewpager.widget.ViewPager>

</LinearLayout>

MainActivity类

    public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;
    TabLayoutAdapter adapter;

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

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

        tabLayout.setupWithViewPager(viewPager);
        adapter = new TabLayoutAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                switch (tab.getPosition()) {
                    case 0:
                        viewPager.setCurrentItem(tab.getPosition());
                        break;
                    case 1:
                        viewPager.setCurrentItem(tab.getPosition());
                        break;
                    case 2:
                        viewPager.setCurrentItem(tab.getPosition());
                        break;
                    default:
                        viewPager.setCurrentItem(tab.getPosition());
                }
            }

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

            }

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

            }
        });


    }
}

每个选项卡tab1,tab2,tab3都有三个XML

tab1.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/tab1"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Tab one"
        android:textAppearance="?android:attr/textAppearanceLarge"/>

</RelativeLayout>

tab2.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/tab2"
    android:orientation="vertical">

    <TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Tab two"
        android:textAppearance="?android:attr/textAppearanceLarge"/>

</RelativeLayout>

tab3.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tab3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Tab three"
        android:textAppearance="?android:attr/textAppearanceLarge"/>

</RelativeLayout>

运行该应用程序后,我看到一个空白页,没有ViewPager和TabLayout

在此处输入图片说明

丛海
  1. 为TabLayout命名,您TabLayoutAdapter应该覆盖getPageTitle
    @Override
    public CharSequence getPageTitle(int position) {
        return "Tab " + position;
    }
  1. 你错在这里一直container传给onCreateView"@+id/viewPager"
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        if(container.getId() == R.id.tab1) {
            return inflater.inflate(R.layout.tab1, container, false);
        }else if(container.getId() == R.id.tab2){
            return inflater.inflate(R.layout.tab2, container, false);
        }else {
            return inflater.inflate(R.layout.tab3, container, false);
        }
    }

将此代码更改为

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

        if(fragmentId == 0) {
            return inflater.inflate(R.layout.tab1, container, false);
        }else if(fragmentId == 1){
            return inflater.inflate(R.layout.tab2, container, false);
        }else {
            return inflater.inflate(R.layout.tab3, container, false);
        }
    }
  1. TabLayoutAdapter按总片段而不是按片段初始化tabLayout.getTabCount()因为现在tabLayout没有子选项卡,它将返回0。
 adapter = new TabLayoutAdapter(getSupportFragmentManager(), 3);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在ViewPager的多个选项卡中使用单个片段

来自分类Dev

使用ViewPager的ActionBar选项卡和多片段布局

来自分类Dev

如何在Java Android中为ViewPager滑动选项卡使用单个片段

来自分类Dev

如何在Java Android中为ViewPager滑动选项卡使用单个片段

来自分类Dev

ViewPager,与RecyclerView相同的片段用于多个选项卡

来自分类Dev

使用ViewPager更改片段选项卡的大小

来自分类Dev

片段选项卡viewpager问题

来自分类Dev

在片段内创建选项卡布局

来自分类Dev

动态更新片段内的TextView(ViewPager选项卡布局)

来自分类Dev

带有Viewpager,选项卡和抽屉布局的片段容器不起作用

来自分类Dev

如何使用多个片段实现滑动选项卡导航

来自分类Dev

如何使用多个片段实现滑动选项卡导航

来自分类Dev

在滑动选项卡布局中将数据从一个片段传递到多个片段

来自分类Dev

扩展片段的类中的选项卡

来自分类Dev

扩展片段的类中的选项卡

来自分类Dev

片段中的选项卡布局(不会显示片段)

来自分类Dev

Android:从viewPager选项卡片段之一启动片段时,隐藏viewPager选项卡

来自分类Dev

在具有选项卡布局的Viewpager中将视图刷回时,如何再次显示带有数据的片段?

来自分类Dev

如何使当前片段显示在viewpager的特定选项卡中?

来自分类Dev

ViewPager的选项卡中的片段显示错误的数据

来自分类Dev

使用选项卡从列表创建片段

来自分类Dev

如何使用片段在TabLayout的每个选项卡中显示不同的布局

来自分类Dev

如何将活动转换为片段以在选项卡布局中使用

来自分类Dev

ViewPager选项卡和抽屉布局可能吗?

来自分类Dev

动作栏选项卡:使用多次实例化的单个片段时,如何传递参数

来自分类Dev

动作栏选项卡:使用多次实例化的单个片段时,如何传递参数

来自分类Dev

Android片段的选项卡式布局,重新选择选项卡3,列表视图消失

来自分类Dev

从具有选项卡布局的活动中启动选项卡片段

来自分类Dev

单个Nautilus窗口可以使用多个选项卡启动吗?

Related 相关文章

  1. 1

    在ViewPager的多个选项卡中使用单个片段

  2. 2

    使用ViewPager的ActionBar选项卡和多片段布局

  3. 3

    如何在Java Android中为ViewPager滑动选项卡使用单个片段

  4. 4

    如何在Java Android中为ViewPager滑动选项卡使用单个片段

  5. 5

    ViewPager,与RecyclerView相同的片段用于多个选项卡

  6. 6

    使用ViewPager更改片段选项卡的大小

  7. 7

    片段选项卡viewpager问题

  8. 8

    在片段内创建选项卡布局

  9. 9

    动态更新片段内的TextView(ViewPager选项卡布局)

  10. 10

    带有Viewpager,选项卡和抽屉布局的片段容器不起作用

  11. 11

    如何使用多个片段实现滑动选项卡导航

  12. 12

    如何使用多个片段实现滑动选项卡导航

  13. 13

    在滑动选项卡布局中将数据从一个片段传递到多个片段

  14. 14

    扩展片段的类中的选项卡

  15. 15

    扩展片段的类中的选项卡

  16. 16

    片段中的选项卡布局(不会显示片段)

  17. 17

    Android:从viewPager选项卡片段之一启动片段时,隐藏viewPager选项卡

  18. 18

    在具有选项卡布局的Viewpager中将视图刷回时,如何再次显示带有数据的片段?

  19. 19

    如何使当前片段显示在viewpager的特定选项卡中?

  20. 20

    ViewPager的选项卡中的片段显示错误的数据

  21. 21

    使用选项卡从列表创建片段

  22. 22

    如何使用片段在TabLayout的每个选项卡中显示不同的布局

  23. 23

    如何将活动转换为片段以在选项卡布局中使用

  24. 24

    ViewPager选项卡和抽屉布局可能吗?

  25. 25

    动作栏选项卡:使用多次实例化的单个片段时,如何传递参数

  26. 26

    动作栏选项卡:使用多次实例化的单个片段时,如何传递参数

  27. 27

    Android片段的选项卡式布局,重新选择选项卡3,列表视图消失

  28. 28

    从具有选项卡布局的活动中启动选项卡片段

  29. 29

    单个Nautilus窗口可以使用多个选项卡启动吗?

热门标签

归档