在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类,
如上,定义一个titleView继承LinearLayout,三个参数不同的重载构造方法是必不可少的。首先加载一个画好的布局文件,然后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); } }
通过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程序员们也可以看一下;
作为一个程序员,我们不能把代码的搬运工作为最终目的,如何写出高效简洁的代码,应该是每一个程序员的追求。
小记以共勉。