FragmentPagerAdapter+ViewPager实现Tab切换效果

Posted 张玉宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FragmentPagerAdapter+ViewPager实现Tab切换效果相关的知识,希望对你有一定的参考价值。

1.Activity  加载布局文件,获取Viewpager控件   给ViewPager填充适配器.

  1. import android.app.ActionBar;  
  2. import android.app.ActionBar.Tab;  
  3. import android.app.Activity;  
  4. import android.app.Fragment;  
  5. import android.app.FragmentTransaction;  
  6. import android.content.Context;  
  7. import android.os.Bundle;  
  8. import android.support.v13.app.FragmentPagerAdapter;  
  9. import android.support.v4.view.ViewPager;  
  10. import android.view.ActionMode;  
  11.   
  12. import java.util.ArrayList;  
  13.   
  14. public class MainActivity extends Activity {  
  15.     private static final String INSTANCESTATE_TAB = "tab";  
  16.     ViewPager mViewPager;  
  17.     TabsAdapter mTabsAdapter;  
  18.     ActionMode mActionMode;  
  19.   
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.   
  24.         setContentView(R.layout.fragment_pager);  
  25.         mViewPager = (ViewPager) findViewById(R.id.pager);  
  26.   
  27.         final ActionBar bar = getActionBar();  
  28.         bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
  29.         bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME);  
  30.   
  31.         mTabsAdapter = new TabsAdapter(this, mViewPager);  
  32.         mTabsAdapter.addTab(bar.newTab().setText(R.string.tab_sd),  
  33.                 Fragment1.class, null);  
  34.         mTabsAdapter.addTab(bar.newTab().setText(R.string.tab_remote),  
  35.                 Fragment2.class, null);  
  36.         if (savedInstanceState != null) {  
  37.             bar.setSelectedNavigationItem(savedInstanceState.getInt(INSTANCESTATE_TAB, 0));  
  38.         }  
  39.     }  
  40.   
  41.     @Override  
  42.     protected void onSaveInstanceState(Bundle outState) {  
  43.         super.onSaveInstanceState(outState);  
  44.         outState.putInt(INSTANCESTATE_TAB, getActionBar().getSelectedNavigationIndex());  
  45.     }  
  46.   
  47.     public void setActionMode(ActionMode actionMode) {  
  48.         mActionMode = actionMode;  
  49.     }  
  50.   
  51.     public ActionMode getActionMode() {  
  52.         return mActionMode;  
  53.     }  
  54.   
  55.     public static class TabsAdapter extends FragmentPagerAdapter  
  56.             implements ActionBar.TabListener, ViewPager.OnPageChangeListener {  
  57.         private final Context mContext;  
  58.         private final ActionBar mActionBar;  
  59.         private final ViewPager mViewPager;  
  60.         private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();  
  61.   
  62.         static final class TabInfo {  
  63.             private final Class<?> clss;  
  64.             private final Bundle args;  
  65.             private Fragment fragment;  
  66.   
  67.             TabInfo(Class<?> _class, Bundle _args) {  
  68.                 clss = _class;  
  69.                 args = _args;  
  70.             }  
  71.         }  
  72.   
  73.         public TabsAdapter(Activity activity, ViewPager pager) {  
  74.             super(activity.getFragmentManager());  
  75.             mContext = activity;  
  76.             mActionBar = activity.getActionBar();  
  77.             mViewPager = pager;  
  78.             mViewPager.setAdapter(this);  
  79.             mViewPager.setOnPageChangeListener(this);  
  80.         }  
  81.   
  82.         public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {  
  83.             TabInfo info = new TabInfo(clss, args);  
  84.             tab.setTag(info);  
  85.             tab.setTabListener(this);  
  86.             mTabs.add(info);  
  87.             mActionBar.addTab(tab);  
  88.             notifyDataSetChanged();  
  89.         }  
  90.   
  91.         @Override  
  92.         public int getCount() {  
  93.             return mTabs.size();  
  94.         }  
  95.   
  96.         @Override  
  97.         public Fragment getItem(int position) {  
  98.             TabInfo info = mTabs.get(position);  
  99.             if (info.fragment == null) {  
  100.                 info.fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args);  
  101.             }  
  102.             return info.fragment;  
  103.         }  
  104.           
  105.   
  106.         @Override  
  107.         public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {  
  108.         }  
  109.   
  110.         @Override  
  111.         public void onPageSelected(int position) {  
  112.             mActionBar.setSelectedNavigationItem(position);  
  113.         }  
  114.   
  115.         @Override  
  116.         public void onPageScrollStateChanged(int state) {  
  117.         }  
  118.   
  119.         @Override  
  120.         public void onTabSelected(Tab tab, FragmentTransaction ft) {  
  121.             Object tag = tab.getTag();  
  122.             for (int i=0; i<mTabs.size(); i++) {  
  123.                 if (mTabs.get(i) == tag) {  
  124.                     mViewPager.setCurrentItem(i);  
  125.                 }  
  126.             }  
  127.             if(!tab.getText().equals(mContext.getString(R.string.tab_sd))) {  
  128.                 ActionMode actionMode = ((MainActivity) mContext).getActionMode();  
  129.                 if (actionMode != null) {  
  130.                     actionMode.finish();  
  131.                 }  
  132.             }  
  133.         }  
  134.   
  135.         @Override  
  136.         public void onTabUnselected(Tab tab, FragmentTransaction ft) {  
  137.         }  
  138.   
  139.         @Override  
  140.         public void onTabReselected(Tab tab, FragmentTransaction ft) {  
  141.         }  
  142.     }  
  143. }  

 

2.fragment_pager.xml布局文件   里面就一个ViewPager控件   大家记得导入v4包

  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <android.support.v4.view.ViewPager  
  4.     xmlns:android="http://schemas.android.com/apk/res/android"  
  5.     android:id="@+id/pager"  
  6.     android:layout_width="match_parent"  
  7.     android:layout_height="match_parent">  
  8. </android.support.v4.view.ViewPager>  

 

3.Fragment1.java

  1. import android.app.Fragment;  
  2. import android.os.Bundle;  
  3. import android.view.LayoutInflater;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6.   
  7. public class Fragment1 extends Fragment{  
  8.     @Override  
  9.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  10.             Bundle savedInstanceState) {  
  11. //      return View.inflate(getActivity(), R.layout.fragment1, null);  
  12.         return inflater.inflate(R.layout.fragment1,container, false);  
  13.     }  
  14. }  

 

4.fragment1.xml布局文件

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent">  
  5.   
  6.     <TextView  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content"  
  9.         android:text="这是第一个页面" />  
  10.   
  11. </RelativeLayout>  

 

效果图如下:

技术分享

 

以上是关于FragmentPagerAdapter+ViewPager实现Tab切换效果的主要内容,如果未能解决你的问题,请参考以下文章

Fragment ViewPager 适配器

使用 FragmentPagerAdapter 的 FragmentTransaction

无法更新FragmentPagerAdapter中的片段

为啥我不能从 FragmentPagerAdapter 分离片段?

使用 ViewPager + FragmentPagerAdapter 处理方向更改

ViewPager中的FragmentPagerAdapter,FragmentStatePagerAdapter