Android典型界面設計(4)——使用ActionBar+Fragment實現tab切換


一、問題描述

  之前我們使用ViewPager+Fragment區域內頭部導航,在Android 3.0之后Google增加了新的ActionBar,可方便的實現屏幕Head部區域的 設計如返回鍵、標題、ICON、Logo、自定義View以及菜單等,並可實現Tab導航,下面我們就使用ActionBar實現下圖所示界面設計:

二、案例主要組件

  1、編寫TBActivity

public class TBActivity extends Activity {
    private ActionBar actionBar;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tb);
        initActionBar();
        initTab();
    }
    @SuppressLint("NewApi")
    private void initActionBar(){
        actionBar=super.getActionBar();//獲得ActionBar
        actionBar.setDisplayShowHomeEnabled(true);//顯示home區域
        actionBar.setDisplayHomeAsUpEnabled(true);//顯示返回圖片
        actionBar.setHomeAsUpIndicator(R.drawable.back);//設置返回圖標
        //去除默認的ICON圖標
         Drawable colorDrawable=new 
                 ColorDrawable(android.R.color.transparent);
         actionBar.setIcon(colorDrawable);
         //設置自定義View
         actionBar.setDisplayShowCustomEnabled(true);
         actionBar.setCustomView(R.layout.head_logo);
         //設置導航模式為Tabs方式
         actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    }
    private void initTab(){
        Bundle bundle1=new Bundle();
        bundle1.putString("title", "挖掘機區塊信息");
        Tab tab1= actionBar.newTab().setText("挖掘機").setTabListener(
           new TabListener<FirstFragment>(this, "挖掘機", FirstFragment.class,bundle1));
         actionBar.addTab(tab1);
         
         Bundle bundle2=new Bundle();
         bundle2.putString("title", "裝載機區塊信息");
         Tab tab2=actionBar.newTab().setText("裝載機").setTabListener(
                  new TabListener<SecondFragment>(this, "裝載機",
 SecondFragment.class,bundle2));
         actionBar.addTab(tab2);
         
         Bundle bundle3=new Bundle();
         bundle3.putString("title", "平地機區塊信息");
         Tab tab3=actionBar.newTab().setText("平地機").setTabListener(
                new TabListener<ThirdFragment>(this, 
"平地機",ThirdFragment.class,bundle3));
         actionBar.addTab(tab3);
         Bundle bundle4=new Bundle();
         bundle4.putString("title", "更多區塊信息");
         Tab tab4=actionBar.newTab().setText("更多").setTabListener(
                    new TabListener<FourFragment>(this, 
"更多", FourFragment.class,bundle4));
         actionBar.addTab(tab4);            
    }
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.tb, menu);
        return true;
    }

}

  2、TabListener組件

public class TabListener<T extends Fragment> 
implements android.app.ActionBar.TabListener{
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;
    private Bundle bundle;
    public TabListener(Activity activity, String tag, Class<T> clz,Bundle bundle) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
        this.bundle=bundle;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        if(mFragment==null){
            mFragment=Fragment.instantiate(mActivity, mClass.getName());
            mFragment.setArguments(bundle);//向Fragment傳遞參數
            ft.add(android.R.id.content,mFragment, mTag);
        }else{
            ft.attach(mFragment);
        }    
    }
    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if(mFragment!=null){
            ft.detach(mFragment);
        }
    }
    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }

}

  3、設計四個tab區域的Fragment

  分別為:(FirstFragment、SecondFragment、ThirdFragment、FourFragment),這里以FirstFragment為例(其他在這里無差別)

public class FirstFragment extends Fragment {
    private String title;
     @Override
    public void setArguments(Bundle bundle) {
        // TODO Auto-generated method stub
        title=bundle.getString("title");
    }

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            TextView textView = new TextView(getActivity());
            textView.setText(title);
            textView.setTextSize(20);
            textView.setTextColor(Color.RED);
            textView.setGravity(Gravity.CENTER);
            LinearLayout layout = new LinearLayout(getActivity());
            LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            layout.addView(textView, params);
            return layout;
        }
}

  4、定義ActionBar的樣式

   <style name="MyActionBar" parent="@android:style/Theme.Holo.Light">
          <item name="android:actionBarStyle">@style/actionbar_style</item>
         <!--  給操作欄中的選項標簽定義樣式資源 -->
          <item name="android:actionBarTabStyle">@style/MyActionBarTabStyle</item>
          <!-- 給導航選項標簽中的文本定義樣式資源。 -->
          <item name="android:actionBarTabTextStyle">@style/MyActionBarTabTextStyle</item>     
    </style>
     
    <!-- actionbar樣式 -->  
    <style name="actionbar_style" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">#EA4609</item>
    <item name="android:titleTextStyle">@style/ActionBar_titleStyle</item>
    <item name="android:icon">@android:color/transparent</item> 
    <item name="android:itemPadding">20dip</item> 
    </style>
<!-- Tab選項標簽的樣式 -->  
 <style name="MyActionBarTabStyle" 
parent="@android:style/Widget.Holo.Light.ActionBar.TabView">  
     <item name="android:background">@drawable/tab_selector</item>
     <item name="android:paddingLeft">0dp</item>  
     <item name="android:paddingRight">0dp</item>
        <item name="android:height">100dp</item>
  </style>  
       <!-- Tab選項標簽字體的樣式 -->  
 <style name="MyActionBarTabTextStyle" 
        parent="@android:style/Widget.Holo.Light.ActionBar.TabText">          
        <item name="android:textColor">#666666</item>  
        <item name="android:textSize">18sp</item>     
</style>

在TBActivity上設置樣式android:theme=” @style/MyActionBar

 

  想要了解更多內容的小伙伴,可以點擊查看源碼,親自運行測試。

  疑問咨詢或技術交流,請加入官方QQ群:JRedu技術交流 (452379712)

 

作者: 傑瑞教育
出處: http://www.cnblogs.com/jerehedu/ 
本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM