zoukankan      html  css  js  c++  java
  • 自定义TabHost,TabWidget样式 .

    大家好,今天我为大家分享TabHost中怎样修改TabWidget样式。在很多界面美观的应用中很多都用到了TabHost,但他们要比系统默认的要漂亮得多。先看几张图:

     

                                 京东商城底部菜单栏

                                新浪微博底部菜单栏

       好了,看到这些漂亮的菜单栏是不是很惊讶,你可能会说用Button就可以实现啊 ,可是用Button的话控制显示的内容很麻烦,不如用TabHost控制效率更高。很想知道用TabHost是怎么实现的吧,下面就来研究如何实现这种漂亮的TabHost。先看一下效果图:

     

    界面比较简单,要想做得漂亮换几张图片就可以了。

      第一步:先在布局(这里用了main.xml创建时自动生成的)里面放上TabHost ,只要将TabHost控件托至屏幕中就可:

    1. <?xml version="1.0" encoding="utf-8"?>  
    2.     <TabHost android:id="@+id/tabhost"   
    3.       android:layout_width="fill_parent"   
    4.       android:layout_height="fill_parent"   
    5.       xmlns:android="http://schemas.android.com/apk/res/android">  
    6.         <LinearLayout android:layout_width="fill_parent"   
    7.           android:id="@+id/linearLayout1"   
    8.           android:layout_height="fill_parent"   
    9.           android:orientation="vertical">  
    10.             <TabWidget android:layout_width="fill_parent"   
    11.               android:layout_height="wrap_content"   
    12.               android:id="@android:id/tabs"></TabWidget>  
    13.             <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@android:id/tabcontent">  
    14.                 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tab1"></LinearLayout>  
    15.                 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tab2"></LinearLayout>  
    16.                 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tab3"></LinearLayout>  
    17.             </FrameLayout>  
    18.         </LinearLayout>  
    19.     </TabHost>  


    这里我们已经把LinearLayout和TextView去掉了,并将“xmlns:android="……" ”添加大TabHost里了,这里要注意我们将TabHost的id定义为自己定义的id比不用android规定的id="@android:id/tabhost"。

     

    第二步:创建显示此TabWidget的布局tabmini.xml:

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="40dp"  
    5.     android:paddingLeft="5dip"  
    6.     android:paddingRight="5dip"  
    7.     android:background="@drawable/head_bg">    
    8.       
    9.     <TextView android:id="@+id/tab_label"    
    10.         android:layout_width="fill_parent"  
    11.         android:layout_height="wrap_content"  
    12.         android:layout_centerInParent="true"  
    13.         android:gravity="center"  
    14.         android:textColor="#000000"  
    15.         android:textStyle="bold"  
    16.         android:background="@drawable/tabmini"/>   
    17. </RelativeLayout>  


    第三步:创建一个selector在drawable里面 命名tabmini.xml,用来点击TabHost的一个tab时TextView的变化:

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <selector  
    3.   xmlns:android="http://schemas.android.com/apk/res/android">  
    4.     <item android:state_selected="true"  
    5.         android:drawable="@drawable/add_managebg_down"/>  
    6.     <item android:state_selected="false"  
    7.         android:drawable="@drawable/add_managebg"/>  
    8. </selector>  


    第四步:在Activity里实现TabHost:

    1. package cn.li.tabstyle;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5. import android.view.LayoutInflater;  
    6. import android.view.View;  
    7. import android.widget.TabHost;  
    8. import android.widget.TextView;  
    9.   
    10. public class TabHostStyleActivity extends Activity {  
    11.     /** Called when the activity is first created. */  
    12.     @Override  
    13.     public void onCreate(Bundle savedInstanceState) {  
    14.         super.onCreate(savedInstanceState);  
    15.         setContentView(R.layout.main);  
    16.           
    17.         View niTab = (View) LayoutInflater.from(this).inflate(R.layout.tabmini, null);  
    18.         TextView text0 = (TextView) niTab.findViewById(R.id.tab_label);  
    19.         text0.setText("ni");  
    20.           
    21.         View woTab = (View) LayoutInflater.from(this).inflate(R.layout.tabmini, null);  
    22.         TextView text1 = (TextView) woTab.findViewById(R.id.tab_label);  
    23.         text1.setText("wo");  
    24.           
    25.         View taTab = (View) LayoutInflater.from(this).inflate(R.layout.tabmini, null);  
    26.         TextView text2 = (TextView) taTab.findViewById(R.id.tab_label);  
    27.         text2.setText("ta");  
    28.           
    29.         View weTab = (View) LayoutInflater.from(this).inflate(R.layout.tabmini, null);  
    30.         TextView text3 = (TextView) weTab.findViewById(R.id.tab_label);  
    31.         text3.setText("we");  
    32.           
    33.         TabHost tabHost = (TabHost)findViewById(R.id.tabhost);  
    34.         tabHost.setup();   //Call setup() before adding tabs if loading TabHost using findViewById().   
    35.           
    36.         tabHost.addTab(tabHost.newTabSpec("nitab").setIndicator(niTab).setContent(R.id.tab1));  
    37.         tabHost.addTab(tabHost.newTabSpec("wotab").setIndicator(woTab).setContent(R.id.tab2));  
    38.         tabHost.addTab(tabHost.newTabSpec("tatab").setIndicator(taTab).setContent(R.id.tab3));  
    39.         tabHost.addTab(tabHost.newTabSpec("wetab").setIndicator(weTab).setContent(R.id.tab4));  
    40.     }  
    41. }  


    这里我们用findViewById创建了TabHost,这样的话我们就需要在添加tab时调用TabHost的setup()方法;这里我们添加内容时添加的是布局,我们完全可以换成自己创建的Activity。

    好了,让我们来看看运行效果吧:

     



    好了,我们自定义的TabHost算是结束了。不过看到Activity里的代码很多都是重复的我们可以这样把他们简化:

    1. package cn.li.tabstyle;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5. import android.view.LayoutInflater;  
    6. import android.view.View;  
    7. import android.widget.TabHost;  
    8. import android.widget.TextView;  
    9.   
    10. public class TabHostStyleActivity extends Activity {  
    11.     /** Called when the activity is first created. */  
    12.     String[] title = new String[]{"ni","wo","ta","we"};  
    13.     View userTab,articeTab,feedTab,weTab;  
    14.     View[] tabs = new View[]{userTab,articeTab,feedTab,weTab};  
    15.     int[] tabIds = new int[]{R.id.tab1,R.id.tab2,R.id.tab3,R.id.tab4};  
    16.     @Override  
    17.     public void onCreate(Bundle savedInstanceState) {  
    18.         super.onCreate(savedInstanceState);  
    19.         setContentView(R.layout.main);  
    20.           
    21.         TabHost tabHost = (TabHost)findViewById(R.id.tabhost);  
    22.         tabHost.setup();   //Call setup() before adding tabs if loading TabHost using findViewById().   
    23.           
    24.         for(int i=0;i<tabs.length;i++){  
    25.             tabs[i] = (View) LayoutInflater.from(this).inflate(R.layout.tabmini, null);  
    26.             TextView text = (TextView) tabs[i].findViewById(R.id.tab_label);  
    27.             text.setText(title[i]);              
    28.             tabHost.addTab(tabHost.newTabSpec(title[i]).setIndicator(tabs[i]).setContent(tabIds[i]));  
    29.         }  
    30.     }  
    31. }  


     

  • 相关阅读:
    艾氏筛法资料
    CF Soldier and Cards (模拟)
    CF Soldier and Badges (贪心)
    POJ 1308 Is It A Tree? (并查集)
    HDU 1272 小希的迷宫 (并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 1611 The Suspects (并查集)
    POJ 2236 Wireless Network (并查集)
    Iptables-linux服务器做路由转发
    asdf
  • 原文地址:https://www.cnblogs.com/firecode/p/2815960.html
Copyright © 2011-2022 走看看