Android 自定义标题栏

在Android开发中,各类的App,标题栏都是不可缺少的一部分。出于美观设计,UI们设计的不同页面的标题栏几乎一致。这时,我们选择的方法就有很多了。

最普通的办法就是,每一个页面的标题栏都画一遍,然后在activity中对标题栏的标题名称进行修改,并给左上角的返回键添加点击监听。这样做布局文件不会增加工作量,无非就是ctrl + c,ctrl + v 的步骤,不过在activity中每次都要配置一遍,就会显得比较啰嗦,代码整体结构不够美观。

好一些的办法是写好一个标题栏布局文件,然后每次需要导入标题栏的页面中,使用<include layout="对应的layout名称"> ,比如:<include layout="@layout/title_layout"/>,这样的好处是导入的标题布局都是统一的一个,如果整体布局风格有变化的话,只改动通用的标题栏布局就可以了。缺点的话和上面第一个方法一样,需要每次在activity中对标题名称,和返回键进行配置,增加了代码量,而且整体代码感觉很臃肿。

现在就说一下最近查资料找到的一个比较好的办法,之前一直想把项目中所有的标题栏替换掉,苦于赶进度,实在没有时间,这次终于在项目整合期间完成了替换,感觉效果不错,跟大家分享一下。

 

不知道res目录下的attrs.xml文件大家用的多不多,这里存的都是一些自定义属性,相信自定义控件用的多的话肯定都有注意到,很多第三方库中都有用到类似于android:title=""的写法,而这个attr就是表示在xml布局文件中引用了attrs.xml中的属性。具体的引用方法就是在xml文件的顶部添加这样一行代码

xmlns:title="http://schemas.android.com/apk/res-auto"
res-auto也可以替换成对应项目的包名,如下
xmlns:title="http://schemas.android.com/apk/org.dxf.package"
对应的包名改为自己项目对应的
title对应的是引用的名称,通过title可以设置对应的类型的属性到指定位置,调用方法如下
</pre>
<org.ddu.tolearn.view.TitleView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        title:titleName="@string/title_learn_map"
        >

在attrs.xml中的配置就是

<declare-styleable name="TitleView">
        <attr name="titleName" format="reference"></attr>
    </declare-styleable>


这样就可以通过title:titleName找到对应的titleName属性,name用来找到对应的属性,format用来定义该对象的属性,具体的属性包含如下

其中boolean表示布尔类型变量,color表示颜色的引用,dimension表示距离引用,enum表示枚举类型,flag表示标签(用的比较少)
reference表示某一资源id(这个用的很广),folat表示浮点型对象,integer整形,string字符串类型。
对应的需要什么属性就配置对应的类型即可。
现在有了属性,那如何在控件中获取对应配置的值呢,下面来看看我写的TitleView的java类,
public class TitleView extends LinearLayout {
    private ImageView backImg;
    private TextView titleTv;

    public TitleView(Context context) {
        super(context);
    }

    public TitleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public TitleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 加载布局文件
        LayoutInflater.from(context).inflate(R.layout.title_layout, this, true);
        // 获取对应控件
        backImg = (ImageView) findViewById(R.id.title_back_img);
        titleTv = (TextView) findViewById(R.id.title_tv);
        // 获取资源文件
        TypedArray tArray = context.obtainStyledAttributes(attrs, R.styleable.TitleView);
        String titleStr = tArray.getString(R.styleable.TitleView_titleName);
        setViewDetail(context, titleStr);
        // 回收资源
        tArray.recycle();
    }

    /**
     * 设置标题和返回按钮监听
     *
     * @param context
     * @param titleStr
     */
    private void setViewDetail(final Context context, String titleStr) {
        backImg.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                ((Activity) context).finish();
            }
        });
        titleTv.setText(titleStr);
    }
}
如上,定义一个titleView继承LinearLayout,三个参数不同的重载构造方法是必不可少的。首先加载一个画好的布局文件,然后
通过findViewById找到对应的标题文本和返回键。接下来就是重点了,如何在java类中找到attr.xml中的属性呢。
TypeArray类型是找到一个style样式表中对应的style文件,R.styleable.TitleView为对应的id。然后通过TypeArray对象的
对应方法,进行xml解析,找到对应的属性值。
需要注意的有两点,比如我要找attrs.xml文件下的titleName属性,就是 tArray.getString(R.styleable_titleName),用下划线
隔开;还有就是,使用TypeArray之后要调用 tArray.recycle();进行资源回收,防止报错。
写下这篇文章主要想加深一下印象,入职不就的Android程序员们也可以看一下;
作为一个程序员,我们不能把代码的搬运工作为最终目的,如何写出高效简洁的代码,应该是每一个程序员的追求。
小记以共勉。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值