Android Tab類型主界面總結

轉載至http://blog.csdn.NET/lmj623565791/article/details/24740977

 

Android現在實現Tab類型的界面方式越來越多,今天就把常見的實現方式給大家來個總結。目前寫了:

1、傳統的ViewPager實現

2、FragmentManager+Fragment實現

3、ViewPager+FragmentPagerAdapter實現

4、TabPageIndicator+ViewPager+FragmentPagerAdapter

 

1、傳統的ViewPager實現

主要就是ViewPager+ViewAdapter這個還是比較常見的,就不多說了

效果圖:

 

 

 

代碼:

 

package com.example.mainframework02;  
  
import java.util.ArrayList;  
import java.util.List;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.support.v4.view.PagerAdapter;  
import android.support.v4.view.ViewPager;  
import android.support.v4.view.ViewPager.OnPageChangeListener;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.ImageButton;  
import android.widget.ImageView;  
import android.widget.LinearLayout;  
  
public class TraditionalViewPagerAcvitity extends Activity  
{  
  
    /** 
     * ViewPager 
     */  
    private ViewPager mViewPager;  
    /** 
     * ViewPager的適配器 
     */  
    private PagerAdapter mAdapter;  
    private List<View> mViews;  
    private LayoutInflater mInflater;  
      
    private int currentIndex;  
  
    /** 
     * 底部四個按鈕 
     */  
    private LinearLayout mTabBtnWeixin;  
    private LinearLayout mTabBtnFrd;  
    private LinearLayout mTabBtnAddress;  
    private LinearLayout mTabBtnSettings;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        mInflater = LayoutInflater.from(this);  
        mViewPager = (ViewPager) findViewById(R.id.id_viewpager);  
          
        /** 
         * 初始化View 
         */  
        initView();  
          
        mViewPager.setAdapter(mAdapter);  
  
        mViewPager.setOnPageChangeListener(new OnPageChangeListener()  
        {  
  
            @Override  
            public void onPageSelected(int position)  
            {  
                resetTabBtn();  
                switch (position)  
                {  
                case 0:  
                    ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))  
                            .setImageResource(R.drawable.tab_weixin_pressed);  
                    break;  
                case 1:  
                    ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))  
                            .setImageResource(R.drawable.tab_find_frd_pressed);  
                    break;  
                case 2:  
                    ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))  
                            .setImageResource(R.drawable.tab_address_pressed);  
                    break;  
                case 3:  
                    ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))  
                            .setImageResource(R.drawable.tab_settings_pressed);  
                    break;  
                }  
  
                currentIndex = position;  
            }  
  
            @Override  
            public void onPageScrolled(int arg0, float arg1, int arg2)  
            {  
  
            }  
  
            @Override  
            public void onPageScrollStateChanged(int arg0)  
            {  
            }  
        });  
  
    }  
  
    protected void resetTabBtn()  
    {  
        ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))  
                .setImageResource(R.drawable.tab_weixin_normal);  
        ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))  
                .setImageResource(R.drawable.tab_find_frd_normal);  
        ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))  
                .setImageResource(R.drawable.tab_address_normal);  
        ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))  
                .setImageResource(R.drawable.tab_settings_normal);  
    }  
  
    private void initView()  
    {  
  
        mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);  
        mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);  
        mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);  
        mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);  
  
        mViews = new ArrayList<View>();  
        View first = mInflater.inflate(R.layout.main_tab_01, null);  
        View second = mInflater.inflate(R.layout.main_tab_02, null);  
        View third = mInflater.inflate(R.layout.main_tab_03, null);  
        View fourth = mInflater.inflate(R.layout.main_tab_04, null);  
        mViews.add(first);  
        mViews.add(second);  
        mViews.add(third);  
        mViews.add(fourth);  
  
        mAdapter = new PagerAdapter()  
        {  
            @Override  
            public void destroyItem(ViewGroup container, int position, Object object)  
            {  
                container.removeView(mViews.get(position));  
            }  
  
            @Override  
            public Object instantiateItem(ViewGroup container, int position)  
            {  
                View view = mViews.get(position);  
                container.addView(view);  
                return view;  
            }  
  
            @Override  
            public boolean isViewFromObject(View arg0, Object arg1)  
            {  
                return arg0 == arg1;  
            }  
  
            @Override  
            public int getCount()  
            {  
                return mViews.size();  
            }  
        };  
    }  
  
}  

 

 

 

3、ViewPager+Fragment實現

主要通過ViewPager和FragmentPagerAdapter一起來實現。

效果圖:

 

 

 

 

代碼:

主Activity

 

  1. package com.example.mainframework03;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.os.Bundle;  
  7. import android.support.v4.app.Fragment;  
  8. import android.support.v4.app.FragmentActivity;  
  9. import android.support.v4.app.FragmentPagerAdapter;  
  10. import android.support.v4.view.ViewPager;  
  11. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  12. import android.widget.ImageButton;  
  13. import android.widget.LinearLayout;  
  14.   
  15. public class MainActivity extends FragmentActivity  
  16. {  
  17.   
  18.     private ViewPager mViewPager;  
  19.     private FragmentPagerAdapter mAdapter;  
  20.     private List<Fragment> mFragments = new ArrayList<Fragment>();  
  21.       
  22.       
  23.     /** 
  24.      * 底部四個按鈕 
  25.      */  
  26.     private LinearLayout mTabBtnWeixin;  
  27.     private LinearLayout mTabBtnFrd;  
  28.     private LinearLayout mTabBtnAddress;  
  29.     private LinearLayout mTabBtnSettings;  
  30.   
  31.   
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState)  
  34.     {  
  35.         super.onCreate(savedInstanceState);  
  36.         setContentView(R.layout.activity_main);  
  37.         mViewPager = (ViewPager) findViewById(R.id.id_viewpager);  
  38.   
  39.           
  40.         initView();  
  41.           
  42.           
  43.   
  44.         mAdapter = new FragmentPagerAdapter(getSupportFragmentManager())  
  45.         {  
  46.   
  47.             @Override  
  48.             public int getCount()  
  49.             {  
  50.                 return mFragments.size();  
  51.             }  
  52.   
  53.             @Override  
  54.             public Fragment getItem(int arg0)  
  55.             {  
  56.                 return mFragments.get(arg0);  
  57.             }  
  58.         };  
  59.           
  60.         mViewPager.setAdapter(mAdapter);  
  61.           
  62.           
  63.         mViewPager.setOnPageChangeListener(new OnPageChangeListener()  
  64.         {  
  65.   
  66.             private int currentIndex;  
  67.   
  68.             @Override  
  69.             public void onPageSelected(int position)  
  70.             {  
  71.                 resetTabBtn();  
  72.                 switch (position)  
  73.                 {  
  74.                 case 0:  
  75.                     ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))  
  76.                             .setImageResource(R.drawable.tab_weixin_pressed);  
  77.                     break;  
  78.                 case 1:  
  79.                     ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))  
  80.                             .setImageResource(R.drawable.tab_find_frd_pressed);  
  81.                     break;  
  82.                 case 2:  
  83.                     ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))  
  84.                             .setImageResource(R.drawable.tab_address_pressed);  
  85.                     break;  
  86.                 case 3:  
  87.                     ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))  
  88.                             .setImageResource(R.drawable.tab_settings_pressed);  
  89.                     break;  
  90.                 }  
  91.   
  92.                 currentIndex = position;  
  93.             }  
  94.   
  95.             @Override  
  96.             public void onPageScrolled(int arg0, float arg1, int arg2)  
  97.             {  
  98.   
  99.             }  
  100.   
  101.             @Override  
  102.             public void onPageScrollStateChanged(int arg0)  
  103.             {  
  104.             }  
  105.         });  
  106.   
  107.     }  
  108.       
  109.     protected void resetTabBtn()  
  110.     {  
  111.         ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))  
  112.                 .setImageResource(R.drawable.tab_weixin_normal);  
  113.         ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))  
  114.                 .setImageResource(R.drawable.tab_find_frd_normal);  
  115.         ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))  
  116.                 .setImageResource(R.drawable.tab_address_normal);  
  117.         ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))  
  118.                 .setImageResource(R.drawable.tab_settings_normal);  
  119.     }  
  120.   
  121.     private void initView()  
  122.     {  
  123.   
  124.         mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);  
  125.         mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);  
  126.         mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);  
  127.         mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);  
  128.   
  129.         MainTab01 tab01 = new MainTab01();  
  130.         MainTab02 tab02 = new MainTab02();  
  131.         MainTab03 tab03 = new MainTab03();  
  132.         MainTab04 tab04 = new MainTab04();  
  133.         mFragments.add(tab01);  
  134.         mFragments.add(tab02);  
  135.         mFragments.add(tab03);  
  136.         mFragments.add(tab04);  
  137.     }  
  138. }  

 

 

 

還有4個TabFragment,下面貼一個,四個基本一樣

 

package com.example.mainframework03;  
  
import android.os.Bundle;  
import android.support.v4.app.Fragment;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
  
public class MainTab01 extends Fragment  
{  
  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)  
    {  
        return  inflater.inflate(R.layout.main_tab_01, container, false);  
      
    }  
  
}  


4、TabPageIndicator+ViewPager+FragmentPagerAdapter

 

 

 

1、頭部的佈局文件,這個很簡單:

 

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="wrap_content"  
    android:background="@color/light_blue"  
    android:orientation="horizontal" >  
  
  
    <ImageView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_gravity="center_vertical"  
        android:layout_marginLeft="8dp"  
        android:layout_marginRight="4dp"  
        android:src="@drawable/biz_navigation_tab_news_pressed" />  
  
  
    <ImageView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_gravity="center_vertical"  
        android:layout_marginLeft="4dp"  
        android:layout_marginRight="4dp"  
        android:src="@drawable/base_action_bar_back_divider" />  
  
  
    <TextView  
        android:id="@+id/headTV"  
        android:layout_width="0dp"  
        android:layout_height="wrap_content"  
        android:layout_gravity="center_vertical"  
        android:layout_marginLeft="4dp"  
        android:layout_weight="1"  
        android:text="CSDN資訊"  
        android:textColor="@color/white"  
        android:textSize="21sp"  
        android:textStyle="bold" >  
    </TextView>  
</LinearLayout>  


就顯示一個圖標和標題。
2、主佈局文件:

 

 

<LinearLayout 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"  
    android:background="#eee"  
    android:orientation="vertical" >  
  
  
    <include layout="@layout/main_head" />  
  
  
    <com.viewpagerindicator.TabPageIndicator  
        android:id="@+id/id_indicator"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:background="@color/transparentblue" >  
    </com.viewpagerindicator.TabPageIndicator>  
  
  
    <android.support.v4.view.ViewPager  
        android:id="@+id/id_pager"  
        android:layout_width="fill_parent"  
        android:layout_height="0dp"  
        android:layout_weight="1" />  
  
  
</LinearLayout>  


佈局中僅一個ViewPager,一個ViewPagerIndicator.(本例使用的是其中一種ViewPagerIndicator:TabPagerIndicator)

 

注意它應該緊鄰在ViewPager的上方或下方,總之要挨在一起。

 

 

3、主Activity

 

第1步:實例化ViewPager,給ViewPager設置Adapter
第2步:實例化TabPageIndicator,TabPageIndicator與ViewPager綁在一起
第3步:在Indicator上設置OnPagerChangeListner監聽器
第4步:定義Adapter(繼承FragmentPagerAdapter)

先實例化ViewPager,然後實例化TabPageIndicator,然後設置TabPageIndicator和ViewPager關聯,就是調用TabPageIndicator的setViewPager(ViewPager view)方法,這樣子就實現了點擊上面的Tab,下面的ViewPager切換;滑動ViewPager,上面的Tab跟着切換。
ViewPager的每一個Item我們使用的是Fragment,使用Fragment可以使佈局更加靈活一點,建議多用Fragment。
設置監聽的時候,需要用Indicator提供的OnPagerChangeListener方法

 

 

package com.zhy.csdndemo;  
  
  
import com.viewpagerindicator.TabPageIndicator;  
  
  
import android.os.Bundle;  
import android.support.v4.app.FragmentActivity;  
import android.support.v4.app.FragmentPagerAdapter;  
import android.support.v4.view.ViewPager;  
  
  
public class MainActivity extends FragmentActivity  
{  
    private TabPageIndicator mIndicator ;  
    private ViewPager mViewPager ;  
    private FragmentPagerAdapter mAdapter ;  
  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
      
        mIndicator = (TabPageIndicator) findViewById(R.id.id_indicator);  
        mViewPager = (ViewPager) findViewById(R.id.id_pager);  
        mAdapter = new TabAdapter(getSupportFragmentManager());  
        mViewPager.setAdapter(mAdapter);  
        mIndicator.setViewPager(mViewPager, 0);  
          
          
          
    }  
      
      
  
  
}  


TabAdapter.java

 

 

 

 

package com.zhy.csdndemo;  
  
  
import android.support.v4.app.Fragment;  
import android.support.v4.app.FragmentManager;  
import android.support.v4.app.FragmentPagerAdapter;  
  
  
public class TabAdapter extends FragmentPagerAdapter  
{  
  
  
    public static final String[] TITLES = new String[] { "業界", "移動", "研發", "程序員雜誌", "雲計算" };  
  
  
    public TabAdapter(FragmentManager fm)  
    {  
        super(fm);  
    }  
  
  
    @Override  
    public Fragment getItem(int arg0)  
    {  
        MainFragment fragment = new MainFragment(arg0);  
        return fragment;  
    }  
  
  
    @Override  
    public CharSequence getPageTitle(int position)  
    {  
        return TITLES[position % TITLES.length];  
    }  
  
  
    @Override  
    public int getCount()  
    {  
        return TITLES.length;  
    }  
  
  
}  


MainFragment.java

 

 

 

 

package com.zhy.csdndemo;  
  
  
import android.annotation.SuppressLint;  
import android.os.Bundle;  
import android.support.v4.app.Fragment;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.TextView;  
  
  
@SuppressLint("ValidFragment")  
public class MainFragment extends Fragment  
{  
  
  
    private int newsType = 0;  
  
  
    public MainFragment(int newsType)  
    {  
        this.newsType = newsType;  
    }  
  
  
    @Override  
    public void onActivityCreated(Bundle savedInstanceState)  
    {  
        super.onActivityCreated(savedInstanceState);  
    }  
  
  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)  
    {  
        View view = inflater.inflate(R.layout.tab_item_fragment_main, null);  
        TextView tip = (TextView) view.findViewById(R.id.id_tip);  
        tip.setText(TabAdapter.TITLES[newsType]);  
        return view;  
    }  
  
  
}  


4、在styles.xml中自定義Theme

 

<style name="MyTheme" parent="AppBaseTheme">  
        <item name="vpiTabPageIndicatorStyle">@style/MyWidget.TabPageIndicator</item>  
        <item name="android:windowBackground">@drawable/init_pic</item>  
        <item name="android:windowNoTitle">true</item>    
        <item name="android:animationDuration">5000</item>  
        <item name="android:windowContentOverlay">@null</item>    
    </style>  
      
    <style name="MyWidget.TabPageIndicator" parent="Widget">  
        <item name="android:gravity">center</item>  
        <item name="android:background">@drawable/vpi__tab_indicator</item>  
        <item name="android:paddingLeft">22dip</item>  
        <item name="android:paddingRight">22dip</item>  
        <item name="android:paddingTop">8dp</item>  
        <item name="android:paddingBottom">8dp</item>  
        <item name="android:textAppearance">@style/MyTextAppearance.TabPageIndicator</item>  
        <item name="android:textSize">16sp</item>  
        <item name="android:maxLines">1</item>  
    </style>  
  
  
    <style name="MyTextAppearance.TabPageIndicator" parent="Widget">  
        <item name="android:textStyle">bold</item>  
        <item name="android:textColor">@color/black</item>  
    </style>  


在AndroidManifest中註冊使用:

 

 

 

 

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    package="com.zhy.csdndemo"  
    android:versionCode="1"  
    android:versionName="1.0" >  
  
  
    <uses-sdk  
        android:minSdkVersion="13"  
        android:targetSdkVersion="17" />  
  
  
    <application  
        android:allowBackup="true"  
        android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name"  
        android:theme="@style/AppTheme" >  
        <activity  
            android:name="com.zhy.csdndemo.MainActivity"  
            android:label="@string/app_name"   
            android:theme="@style/MyTheme">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
  
  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
    </application>  
  
  
</manifest>  

 

 

 

 

 


 

 

 

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章