【问题标题】:Handle TabLayout tab click处理 TabLayout 选项卡单击
【发布时间】:2017-02-08 03:12:48
【问题描述】:

我有一个带有 TabLayout 和 ViewPager 的片段:

<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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="layout.LinksFragment">

<android.support.design.widget.TabLayout
    android:id="@+id/tab_layout_info"
    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_info"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</FrameLayout>

在我的 Fragment 文件中,在 onCreateView() 方法中,我设置了 ViewPager 和 TabLayout:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_links, container, false);

    TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout_info);
    tabLayout.addTab(tabLayout.newTab());
    tabLayout.addTab(tabLayout.newTab());
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);


    ViewPager viewPager = (ViewPager) view.findViewById(R.id.pager_info);
    PagerAdapterLinks adapter = new PagerAdapterLinks(getActivity().getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    tabLayout.setupWithViewPager(viewPager);


    return view;
}

在 android 5 及更高版本上一切正常,我可以使用滑动或单击选项卡名称在选项卡之间切换。但是,在较低的 android 版本上,单击选项卡不会执行任何操作,并且在 ViewPager 中更改页面的唯一方法是通过滑动。如何让我的 TabLayout 在包括 4.1 和 4.4 在内的 android 上工作?

感谢您的帮助!

【问题讨论】:

    标签: android android-fragments android-viewpager android-tablayout


    【解决方案1】:

    像这样使用addOnTabSelectedListener

    tabLayout.addOnTabSelectedListener(new OnTabSelectedListener() {
        @Override
        public void onTabSelected(Tab tab) {
             switch(tab.getPosition()) {
                 case 0:
                    // ...
             }
        }
    }
    

    【讨论】:

      【解决方案2】:

      只需添加 android.support.design.widget.TabLayout,它将用于呈现不同的选项卡选项。 android.support.v4.view.ViewPager 组件将用于在我们将创建的各个片段之间进行分页。

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">
      
          <android.support.design.widget.TabLayout
              android:id="@+id/sliding_tabs"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              app:tabMode="scrollable" />
      
          <android.support.v4.view.ViewPager
              android:id="@+id/viewpager"
              android:layout_width="match_parent"
              android:layout_height="0px"
              android:layout_weight="1"
              android:background="@android:color/white" />
      

      现在我们的布局中有 ViewPager 和选项卡,我们应该开始定义每个选项卡的内容。由于每个选项卡只是一个正在显示的片段,我们需要创建和定义要显示的片段。根据您的要求,您的应用程序中可能包含一个或多个片段。

      在res / layout / fragment_page.xml定义了在选择特定选项卡时将在屏幕上显示的片段的XML布局:

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

      PageFragment.java 中定义标签内容片段的膨胀逻辑:

      // In this case, the fragment displays simple text based on the page
      public class PageFragment extends Fragment {
          public static final String ARG_PAGE = "ARG_PAGE";
      
          private int mPage;
      
          public static PageFragment newInstance(int page) {
              Bundle args = new Bundle();
              args.putInt(ARG_PAGE, page);
              PageFragment fragment = new PageFragment();
              fragment.setArguments(args);
              return fragment;
          }
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              mPage = getArguments().getInt(ARG_PAGE);
          }
      
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                   Bundle savedInstanceState) {
              View view = inflater.inflate(R.layout.fragment_page, container, false);
              TextView textView = (TextView) view;
              textView.setText("Fragment #" + mPage);
              return view;
          }
      }
      

      接下来要做的是为您的 ViewPager 实现适配器,该适配器控制选项卡、标题及其相关内容的顺序。这里实现的最重要的方法是 getPageTitle(int position) 用于获取每个选项卡的标题和 getItem(int position) 确定每个选项卡的片段。

      public class SampleFragmentPagerAdapter extends FragmentPagerAdapter {
          final int PAGE_COUNT = 3;
          private String tabTitles[] = new String[] { "Tab1", "Tab2", "Tab3" };
          private Context context;
      
          public SampleFragmentPagerAdapter(FragmentManager fm, Context context) {
              super(fm);
              this.context = context;
          }
      
          @Override
          public int getCount() {
              return PAGE_COUNT;
          }
      
          @Override
          public Fragment getItem(int position) {
              return PageFragment.newInstance(position + 1);
          }
      
          @Override
          public CharSequence getPageTitle(int position) {
              // Generate title based on item position
              return tabTitles[position];
          }
      }
      

      最后,我们需要将 ViewPager 附加到 SampleFragmentPagerAdapter,然后通过两步过程配置滑动选项卡:

      在你的activity的onCreate()方法中,找到ViewPager并连接适配器。 在TabLayout 上设置ViewPager 以将寻呼机与选项卡连接起来。

      public class MainActivity extends AppCompatActivity {
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              // Get the ViewPager and set it's PagerAdapter so that it can display items
              ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
              viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager(), 
                  MainActivity.this));
      
              // Give the TabLayout the ViewPager
              TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
              tabLayout.setupWithViewPager(viewPager);
          }
      
      }
      

      来源:https://guides.codepath.com/android/google-play-style-tabs-using-tablayout

      【讨论】:

      • 我不是在寻找完整的教程,我想知道如何使这个方法与 API16 兼容。你粘贴的和我的代码一样,安卓4.4以下就不行了