在开发之前对基类的封装程度决定了你在开发的时候的简便程度,封装得越好,可能本来需要一大堆的代码现在只要一行就可以搞掂,所以学会在开发之前把准备工作做好绝对不是一件坏事。磨刀不误砍柴工,现在我们就对最常用的BaseActivity进行一系列的封装,希望对大家的学习有点帮助。
BaseActivity主要要封装一些大多数Activity都做的相同的工作,或者一些方法的初始化以及提供一些简便的接口。
一.每一个不同的app可能都会有自己风格的导航栏,都对自己另外封装布局而不用系统默认的导航栏,让整体的效果看起来更加的美观,这个导航栏可能对这个的app的Activity都适用。例如我们自己做的,先看图吧。
说明:这个我们自己定义的导航栏有左部的返回按钮,有中部的标题文本,还有右部的确定文本。有一些应该可能会在左部显示用户的头像,所以我们也在左部封装了这个东西,只是这里被我invisible了。不仅如此,在中部也封装了一个FrameLayout用于替换中间布局,还有右部也封装了一个图片按钮,用户可以更改它的图片和处理点击事件。
xml文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="70dp"
android:background="#00000000"
android:id="@+id/title_bar">
<ImageView
android:id="@+id/status_height"
android:layout_width="match_parent"
android:layout_height="22dp"
android:visibility="invisible"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_below="@id/status_height"
>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginLeft="60dp"
android:layout_marginRight="60dp"
android:gravity="center"
android:singleLine="true"
android:textColor="#fff"
android:textSize="17.5sp"
android:visibility="visible"
/>
<FrameLayout
android:id="@+id/fl_head_center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="gone"/>
<ImageButton
android:id="@+id/imageButton_back"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:background="@drawable/selector_transparent"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:src="@mipmap/fanhui_icon"
android:visibility="visible"/>
<LinearLayout
android:id="@+id/ll_user_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:clickable="true"
android:visibility="gone">
<gd.dada.view.CircleImageView
android:id="@+id/icon_user"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center"
android:layout_marginLeft="9dp"
android:layout_marginRight="9dp"
android:src="@mipmap/index_icon_defaultface"/>
LinearLayout>
<TextView
android:id="@+id/tv_ok"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="@drawable/selector_transparent"
android:clickable="true"
android:gravity="center"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:text="确定"
android:textColor="#fff"
android:textSize="15.5sp"
android:visibility="visible"/>
<ImageButton
android:id="@+id/imageButton_head_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="@drawable/selector_transparent"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:src="@mipmap/index_btn_list"
android:visibility="gone"/>
RelativeLayout>
RelativeLayout>
补充:可能会有同学要问,为什么会有顶部的22dp的Imageview呢?这个问得好,其实如果没有特殊修改状态栏颜色的应该是可以不用这个的。这个Imageview的作用其实是当我们把系统的状态栏设置成透明的时候(也可以说是沉浸)的时候,布局里面的view会自动向上移动,显示在透明状态栏下面,所以我们加了一个无色的imageview来占位,纯属小技巧,大家也可以到这篇博客去看看:http://blog.csdn.net/u011228356/article/details/44061073
二.我们构造了一个类来对封装导航栏,很简单,一看就会懂
public class TitleBarView extends FrameLayout{
public TextView tv_title; //标题
public TextView tv_ok; //确定
public ImageButton btn_back; //返回
public ImageButton btn_right; //右边分享按钮
public CircleImageView icon_user;//用户头像
public FrameLayout fl_head_center;//中部容器
public LinearLayout ll_user_icon; //用户头像外部布局容器
public RelativeLayout mTitle_bar;
public TitleBarView(Context context) {
super(context);
init(context);
}
public TitleBarView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public TitleBarView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context){
LayoutInflater.from(context).inflate(R.layout.view_title_bar,this);
mTitle_bar = (RelativeLayout) findViewById(R.id.title_bar);
tv_title= (TextView) findViewById(R.id.tv_title);
tv_ok= (TextView) findViewById(R.id.tv_ok);
btn_back= (ImageButton) findViewById(R.id.imageButton_back);
btn_right= (ImageButton) findViewById(R.id.imageButton_head_right);
icon_user= (CircleImageView) findViewById(R.id.icon_user);
fl_head_center= (FrameLayout) findViewById(R.id.fl_head_center);
ll_user_icon= (LinearLayout) findViewById(R.id.ll_user_icon);
}
}
三.正式对我们的BaseActivity进行封装
1.因为导航栏是每一个activity都有的,所以我们必须要在基类里面嵌套我们自定义的导航栏在里面,然后通过添加主布局view 的形式添加具体activity的布局。先看看BaseActivity的布局文件。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000">
<FrameLayout
android:id="@+id/fl_layout_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="70dp"/>
<gd.dada.view.TitleBarView
android:id="@+id/diy_titleBarView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
RelativeLayout>
说明:很简单的布局,TitleBarView就是导航栏,FrameLayout就是用来添加主布局的位置。这里可以看到FrameLayout有一个android:paddingTop=”70dp”,其实这个就是TitleBarView的高度,当我们需要做沉浸不用导航栏的时候(做地图应用),可以设置android:paddingTop=”0dp”,然后让TitleBarView设置成invisible就可以了。
2.设置状态栏为透明状态
一旦设置了状态栏为透明状态,布局里面的view会自动向上移动,显示在透明状态栏下面,这一点是需要注意的,所以这里用了一个imageview来占位就是为了不让view上移。设置状态栏为透明和修改状态栏的方法如下:
public void initTintSystemBar() {
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// 激活状态栏
mTintManager.setStatusBarTintEnabled(true);
// enable navigation bar tint 激活导航栏
mTintManager.setNavigationBarTintEnabled(true);
mTintManager.setStatusBarTintColor(Color.TRANSPARENT);
}
}
//设置状态栏颜色
public void setStatusBarColor(int statusBarColor, float alpha) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//设置系统栏颜色
mTintManager.setTintColor(Color.TRANSPARENT);
//给状态栏设置颜色
mTintManager.setStatusBarTintColor(statusBarColor);
mTintManager.setStatusBarAlpha(alpha);
}
}
//重置状态栏颜色为透明
public void resetStatusBarColor() {
setStatusBarColor(Color.TRANSPARENT,0);
}
3.设置系统状态样式
设置默认样式
在application里面使用样式
".base.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:persistent="true"
android:screenOrientation="portrait"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
4.创建BaseActivity
public class BaseActivity implements View.OnClickListener {
public static final int TYPE_NORMAL = 0x1001;
public static final int TYPE_ICON = 0x1002;
public static final int TYPE_BACK = 0x1003;
public static final int TYPE_NO_RIGHT_BUTTON = 0x1004;
public static final int TYPE_ALL = 0x1000;
public static final int ONLY_RIGHT = 0x1005;
public static final int EMPTY = 0x0000;
public TitleBarView diy_titleBarView; //标题栏
protected FrameLayout fl_container; //布局容器
private Context mContext;
private ModelLoading mLoading;
private MyApplication application;
private SystemBarTintManager mTintManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
mContext = MyApplication.getContext();
application = (MyApplication) getApplication();
application.addInstance(this);
setContentView(R.layout.activity_base_title);
initTintSystemBar();
initView();
initListener();
}
protected void initView() {
diy_titleBarView = (TitleBarView) findViewById(R.id.diy_titleBarView);
fl_container = (FrameLayout) findViewById(R.id.fl_layout_container);
diy_titleBarView.mTitle_bar.setBackgroundColor(Color.parseColor("#49C6D8"));
}
public void noContainerPadding() {
fl_container.setPadding(0, 0, 0, 0);
}
public void hasContainerPadding() {
fl_container.setPadding(0, (int)UIUtils.dp2px(70), 0, 0);
}
public void setTitleBarBackground(String color) {
diy_titleBarView.mTitle_bar.setBackgroundColor(Color.parseColor(color));
}
public void setTitleBarBackground(Drawable drawable) {
diy_titleBarView.mTitle_bar.setBackground(drawable);
}
public void setTitleBarBackground(int resId) {
diy_titleBarView.mTitle_bar.setBackgroundResource(resId);
}
public void setRightBtnText(String s) {
diy_titleBarView.tv_ok.setText(s);
}
private void initListener() {
diy_titleBarView.tv_ok.setOnClickListener(this);
diy_titleBarView.btn_back.setOnClickListener(this);
diy_titleBarView.ll_user_icon.setOnClickListener(this);
diy_titleBarView.btn_right.setOnClickListener(this);
}
/**
* 设置内容布局
*/
public View setContainer(int resId) {
View view = UIUtils.inflate(resId);
if (view != null) {
return setContainer(view);
}
return null;
}
/**
* 设置内容布局
*/
public View setContainer(View view) {
fl_container.addView(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams
.MATCH_PARENT);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imageButton_back:
finish();
break;
case R.id.tv_ok:
OkPress(v);
break;
case R.id.ll_user_icon:
userIconPress();
break;
case R.id.imageButton_head_right:
rightViewPress();
break;
}
}
public void OkPress(View v) {
}
public void userIconPress() {
}
;
public void rightViewPress() {
}
;
/**
* 设置头像是否可见
*/
public void setIsUserIconVisible(boolean isVisible) {
diy_titleBarView.icon_user.setVisibility(isVisible ? View.VISIBLE : View.GONE);
}
/**
* 设置确定按钮是否可见
*/
public void setIsOkButtonVisible(boolean isVisible) {
diy_titleBarView.tv_ok.setVisibility(isVisible ? View.VISIBLE : View.GONE);
}
/**
* 设置头像
*
* @param resId
*/
public void setUserIcon(int resId) {
diy_titleBarView.icon_user.setImageResource(resId);
}
/**
* 设置头像
*
* @param drawable
*/
public void setUserIcon(Drawable drawable) {
diy_titleBarView.icon_user.setImageDrawable(drawable);
}
/**
* 设置头像
*
* @param bitmap
*/
public void setUserIcon(Bitmap bitmap) {
diy_titleBarView.icon_user.setImageBitmap(bitmap);
}
/**
* 替换中间的控件
*
* @param view
*/
public void replaceCenterView(View view) {
diy_titleBarView.tv_title.setVisibility(View.GONE);
if (view == null) {
return;
}
diy_titleBarView.fl_head_center.setVisibility(View.VISIBLE);
diy_titleBarView.fl_head_center.addView(view);
}
/**
* 替换右部的控件
*
* @param drawable
*/
public void replaceRightView(Drawable drawable) {
diy_titleBarView.tv_ok.setVisibility(View.GONE);
if (drawable == null) {
return;
}
diy_titleBarView.btn_right.setVisibility(View.VISIBLE);
diy_titleBarView.btn_right.setImageDrawable(drawable);
}
/**
* 替换右部的控件
*
* @param resId
*/
public void replaceRightView(int resId) {
replaceRightView(getResources().getDrawable(resId));
}
/**
* @param title
*/
public void setTitle(CharSequence title) {
diy_titleBarView.tv_title.setText(title);
}
public void setIsTitleVisible(boolean isVisible) {
diy_titleBarView.tv_title.setVisibility(isVisible ? View.VISIBLE : View.GONE);
}
public void setOkButtonText(CharSequence title) {
diy_titleBarView.tv_ok.setText(title);
}
/**
* 获取标题栏
*
* @return
*/
public TitleBarView getTitleBarView() {
return diy_titleBarView;
}
/**
* 设置标题栏模式
*
* @param type
*/
public void setTitleBarType(int type) {
switch (type) {
case TYPE_NORMAL:
diy_titleBarView.btn_back.setVisibility(View.VISIBLE);
diy_titleBarView.ll_user_icon.setVisibility(View.GONE);
diy_titleBarView.tv_ok.setVisibility(View.VISIBLE);
break;
case TYPE_ICON:
diy_titleBarView.btn_back.setVisibility(View.GONE);
diy_titleBarView.ll_user_icon.setVisibility(View.VISIBLE);
diy_titleBarView.tv_ok.setVisibility(View.GONE);
break;
case TYPE_BACK:
diy_titleBarView.btn_back.setVisibility(View.VISIBLE);
diy_titleBarView.ll_user_icon.setVisibility(View.GONE);
diy_titleBarView.tv_ok.setVisibility(View.GONE);
break;
case TYPE_NO_RIGHT_BUTTON:
diy_titleBarView.btn_back.setVisibility(View.VISIBLE);
diy_titleBarView.ll_user_icon.setVisibility(View.VISIBLE);
diy_titleBarView.tv_ok.setVisibility(View.GONE);
break;
case TYPE_ALL:
diy_titleBarView.btn_back.setVisibility(View.VISIBLE);
diy_titleBarView.ll_user_icon.setVisibility(View.VISIBLE);
diy_titleBarView.tv_ok.setVisibility(View.VISIBLE);
break;
case ONLY_RIGHT:
diy_titleBarView.btn_back.setVisibility(View.GONE);
diy_titleBarView.ll_user_icon.setVisibility(View.GONE);
diy_titleBarView.tv_ok.setVisibility(View.VISIBLE);
break;
case EMPTY:
diy_titleBarView.btn_back.setVisibility(View.GONE);
diy_titleBarView.ll_user_icon.setVisibility(View.GONE);
diy_titleBarView.tv_ok.setVisibility(View.GONE);
break;
}
}
@Override
protected void onDestroy() {
application.removeInstance(this);
super.onDestroy();
public void initTintSystemBar() {
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mTintManager = new SystemBarTintManager(this);
// 激活状态栏
mTintManager.setStatusBarTintEnabled(true);
// enable navigation bar tint 激活导航栏
mTintManager.setNavigationBarTintEnabled(true);
mTintManager.setStatusBarTintColor(Color.TRANSPARENT);
}
}
//设置状态栏颜色
public void setStatusBarColor(int statusBarColor, float alpha) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//设置系统栏设置颜色
mTintManager.setTintColor(Color.TRANSPARENT);
//给状态栏设置颜色
mTintManager.setStatusBarTintColor(statusBarColor);
mTintManager.setStatusBarAlpha(alpha);
}
}
public void resetStatusBarColor() {
setStatusBarColor(Color.TRANSPARENT,0);
}
public void setNavigationBarColor(int navigationBarColor, int alpha) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//设置系统栏设置颜色
mTintManager.setTintColor(Color.TRANSPARENT);
// 设置导航栏设置资源
mTintManager.setNavigationBarTintResource(navigationBarColor);
mTintManager.setNavigationBarAlpha(alpha);
}
}
}
今天先说到这里了,有什么疑问的欢迎交流学习。