Android自定義TabBar

轉載請說明出處:http://www.sunhome.org.cn

我發現現在的移動開發界面都被iOS主導了,UI動不動設計出來的東西都是ios的風格,對於一個做Android的程序員來說甚是苦惱啊,爲了適應這種環境和氛圍,今天我們來自定義一個TabBar,這個是移動開發很常用的一個組件。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    
    <!-- TabBarItem -->
    <declare-styleable name="TabBarItem">
	    <attr name="checked_item" format="boolean"></attr>
	    <attr name="nomal_icon" format="reference"></attr>
	    <attr name="check_icon" format="reference"></attr>
	    <attr name="text" format="string"></attr>
	    <attr name="text_size" format="dimension"></attr>
	    <attr name="nomal_color" format="color"></attr>
	    <attr name="check_color" format="color"></attr>
    </declare-styleable>
    
</resources>
定義界面xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:hyman="http://schemas.android.com/apk/res/com.xxx.xx"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_base_nomal_background_color"
    android:orientation="vertical" >

	<FrameLayout
	    android:id="@+id/fragment_container"
	    android:layout_width="match_parent"
	    android:layout_height="0dip"
	    android:layout_weight="1"/>
	
	<View 
	    android:layout_width="match_parent"
	    android:layout_height="1px"
	    android:background="@color/color_app_base_7"/>
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="60dip"
        android:background="@color/main_bottom_tab_bg_color"
        android:orientation="horizontal">
        <com.xxx.xx.view.TabBarItem
            android:id="@+id/id_indicator_one"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            hyman:checked_item="true"
            hyman:nomal_icon="@drawable/tab_bar_home_normal"
            hyman:check_icon="@drawable/tab_bar_home_current"
            hyman:text="@string/activity_main_tab1_title"
            hyman:text_size="@dimen/app_nomal_text_size"
            hyman:nomal_color="@color/color_app_base_2"
            hyman:check_color="@color/color_app_base_1"/>
        
        <com.xxx.xx.view.TabBarItem
            android:id="@+id/id_indicator_two"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            hyman:checked_item="false"
            hyman:nomal_icon="@drawable/tab_bar_market_normal"
            hyman:check_icon="@drawable/tab_bar_market_current"
            hyman:text="@string/activity_main_tab2_title"
            hyman:text_size="@dimen/app_nomal_text_size"
            hyman:nomal_color="@color/color_app_base_2"
            hyman:check_color="@color/color_app_base_1"/>

        <com.xxx.xx.view.TabBarItem
            android:id="@+id/id_indicator_three"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            hyman:checked_item="false"
            hyman:nomal_icon="@drawable/tab_bar_market_normal"
            hyman:check_icon="@drawable/tab_bar_market_current"
            hyman:text="@string/activity_main_tab3_title"
            hyman:text_size="@dimen/app_nomal_text_size"
            hyman:nomal_color="@color/color_app_base_2"
            hyman:check_color="@color/color_app_base_1"/>

        <com.xxx.xx.view.TabBarItem
            android:id="@+id/id_indicator_four"
            android:layout_width="0dp"        
            android:layout_height="fill_parent"
            android:layout_weight="1"
            hyman:checked_item="false"
            hyman:nomal_icon="@drawable/tab_bar_basket_normal"
            hyman:check_icon="@drawable/tab_bar_basket_current"
            hyman:text="@string/activity_main_tab4_title"
            hyman:text_size="@dimen/app_nomal_text_size"
            hyman:nomal_color="@color/color_app_base_2"
            hyman:check_color="@color/color_app_base_1"/>

        <com.xxx.xx.view.TabBarItem
            android:id="@+id/id_indicator_five"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            hyman:checked_item="false"
            hyman:nomal_icon="@drawable/tab_bar_personal_normal"
            hyman:check_icon="@drawable/tab_bar_personal_current"
            hyman:text="@string/activity_main_tab5_title"
            hyman:text_size="@dimen/app_nomal_text_size"
            hyman:nomal_color="@color/color_app_base_2"
            hyman:check_color="@color/color_app_base_1"/>
    </LinearLayout>
</LinearLayout>

自定義TabBarItem

package com.guozha.buy.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.guozha.buy.R;
import com.guozha.buy.util.DimenUtil;
import com.guozha.buy.util.LogUtil;

/**
 * TabBar的按鈕控件
 * @author PeggyTong
 *
 */
public class TabBarItem extends LinearLayout{
	
	private static final int ICON_HEIGHT = 32;
	
	private boolean isChoosed;
	private String mTextContent;
	private int mTextSize;
	private int mTextNomalColor;
	private int mTextCheckColor;
	private Bitmap mNomalIcon;
	private Bitmap mCheckIcon;
	
	private ImageView mBtnImage;
	private TextView mBtnText;
	
	public TabBarItem(Context context) {
		this(context, null);
	}

	public TabBarItem(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}
	
	public TabBarItem(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		initTabBarItem(context, attrs);
	}

	/**
	 * 初始化
	 * @param context
	 * @param attrs
	 */
	private void initTabBarItem(Context context, AttributeSet attrs) {
		initTabItem(context, attrs);  //獲取尺寸
		addChilds(context);			  //添加子view
		changeCheckedStatus();		  //根據狀態顯示當前view
	}

	/**
	 * 添加子控件
	 * @param context
	 */
	private void addChilds(Context context) {
		setOrientation(LinearLayout.VERTICAL);
		setGravity(Gravity.CENTER);
		
		mBtnImage = new ImageView(context);
		mBtnImage.setScaleType(ScaleType.CENTER_INSIDE);
		mBtnImage.setLayoutParams(
				new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, DimenUtil.dp2px(context, ICON_HEIGHT)));
		
		mBtnText = new TextView(context);
		LogUtil.e("mTextSize = " + mTextSize);
		mBtnText.setText(mTextContent);
		mBtnText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
		mBtnText.setLayoutParams(
				new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
		addView(mBtnImage);
		addView(mBtnText);
	}
	
	/**
	 * 改變當前顯示狀態
	 */
	private void changeCheckedStatus() {
		if(isChoosed){
			mBtnImage.setImageBitmap(mCheckIcon);
			mBtnText.setTextColor(mTextCheckColor);
		}else{
			mBtnImage.setImageBitmap(mNomalIcon);
			mBtnText.setTextColor(mTextNomalColor);
		}
	}
	
	/**
	 * 設置爲選中狀態
	 */
	public void setCheckedItem(){
		isChoosed = true;
		changeCheckedStatus();
	}
	
	/**
	 * 設置爲未選中狀態
	 */
	public void setDisCheckedItem(){
		isChoosed = false;
		changeCheckedStatus();
	}
	
	/**
	 * 初始配置的數據
	 * @param context
	 * @param attrs
	 */
	private void initTabItem(Context context, AttributeSet attrs){
		TypedArray typeArr = context.obtainStyledAttributes(attrs, R.styleable.TabBarItem);
		int count = typeArr.getIndexCount();
		for(int i = 0; i < count; i++){
			int attr = typeArr.getIndex(i);
			switch(attr){
			case R.styleable.TabBarItem_checked_item:
				isChoosed = typeArr.getBoolean(attr, false);
				break;
			case R.styleable.TabBarItem_text:
				mTextContent = typeArr.getString(attr);
				break;
			case R.styleable.TabBarItem_text_size:
				mTextSize = (int) typeArr.getDimension(attr, TypedValue.applyDimension
						(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));
				break;
			case R.styleable.TabBarItem_nomal_color:
				mTextNomalColor = typeArr.getColor(attr, getResources().getColor(R.color.color_app_base_2));
				break;
			case R.styleable.TabBarItem_check_color:
				mTextCheckColor = typeArr.getColor(attr, getResources().getColor(R.color.color_app_base_1));
				break;
			case R.styleable.TabBarItem_nomal_icon:
				mNomalIcon = ((BitmapDrawable)typeArr.getDrawable(attr)).getBitmap();
				break;
			case R.styleable.TabBarItem_check_icon:
				mCheckIcon = ((BitmapDrawable)typeArr.getDrawable(attr)).getBitmap();
				break;
			}
		}
		typeArr.recycle();
	}
}
如果是多個Tab切換,可以使用Fragment

添加初始界面的Fragment

		//添加一個fragment
		getSupportFragmentManager().beginTransaction()
			.add(R.id.fragment_container, mFragments.get(0)).commit();
替換Fragment

		getSupportFragmentManager().beginTransaction()
			.replace(R.id.fragment_container, mFragments.get(mCurrentItem))
			.addToBackStack(null).commit();

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