自定义ActionBar+fragment实现页面切换


之前我们使用ViewPager+Fragment区域内头部导航,在Android 3.0之后Google增加了新的ActionBar,可方便的实现屏幕Head部区域的 设计如返回键、标题、ICON、Logo、自定义View以及菜单等,并可实现Tab导航,下面我们就使用ActionBar实现下图所示界面设计:

二、案例主要组件

  1、编写TBActivity

 
   
[java] view plain copy print ?
  1. public class TBActivity extends Activity {  
  2.     private ActionBar actionBar;  
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.activity_tb);  
  6.         initActionBar();  
  7.         initTab();  
  8.     }  
  9.     @SuppressLint("NewApi")  
  10.     private void initActionBar(){  
  11.         actionBar=super.getActionBar();//获得ActionBar  
  12.         actionBar.setDisplayShowHomeEnabled(true);//显示home区域  
  13.         actionBar.setDisplayHomeAsUpEnabled(true);//显示返回图片  
  14.         actionBar.setHomeAsUpIndicator(R.drawable.back);//设置返回图标  
  15.         //去除默认的ICON图标  
  16.          Drawable colorDrawable=new   
  17.                  ColorDrawable(android.R.color.transparent);  
  18.          actionBar.setIcon(colorDrawable);  
  19.          //设置自定义View  
  20.          actionBar.setDisplayShowCustomEnabled(true);  
  21.          actionBar.setCustomView(R.layout.head_logo);  
  22.          //设置导航模式为Tabs方式  
  23.          actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
  24.     }  
  25.     private void initTab(){  
  26.         Bundle bundle1=new Bundle();  
  27.         bundle1.putString("title""挖掘机区块信息");  
  28.         Tab tab1= actionBar.newTab().setText("挖掘机").setTabListener(  
  29.            new TabListener(this"挖掘机", FirstFragment.class,bundle1));  
  30.          actionBar.addTab(tab1);  
  31.            
  32.          Bundle bundle2=new Bundle();  
  33.          bundle2.putString("title""装载机区块信息");  
  34.          Tab tab2=actionBar.newTab().setText("装载机").setTabListener(  
  35.                   new TabListener(this"装载机",  
  36.  SecondFragment.class,bundle2));  
  37.          actionBar.addTab(tab2);  
  38.            
  39.          Bundle bundle3=new Bundle();  
  40.          bundle3.putString("title""平地机区块信息");  
  41.          Tab tab3=actionBar.newTab().setText("平地机").setTabListener(  
  42.                 new TabListener(this,   
  43. "平地机",ThirdFragment.class,bundle3));  
  44.          actionBar.addTab(tab3);  
  45.          Bundle bundle4=new Bundle();  
  46.          bundle4.putString("title""更多区块信息");  
  47.          Tab tab4=actionBar.newTab().setText("更多").setTabListener(  
  48.                     new TabListener(this,   
  49. "更多", FourFragment.class,bundle4));  
  50.          actionBar.addTab(tab4);              
  51.     }  
  52.     public boolean onCreateOptionsMenu(Menu menu) {  
  53.         // Inflate the menu; this adds items to the action bar if it is present.  
  54.         getMenuInflater().inflate(R.menu.tb, menu);  
  55.         return true;  
  56.     }  
  57.   
  58. }  
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(this, "挖掘机", FirstFragment.class,bundle1));
         actionBar.addTab(tab1);
         
         Bundle bundle2=new Bundle();
         bundle2.putString("title", "装载机区块信息");
         Tab tab2=actionBar.newTab().setText("装载机").setTabListener(
                  new TabListener(this, "装载机",
 SecondFragment.class,bundle2));
         actionBar.addTab(tab2);
         
         Bundle bundle3=new Bundle();
         bundle3.putString("title", "平地机区块信息");
         Tab tab3=actionBar.newTab().setText("平地机").setTabListener(
                new TabListener(this, 
"平地机",ThirdFragment.class,bundle3));
         actionBar.addTab(tab3);
         Bundle bundle4=new Bundle();
         bundle4.putString("title", "更多区块信息");
         Tab tab4=actionBar.newTab().setText("更多").setTabListener(
                    new TabListener(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组件

 
   
[java] view plain copy print ?
  1. public class TabListenerextends Fragment>   
  2. implements android.app.ActionBar.TabListener{  
  3.     private Fragment mFragment;  
  4.     private final Activity mActivity;  
  5.     private final String mTag;  
  6.     private final Class mClass;  
  7.     private Bundle bundle;  
  8.     public TabListener(Activity activity, String tag, Class clz,Bundle bundle) {  
  9.         mActivity = activity;  
  10.         mTag = tag;  
  11.         mClass = clz;  
  12.         this.bundle=bundle;  
  13.     }  
  14.   
  15.     @Override  
  16.     public void onTabSelected(Tab tab, FragmentTransaction ft) {  
  17.         // TODO Auto-generated method stub  
  18.         if(mFragment==null){  
  19.             mFragment=Fragment.instantiate(mActivity, mClass.getName());  
  20.             mFragment.setArguments(bundle);//向Fragment传递参数  
  21.             ft.add(android.R.id.content,mFragment, mTag);  
  22.         }else{  
  23.             ft.attach(mFragment);  
  24.         }      
  25.     }  
  26.     @Override  
  27.     public void onTabUnselected(Tab tab, FragmentTransaction ft) {  
  28.         if(mFragment!=null){  
  29.             ft.detach(mFragment);  
  30.         }  
  31.     }  
  32.     @Override  
  33.     public void onTabReselected(Tab tab, FragmentTransaction ft) {  
  34.   
  35.     }  
  36.   
  37. }  
public class TabListener 
implements android.app.ActionBar.TabListener{
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class mClass;
    private Bundle bundle;
    public TabListener(Activity activity, String tag, Class 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为例(其他在这里无差别)

 
   
[java] view plain copy print ?
  1. public class FirstFragment extends Fragment {  
  2.     private String title;  
  3.      @Override  
  4.     public void setArguments(Bundle bundle) {  
  5.         // TODO Auto-generated method stub  
  6.         title=bundle.getString("title");  
  7.     }  
  8.   
  9.     @Override  
  10.         public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  11.                 Bundle savedInstanceState) {  
  12.             TextView textView = new TextView(getActivity());  
  13.             textView.setText(title);  
  14.             textView.setTextSize(20);  
  15.             textView.setTextColor(Color.RED);  
  16.             textView.setGravity(Gravity.CENTER);  
  17.             LinearLayout layout = new LinearLayout(getActivity());  
  18.             LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
  19.             layout.addView(textView, params);  
  20.             return layout;  
  21.         }  
  22. }  
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的样式

 
   
[html] view plain copy print ?
  1.    <style name="MyActionBar" parent="@android:style/Theme.Holo.Light">  
  2.           <item name="android:actionBarStyle">@style/actionbar_styleitem>  
  3.            
  4.           <item name="android:actionBarTabStyle">@style/MyActionBarTabStyleitem>  
  5.             
  6.           <item name="android:actionBarTabTextStyle">@style/MyActionBarTabTextStyleitem>       
  7.     style>  
  8.        
  9.         
  10.     <style name="actionbar_style" parent="@android:style/Widget.Holo.Light.ActionBar">  
  11.         <item name="android:background">#EA4609item>  
  12.     <item name="android:titleTextStyle">@style/ActionBar_titleStyleitem>  
  13.     <item name="android:icon">@android:color/transparentitem>   
  14.     <item name="android:itemPadding">20dipitem>   
  15.     style>  
  16.     
  17.  <style name="MyActionBarTabStyle"   
  18. parent="@android:style/Widget.Holo.Light.ActionBar.TabView">    
  19.      <item name="android:background">@drawable/tab_selectoritem>  
  20.      <item name="android:paddingLeft">0dpitem>    
  21.      <item name="android:paddingRight">0dpitem>  
  22.         <item name="android:height">100dpitem>  
  23.   style>    
  24.            
  25.  <style name="MyActionBarTabTextStyle"   
  26.         parent="@android:style/Widget.Holo.Light.ActionBar.TabText">            
  27.         <item name="android:textColor">#666666item>    
  28.         <item name="android:textSize">18spitem>       
  29. style>  
   
     
      
    
  
   
         
 

在TBActivity上设置样式android:theme=” @style/MyActionBar

你可能感兴趣的:(android)