Android自定義TitleView標題開發(fā)實例
Android開發(fā)過程中,經常遇到一個項目需要重復的定義相同樣式的標題欄,Android相繼推出了actionBar, toolBar, 相信有用到的朋友也會遇到一些不如意的時候,比如標題欄居中時,需要自定義xml文件給toolBar等,不了解actionBar,toolBar的可以去找相應的文章了解,這里介紹自定義titleBar滿足國內主題風格樣式的情況。
為了提前看到效果,先上效果圖:

前期準備
1.為標題欄titleView預定義id,在values下的ids.xml中
<?xml version="1.0" encoding="utf-8"?> <resources> <item name="tv_title_name" type="id"/> <item name="tv_left_text" type="id"/> <item name="iv_left_image" type="id"/> <item name="iv_right_image" type="id"/> <item name="iv_right_image_two" type="id"/> <item name="tv_right_text" type="id"/> <item name="tv_right_text_two" type="id"/> </resources>
這里可以看到定義了左側返回按鈕id,標題id,后側按鈕id,左側分兩種情況:ImageView/TextView,右側可以同時存在兩個按鈕,圖片按鈕、文字按鈕組合。
2.自定義標題欄屬性,在valuse下的attr.xml中
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 標題屬性 --> <declare-styleable name="TitleAttr"> <attr name="title_name" format="reference|string"/> <attr name="title_text_color" format="reference|color"/> <attr name="title_drawable_right" format="reference"/> <attr name="title_drawable_left" format="reference"/> <attr name="title_text_size" format="reference|dimension"/> <attr name="left_text" format="reference|string"/> <attr name="left_image" format="reference"/> <attr name="small_text_size" format="reference|dimension"/> <attr name="title_gravity"> <enum name="left" value="3"/> <enum name="center" value="17"/> <enum name="right" value="5"/> </attr> <attr name="right_image" format="reference"/> <attr name="right_text" format="reference|string"/> <attr name="right_image_two" format="reference"/> <attr name="right_text_two" format="reference|string"/> <attr name="title_height" format="dimension"/> <attr name="right_text_drawable_right" format="reference"/> <attr name="right_text_drawable_left" format="reference"/> <attr name="right_text_two_drawable_right" format="reference"/> <attr name="right_text_two_drawable_left" format="reference"/> <attr name="left_text_drawable_right" format="reference"/> <attr name="left_text_drawable_left" format="reference"/> </declare-styleable> </resources>
•編碼實現(xiàn)
• 有了前面的準備后,現(xiàn)在就可以開始編碼實現(xiàn)了,這里先看看在xml中如何引入我們自定義的控件:
<com.jarek.library.TitleView android:id="@+id/title_main" android:layout_width="match_parent" android:background="#0093fe" title:title_name="標題" title:right_text="@string/more" title:title_text_color="@android:color/white" title:right_image_two="@mipmap/icon_crop_rotate" title:title_text_size="20sp" title:small_text_size="15sp" title:left_text="返回" title:left_text_drawable_left="@mipmap/back_normal" title:right_text_drawable_right="@mipmap/bar_button_right" android:layout_height="50dp"/>
這里的title標簽就是我們自定義,首先創(chuàng)建一個類繼承自RelativeLayout,這里選擇RelativeLayout作為父類容器,目的在于RelativeLayout便于控制相對位置。
首先我們要獲得TypedArray對象,所有自定義屬性的值通過它來獲取:
TypedArray typeArray = context.obtainStyledAttributes(attrs, R.styleable.TitleAttr);
得到了typedArray對象后,就可以開始添加按鈕到容器中了,首先看看左邊第一個返回按鈕如果添加上去,先看代碼:
int leftText = typeArray.getResourceId(R.styleable.TitleAttr_left_text, 0); CharSequence charSequence = leftText > 0 ? typeArray.getResources().getText(leftText) : typeArray.getString(R.styleable.TitleAttr_left_text);
這里left_text就是自定義屬性,表明是左側TextView顯示的文字,文字可以是應用資源文件里的預定義string,也可以是直接輸入文字,取到對應的styleable后,首先判斷是否大于0,大于0表示是定義在string中的,通過typeArray.getResources().getText()獲取值,等于0就直接取值,表示可能是通過直接賦值的方式給值的。取到值后怎么賦值給TextView,這里需要首先給他寬高,這是所有控件都需要的
/**
* layout params of RelativeLayout
* @return LayoutParams
*/
private LayoutParams initLayoutParams () {
return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
}
我們單獨寫一個方法,后續(xù)就可以直接通過
LayoutParams params = initLayoutParams();
來獲取預設寬高值了,這里可以看到都是高度填充父控件,寬度是自適應。然后就是new一個TextView了:
/**
* create TextView
* @param context Context
* @param id the id of TextView
* @param charSequence text to show
* @param params relative params
* @return the TextView which is inited
*/
@NonNull
private TextView createTextView(Context context, int id, CharSequence charSequence, LayoutParams params) {
TextView textView = new TextView(context);
textView.setLayoutParams(params);
textView.setGravity(Gravity.CENTER);
textView.setId(id);
textView.setMinWidth((int)getPixelSizeByDp(minViewWidth));
textView.setText(charSequence);
return textView;
}
這里可以看到我們傳入了預設的id值,需要顯示的內容,以及上面給定的LayoutParams 。創(chuàng)建好TextView后還可以設置TextView的Drawable,通過自定義屬性left_text_drawable_right,left_text_drawable_left設置,這里是設置了左右,上下對應的可以設置:
/**
* drawable of TextView
* @param typeArray TypedArray
* @param leftDrawableStyleable leftDrawableStyleable
* @param rightDrawableStyleable rightDrawableStyleable
* @param textView which TextView to set
*/
private void setTextViewDrawable(TypedArray typeArray, int leftDrawableStyleable, int rightDrawableStyleable, TextView textView) {
int leftDrawable = typeArray.getResourceId(leftDrawableStyleable, 0);
int rightDrawable = typeArray.getResourceId(rightDrawableStyleable, 0);
textView.setCompoundDrawablePadding((int)getPixelSizeByDp(drawablePadding));
textView.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, 0, rightDrawable, 0);
}
這里也是抽取了一個方法出來,然后通過:
setTextViewDrawable(typeArray, R.styleable.TitleAttr_left_text_drawable_left, R.styleable.TitleAttr_left_text_drawable_right, mLeftBackTextTv);
即可給指定的TextView設置drawable了。創(chuàng)建好TextView后,前面提到我們用的是相對布局,需要指定位置規(guī)則:
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
這里居左顯示。同時還可以設置字體大小,通過自定義屬性:small_text_size(兩側文字大小),title_text_size(標題文字大小)來設置字體:
/**
* get the dimension pixel size from typeArray which is defined in attr
* @param typeArray TypedArray
* @param stylable stylable
* @param defaultSize defaultSize
* @return the dimension pixel size
*/
private float getDimensionPixelSize(TypedArray typeArray, int stylable, int defaultSize) {
int sizeStyleable = typeArray.getResourceId(stylable, 0);
return sizeStyleable > 0 ? typeArray.getResources().getDimensionPixelSize(sizeStyleable) : typeArray.getDimensionPixelSize(stylable, (int)getPiselSizeBySp(defaultSize));
}
一樣,這里也是單獨寫一個方法來做,TypedArray的用法就不多講了,可以查看其它文章了解。然后通過如下設置字體大?。?br />
float textSize = getDimensionPixelSize(typeArray, R.styleable.TitleAttr_small_text_size, defaultSmallTextSize); mLeftBackTextTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
文字顏色,同樣的道理:
/**
* get textColor
* @param typeArray TypedArray
* @return textColor
*/
private int getTextColorFromAttr (TypedArray typeArray) {
int textColorStyleable = typeArray.getResourceId(R.styleable.TitleAttr_title_text_color, 0);
if (textColorStyleable > 0) {
return typeArray.getResources().getColor(textColorStyleable);
} else {
return typeArray.getColor(R.styleable.TitleAttr_title_text_color, textColor);
}
}
然后調用方法設置顏色:
mLeftBackTextTv.setTextColor(getTextColorFromAttr(typeArray));
到這里為止,左側的第一個文字按鈕?;蛘呶淖謳D片的按鈕就創(chuàng)建好了,最后就差一步了:
mLeftBackTextTv.setTextColor(getTextColorFromAttr(typeArray));
其它按鈕,同樣的道理,可以依次添加到容器中,就不多講了,到此為止我們需要的titleView就創(chuàng)建好了,以后使用就可以直接調用了,不需要每個地方去重復的coding。
項目地址:github源碼下載
以上所述是小編給大家介紹的Android自定義TitleView標題開發(fā)實例,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
- Android編程自定義title bar(標題欄)示例
- Android使用setCustomTitle()方法自定義對話框標題
- Android中自定義Window Title樣式實例
- Android編程自定義Dialog的方法分析
- Android編程自定義圓角半透明Dialog的方法
- android自定義View滑動刪除效果
- Android自定義TabLayout效果
- Android自定義手機界面狀態(tài)欄實例代碼
- Android自定義View仿微信LetterView效果
- Android實現(xiàn)自定義圓角對話框Dialog的示例代碼
- Android動態(tài)自定義圓形進度條
- Android編程實現(xiàn)自定義title功能示例
相關文章
Android開發(fā)之利用Activity實現(xiàn)Dialog對話框
這篇文章主要給大家介紹了Android開發(fā)之如何利用Activity實現(xiàn)Dialog對話框效果,文中給出了詳細的示例代碼,相信對大家的理解及學習具有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。2016-12-12
Android自定義View實現(xiàn)仿GitHub的提交活躍表格
這篇文章主要介紹了Android自定義View實現(xiàn)仿GitHub的提交活躍表格,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-01-01
Android自定義控件ScrollView實現(xiàn)上下滑動功能
這篇文章主要為大家詳細介紹了Android自定義控件ScrollView實現(xiàn)上下滑動功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Android studio導出APP測試包和構建正式簽名包
大家好,本篇文章主要講的是Android studio導出APP測試包和構建正式簽名包,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2021-12-12
android handler.post和handler.sendMessage的區(qū)別和聯(lián)系
handler.post和handler.sendMessage本質上是沒有區(qū)別的,都是發(fā)送一個消息到消息隊列中,而且消息隊列和handler都是依賴于同一個線程的。接下來通過本文給大家分享android handler.post和handler.sendMessage的區(qū)別和聯(lián)系,一起看看吧2017-08-08

