小編給大家分享一下Android創(chuàng)建自定義ActionBar的方法,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
成都創(chuàng)新互聯(lián)擁有10余年成都網(wǎng)站建設(shè)工作經(jīng)驗,為各大企業(yè)提供網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計服務(wù),對于網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、成都app開發(fā)、wap網(wǎng)站建設(shè)(手機版網(wǎng)站建設(shè))、程序開發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、域名與空間等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等網(wǎng)站化運作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設(shè)項目的能力。當多個界面都有很多相似部分時,可以考慮創(chuàng)建一個功能較全的模板。而在需要時,可以通過引用模板來實現(xiàn)自己想要實現(xiàn)的功能。比如適配器 Adapter,當很多的適配器都差不多時,就可以通過打造一個通用的適配器來實現(xiàn)。本例中主要是如何創(chuàng)建自定義的 ActionBar。
觀察上圖的,當切換界面時,每個界面的頂部最多只有兩個圖標,而且有4個界面具有類似特性。所以可以考慮通過自定義控件來創(chuàng)建UI模板。
由于是需要創(chuàng)建出具有重用功能的復(fù)合控件,所以通常需要繼承 ViewGroup ,在給它添加指定功能的控制。給其指定一些可配置的屬性,讓其具有更強的擴展性。
本例可以簡單的創(chuàng)建一個 TopBar 來繼承 RelativeLayout,并在 values 文件下新建一個 attrs.xml 布局文件,該文件用于定義 ActionBar 的屬性。
attrs.xml :
其中:
創(chuàng)建一個只有兩張圖片的布局文件,這樣做的好處是在自定義控件的類中可以減少代碼量,不必在該類中創(chuàng)建 ImageView ,也能更好的讓 xml 完成 UI 界面設(shè)置,而 Java 程序則專門負責業(yè)務(wù)邏輯。
topbar_layout.xml :
該布局只有兩個橫向的 ImageView 且都沒有指定 src 屬性。
創(chuàng)建一個 TopBar 類用于繼承 RelativeLayout。
TopBar.java :
package com.crazy.gemi.ui.topbar; import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import com.crazy.gemi.R; public class TopBar extends RelativeLayout { private Drawable draw_left; private Drawable draw_right; public TopBar(Context context) { this(context, null); } public TopBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TopBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(attrs, defStyleAttr); } private void init(AttributeSet attrs, int defStyleAttr) { // 系統(tǒng)提供了 TypedArray 來獲取自定義的屬性集 TypedArray typedArray = null; try { typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.TopBar,defStyleAttr,-1); draw_left = typedArray.getDrawable(R.styleable.TopBar_topbar_left_icon); draw_right = typedArray.getDrawable(R.styleable.TopBar_topbar_right_icon); } finally { // 獲取完所有的屬性值后要回收資源 typedArray.recycle(); } View view = View.inflate(getContext(), R.layout.topbar_layout, this); ImageView imgLeft = (ImageView)view.findViewById(R.id.topbar_left_img); ImageView imgRight = (ImageView)view.findViewById(R.id.topbar_right_img); imgLeft.setImageDrawable(draw_left); imgRight.setImageDrawable(draw_right); } }
其中需要注意的是:
1. 獲取完屬性值后,要記得回收資源。將其放入 finally 語句塊中,就一定能夠回收,不管前面是否出問題等。
2. 先加載該布局文件:View view = View.inflate(getContext(), R.layout.topbar_layout, this); 其中的 this 為該 TopBar 對象的引用,將其添加到 RelativeLayout 中;給圖片賦值,如:imgLeft.setImageDrawable(draw_left);
由此可以看出避免了在該類中出現(xiàn) ImageView imgLeft = new ImageView(content); 的創(chuàng)建 ImageView 對象的代碼,也避免可為組件元素設(shè)置相應(yīng)的布局元素的問題,如:
// 為組件設(shè)置相應(yīng)的布局元素(左邊) LayoutParams leftParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE); // 添加到 ViewGroup addView(imgLeft, leftParams); // 為組件設(shè)置相應(yīng)的布局元素(右邊) LayoutParams rightParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE); // 添加到 ViewGroup addView(imgRight,rightParams);
當然該自定義的空間還不完善,可以在該類中添加接口,以方便點擊圖標時有相應(yīng)的回調(diào)。這里也就沒有去創(chuàng)建該接口了。
接下來就是在需要的引用該模板:
先創(chuàng)建自己的名字空間:xmlns:custom="http://schemas.android.com/apk/res-auto" 其中 custom 為自定義的名字,res-auto 也可以改為該應(yīng)用的包名。下面簡單創(chuàng)建一個布局,以此來演示對該 UI 模板的引用。
效果如下:
代碼如下:
其中用 custom:topbar_left_icon="" 來加載自己想要加載的圖片(左邊的圖標)。這樣就可以通過添加或者不添加 custom 屬性來實現(xiàn)完對 UI 模板的引用。
看完了這篇文章,相信你對“Android創(chuàng)建自定義ActionBar的方法”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!