转载请说明出处: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();

Android自定义TabBar的更多相关文章

  1. 自定义tabBar

    ★★★★自定义tabBar★★★★★★★ Demo下载地址:https://github.com/marlonxlj/tabBarCustom.git 前言: 有的时候需求要对tabBar进行自定义的 ...

  2. android 自定义动画

    android自定义动画注意是继承Animation,重写里面的initialize和applyTransformation,在initialize方法做一些初始化的工作,在applyTransfor ...

  3. IOS第二天-新浪微博 - 添加搜索框,弹出下拉菜单 ,代理的使用 ,HWTabBar.h(自定义TabBar)

    ********HWDiscoverViewController.m(发现) - (void)viewDidLoad { [super viewDidLoad]; // 创建搜索框对象 HWSearc ...

  4. Android自定义View 画弧形,文字,并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

  5. iOS 隐藏自定义tabbar

    iOS  隐藏自定义tabbar -(void)viewWillAppear:(BOOL)animated { NSArray *array=self.tabBarController.view.su ...

  6. Android自定义View4——统计图View

    1.介绍 周末在逛慕课网的时候,看到了一张学习计划报告图,详细记录了自己一周的学习情况,天天都是0节课啊!正好在学习Android自定义View,于是就想着自己去写了一个,这里先给出一张慕课网的图,和 ...

  7. (转)[原] Android 自定义View 密码框 例子

    遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...

  8. iOS开发之功能模块--关于自定义TabBar条

    只上项目中用到的代码: 1.实现重写TabBar的TabBarItem,然后在中间额外加一个按钮. #import <UIKit/UIKit.h> @interface BikeTabBa ...

  9. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

随机推荐

  1. Python笔记(八)

    #-*-coding:utf-8-*- # Python内置函数 print abs(-45) # 绝对值函数 print divmod(7,2) # 返回一个包含商和余数的元组 # input(&q ...

  2. Hessian Spirng实例

    Spring实例 之前,我们做了很简单的纯Hessian的调用,虽然到此已经能够满足远程调用的需求了,但是我听说spring也能够访问hessian的远程服务,研究了一番,废话不多说,直接上示例. 业 ...

  3. QlikSense系列(1)——整体介绍

    接触QlikSense(3.1 SR1)已经快一年了,在此记录自己的经验心得,为想了解QlikSense的小伙伴提供一个参考. 1.产品介绍 Qlik公司以QlikView产品成名,QlikSense ...

  4. CLR寄宿和应用程序域

    Win实际上将CLR作为一个COM服务器实现在一个DLL内,即为CLR定义了标准的COM接口,并为该接口和COM服务器分配一GUID,安装FrameWork时表示CLR的COM服务器被注册到注册表内. ...

  5. iOS UIImage的解码时机

    在看博客 UITableView优化技巧 时想到列表的优化主要还是对图片的优化处理. 博文中介绍了按需加载.快速滑动时不加载.异步刷新等等技巧. 这里有个问题, 当我们实例化一个UIImage对象并为 ...

  6. day19-1 迭代器,三元表达式,列表推导式,字典生成式,

    目录 迭代器 可迭代对象 迭代器对象 总结 三元表达式(三目表达式) 列表推导式 字典生成式 迭代器 可迭代对象 拥有iter方法的对象就是可迭代对象 # 以下都是可迭代的对象 st = '123'. ...

  7. 系统中 CPU 时间片是多久

    Windows 系统中线程轮转时间也就是时间片大约是20ms,如果某个线程所需要的时间小于20ms,那么不到20ms就会切换到其他线程:如果一个线程所需的时间超过20ms,系统也最多只给20ms,除非 ...

  8. Parameter ‘brOrderNo’ not found

    org.apache.ibatis.binding.BindingException: Parameter 'brOrderNo' not found. Available parameters ar ...

  9. [BOI2011]MET-Meteors

    题目:洛谷P3527. 题目大意:n个国家在某星球上建立了m个空间站(一个空间站只属于一个国家),空间站围成一个环.现在知道要下k天陨石,每天都在一个区间内下,每个点都下同样多的(若r>l,则说 ...

  10. vue-router的创建(1)

    vue-router的创建 <!doctype html> <html lang="en"> <head> <meta charset=& ...