标题栏的公共抽取

一、情形描述

       在常使用的页面布局中,为保持用户一贯的使用风格,会保持页面的整体风格相似。除开底部导航外,标题栏是使用频率较高的另一种页面布局。如图所示:


          在程序猿“懒惰”的催促下,总是希望能够抽取成为公共的部分,在使用的时候就修改需要修改的地方就行。


二、第一种抽取方法

custom_common_title.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/title_root_group"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:background="@mipmap/head_bar"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/title_left_iv"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:src="@mipmap/back" />

    <TextView
        android:id="@+id/title_left_tv"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:visibility="gone" />

    <TextView
        android:id="@+id/title_name_tv"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="6" />

    <ImageView
        android:id="@+id/title_right_iv"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:src="@mipmap/enter"
        android:visibility="gone" />

    <TextView
        android:id="@+id/title_right_tv"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>
BaseActivity.java

/**
 * 功能描述:抽取公共的基础Activity
 * <p>
 * <p>
 * 当前方式标题栏高度不能自由控制【有待于优化】
 * 时间:2016/8/9
 * 作者:vision
 */
public abstract class BaseActivity extends Activity {
    /**
     * 标题左边文字栏
     */
    private TextView titleLeftTV;
    /**
     * 标题左边图像栏
     */
    private ImageView titleLeftIV;
    /**
     * 标题标题栏
     */
    private TextView titleNameTV;
    /**
     * 标题右边文字栏
     */
    private TextView titleRightTV;
    /**
     * 标题右边图像栏
     */
    private ImageView titleRightIV;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void setContentView(int layoutResID) {
        View contentView = LayoutInflater.from(this).inflate(layoutResID, null);
        setContentView(contentView);
    }

    @Override
    public void setContentView(View view) {
        ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        setContentView(view, lp);
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams lp) {
        boolean hasTitle = hasTitle();
        if (hasTitle) {
            int titleLayoutId = getCustomTitleLayoutId();
            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
            if (lp == null) {
                super.setContentView(view);
            } else {
                super.setContentView(view, lp);
            }

            Window w = getWindow();
            w.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, titleLayoutId);

            Drawable titleBg = getTitleBg();
            ViewGroup titleGroup = (ViewGroup) findViewById(R.id.title_root_group);
            if (titleBg != null) {
                titleGroup.addView(titleGroup, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            } else {
                titleGroup.setBackgroundColor(Color.GREEN);
            }

            initTitle();
        } else {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            if (lp == null) {
                super.setContentView(view);
            } else {
                super.setContentView(view, lp);
            }
        }

    }

    /**
     * 初始化View,分三部分:
     * Left、Center、Right:可以设置图片、文字、点击事件
     */
    private void initTitle() {
        titleLeftTV = (TextView) findViewById(R.id.title_left_tv);
        titleLeftIV = (ImageView) findViewById(R.id.title_left_iv);
        titleNameTV = (TextView) findViewById(R.id.title_name_tv);
        titleRightTV = (TextView) findViewById(R.id.title_right_tv);
        titleRightIV = (ImageView) findViewById(R.id.title_right_iv);
        //下面三个方法根据自己的要求实现;
        setTitleLeftView(titleLeftTV, titleLeftIV);
        setTitleNameView(titleNameTV);
        setTitleRightView(titleRightTV, titleRightIV);
    }

    /**
     * 属性方法形成空实现,子类可重写可不重写
     */

    /**
     * 设置标题栏右标题属性
     *
     * @param titleRightTV 右标题栏文字
     * @param titleRightIV 右标题栏图像
     */
    public void setTitleRightView(TextView titleRightTV, ImageView titleRightIV) {

    }

    /**
     * 设置标题栏属性
     *
     * @param titleNameTV 标题栏标题信息
     */
    public void setTitleNameView(TextView titleNameTV) {

    }

    /**
     * 设置标题栏左标题属性
     *
     * @param titleLeftTV 左标题文字
     * @param titleLeftIV 左标题图像
     */
    public void setTitleLeftView(TextView titleLeftTV, ImageView titleLeftIV) {

    }

    /**
     * 是否显示Title,子类可重写
     *
     * @return
     */
    protected boolean hasTitle() {
        return true;
    }

    /**
     * Title布局文件;
     *
     * @return
     */
    protected int getCustomTitleLayoutId() {
        return R.layout.custom_common_title;
    }

    /**
     * Title背景,子类可以重写;
     *
     * @return
     */
    protected Drawable getTitleBg() {
        return null;
    }

}

三、第二种抽取方法

head_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:background="@mipmap/head_bar">

        <ImageView
            android:id="@+id/title_bar_back"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:padding="5dp"
            android:src="@drawable/back_select" />

        <TextView
            android:id="@+id/base_activity_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="方正字体"
            android:textColor="#FFFFFF"
            android:textSize="22dp" />

        <LinearLayout
            android:id="@+id/base_activity_right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dp"
            android:orientation="horizontal"
            android:padding="5dp" />
    </RelativeLayout>
</LinearLayout>
NewBaseActivity.java

public abstract class NewBaseActivity extends Activity {
    /**
     * 标题中部文字描述
     */
    private TextView titleText;
    /**
     * 标题右边View布局
     */
    private LinearLayout rightLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏

        initCreateView();
        initView();
        initData();
        initLitener();

        try {
            View titlebarView = findViewById(R.id.title_bar_back);
            if (titlebarView != null) {
                titlebarView.setOnClickListener(new MyBackListener());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    private class MyBackListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            mySelfDestory();
            if (getLeftBtn()) {
                Toast.makeText(NewBaseActivity.this, "您点击了返回!", Toast.LENGTH_SHORT).show();
            } else {
                finish();
            }
        }

    }

    /**
     * 初始化View
     */
    protected void initView() {

        //添加右边按钮
        rightLayout = (LinearLayout) findViewById(R.id.base_activity_right);
        if (getRightBtn() != null) {
            rightLayout.addView(getRightBtn());
        }

        titleText = (TextView) findViewById(R.id.base_activity_title);
        if (getTopTitleText() != null) {
            titleText.setText(getTopTitleText());
        }

    }

    /**
     * 获取右边自定义按钮,由用户自己定义
     *
     * @return
     */
    protected View getRightBtn() {

        return null;
    }

    /**
     * 获取顶部标题
     *
     * @return
     */
    public abstract String getTopTitleText();

    /**
     * 设置布局文件
     */
    public abstract void initCreateView();

    /**
     * 初始化数据
     */
    public abstract void initData();

    /**
     * 初始化监听器
     */
    public abstract void initLitener();

    /**
     * 销毁自我
     */
    private void mySelfDestory() {

    }

    /**
     * 是否获取标题左部按钮
     *
     * @return
     */
    protected boolean getLeftBtn() {

        return false;
    }
}

四、总结

1,展示效果如图


2,说明:

             点击确定--点击返回,均是第一种实现的效果。

             点击跳转新BaseActivity是第二种实现方式。


            很明显的看出第一种实现方式是真的太糙了,第二种方式相对来讲,就是夏日中一泓清泉。

            两种方式展示出来,一是为了看到做出的工作,习惯性给自己一点“甜头”;二是给自己挖一个深坑。在前行的路上,我还有很多东西需要学习、研究。也正是一个个坑的天平逐步让自己强壮一点点。

           给大家推荐第二种,如果你看到,你用就好。要是你喜欢研究,欢迎你来填坑。

                      第一种方式的坑就是:返回或者确定,使用切图展示效果很差;整个头部布局的高度不能自由控制。


戳这里,有惊喜~_~



上班睡觉被抓

“老板,非是本人怠惰因循,实在是这段代码深奥无比。Do与While之间相互勾连,互成太极之势,循环不尽。按照其中指示运行,才发现错误层出不穷。定睛细看,又觉此中分支繁多,仿佛包含所有BUG,各个BUG之间又互成掎角之势。一旦沉迷其中,让人欲昏欲睡,欲仙欲死,几欲脱离红尘,遁入空门。才钻研一根烟的时间,我已心力交瘁,还好香烟燃至食指,才将我惊醒,否则定会耗尽心力而亡。为了避免公司遭受逼死员工的骂名,我才稍息片刻。”

          ----- 做一个小小的二货



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹叁零壹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值