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();

时间: 2024-11-08 23:53:51

Android自定义TabBar的相关文章

android自定义tabbar,并带badgeview消息提示

最早的时候,我用的tab都是在屏幕底端的,后来慢慢的流行在屏幕顶端了,按照用户体验来说,顶部确实比底部好,不仅可以防止按到返回键或者Home等引起误操作,而且tab标题在头顶很显眼很醒目. 一开始朋友推荐使用viewpageindicator,这个可以在github上有例子,大家如果没什么特殊需求,基本可以满足要求.根据项目要求我就使用了viewpageindicator,后来项目要求有消息提示,就像ios的badge一样,因此就对viewpageindicator进行修改,改了之后,就出现了下

Android 自定义Gallery浏览图片

之前写的<Android ImageSwitcher和Gallery的使用>一文中提到我在教室一下午为实现那个效果找各种资料.期间在网上找了一个个人觉得比较不错的效果,现在贴图上来: 其实这个效果使用的知识点就是图像的获取.创建.缩放.旋转.Matrix类.Canvas类等,另外就是自定义的Gallery控件. 相信大家都期待马上上代码了吧,嘻嘻.(注释比较多,相信大家都能看懂.) main.xml: <?xml version="1.0" encoding=&quo

Android自定义View探索(一)—生命周期

Activity代码: public class FiveActivity extends AppCompatActivity { private MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("log", "Activity生命周期:onCreate"); setConte

IOS开发-关于自定义TabBar条

今天在做项目的时候,突然有一个模块需要自定义TabBar条. 在平常很多做项目的时候,都没有去自定义过,大部分都是使用系统自带的.今天整理一个自定义TabBar条的步骤. 首先看下我们最终实现的效果: 首先需要继承UItabBar自定义一个自己的tabBar .h #import <UIKit/UIKit.h> @class THTabBar; @protocol THTabBarDelegate <UITabBarDelegate> @optional - (void)tabBa

自定义TabBar

UITabBarController是在IOS应用开发中很常用的一个类,继承于UIViewController,来实现多个视图间的切换,但很多时候系统自带的TabBar不能满足我们的需求,系统自带的一些属性我们往往无法修改,像切换项的图片的大小,这时候就需要我们自定义TabBar.例如,我们想实现下方的TabBar的这个效果,使用系统的就无法完成. 演示所需图片下载地址http://download.csdn.net/detail/zsmile123/8136531 --------------

android自定义UI模板图文详解

不知道大家在实际开发中有没有自定义过UI模板?今天花时间研究了一下android中自定义UI模板,与大家分享一下. 每个设计良好的App都是自定义标题栏,在自定义标题栏的过程中大部分人可能都是自定义一个标题的xml文件,然后在需要的地方直接通过include来引用,这比起在每个布局文件中写标题栏已经进化很多了,但仍然不是最简单有效的方法,我们为什么不能自定义一个标题控件呢?今天就带大家自己做一个标题栏控件.效果图如下: 开始啦: 第一步:自定义xml属性 新建一个android项目,在value

Android自定义进度条样式

最近在做一个widget,上面需要一个progressbar,产品经理和设计师给出来的东西是要实现一个圆角的progress和自定义的颜色,研究一小下,分享出来给大家哦. 测试于:Android4.0+ 操作步骤: 1.创建你的layout文件引用progressbar如下,标红处引用你自定的样式: <ProgressBar android:id="@+id/progressDownload" style="?android:attr/progressBarStyleH

Android 自定义RecyclerView 实现真正的Gallery效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38173061 ,本文出自:[张鸿洋的博客] 上一篇博客我使用自定义HorizontalScrollView写了一个具有HorizontalScrollView效果和ViewPager特性的横向图片轮播,详见:Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果.其实制作横向滚动的不得不说另一个控件,就是Google

Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScr