BaseActivity

在开发之前对基类的封装程度决定了你在开发的时候的简便程度,封装得越好,可能本来需要一大堆的代码现在只要一行就可以搞掂,所以学会在开发之前把准备工作做好绝对不是一件坏事。磨刀不误砍柴工,现在我们就对最常用的BaseActivity进行一系列的封装,希望对大家的学习有点帮助。

BaseActivity主要要封装一些大多数Activity都做的相同的工作,或者一些方法的初始化以及提供一些简便的接口。

.每一个不同的app可能都会有自己风格的导航栏,都对自己另外封装布局而不用系统默认的导航栏,让整体的效果看起来更加的美观,这个导航栏可能对这个的app的Activity都适用。例如我们自己做的,先看图吧。
这里写图片描述

说明:这个我们自己定义的导航栏有左部的返回按钮,有中部的标题文本,还有右部的确定文本。有一些应该可能会在左部显示用户的头像,所以我们也在左部封装了这个东西,只是这里被我invisible了。不仅如此,在中部也封装了一个FrameLayout用于替换中间布局,还有右部也封装了一个图片按钮,用户可以更改它的图片和处理点击事件。

xml文件:

<?xml version="1.0" encoding="utf-8"?>
<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的布局文件。

<?xml version="1.0" encoding="utf-8"?>
<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.设置系统状态样式
设置默认样式

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <!-- @color/colorPrimaryDark这个颜色就是我们设置系统默认的状态栏颜色,如果设置成了@android:color/transparent的话,那么整个app的状态栏都是透明色,这里默认设置成了@color/colorPrimaryDark,我们再在具体activity代码中它的颜色,如果我们在代码中设置的是透明色的话,设置的半透明效果被默认设置的颜色覆盖了 -->
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

这里写图片描述

在application里面使用样式

 <application
        android:name=".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);
        }
    }

}

今天先说到这里了,有什么疑问的欢迎交流学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值