亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android如何創建自定義ActionBar

2019-10-21 21:35:23
字體:
來源:轉載
供稿:網友

當多個界面都有很多相似部分時,可以考慮創建一個功能較全的模板。而在需要時,可以通過引用模板來實現自己想要實現的功能。比如適配器 Adapter,當很多的適配器都差不多時,就可以通過打造一個通用的適配器來實現。本例中主要是如何創建自定義的 ActionBar。

Android,ActionBar

觀察上圖的,當切換界面時,每個界面的頂部最多只有兩個圖標,而且有4個界面具有類似特性。所以可以考慮通過自定義控件來創建UI模板。

由于是需要創建出具有重用功能的復合控件,所以通常需要繼承 ViewGroup ,在給它添加指定功能的控制。給其指定一些可配置的屬性,讓其具有更強的擴展性。

本例可以簡單的創建一個 TopBar 來繼承 RelativeLayout,并在 values 文件下新建一個 attrs.xml 布局文件,該文件用于定義 ActionBar 的屬性。

attrs.xml :

<?xml version="1.0" encoding="utf-8"?><resources>  <declare-styleable name="TopBar" >  <attr name="topbar_left_icon" format="reference" />  <attr name="topbar_right_icon" format="reference" /> </declare-styleable></resources>

其中:<declare-styleable name="TopBar" > 中的 name 值為繼承自 RelativeLayout的類名,這樣做的好處是在自定義屬性較多時,能夠很好的辨認出自定義的屬性屬于誰,屬于哪個地方的自定義。當然也可以不用和繼承自 RelativeLayout 的類名相同;由于 ActionBar 最多時只有 2 張圖片,不需要其他屬性(如果想在點擊圖標時改變圖顏色等,還可以定義 format 的 color 值),所以給每張圖片定義一個圖片的引用即可,即:<attr name="topbar_left_icon" format="reference" /> 其中 format 指定的值為 reference,reference 表示圖片的引用。

創建一個只有兩張圖片的布局文件,這樣做的好處是在自定義控件的類中可以減少代碼量,不必在該類中創建 ImageView ,也能更好的讓 xml 完成 UI 界面設置,而 Java 程序則專門負責業務邏輯。

topbar_layout.xml :

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_margin="6dp" android:layout_width="match_parent" android:layout_height="wrap_content">  <ImageView  android:id="@+id/topbar_left_img"  android:layout_marginLeft="6dp"  android:layout_width="wrap_content"  android:layout_height="wrap_content" />  <ImageView  android:id="@+id/topbar_right_img"  android:layout_marginRight="20dp"  android:layout_alignParentRight="true"  android:layout_width="wrap_content"  android:layout_height="wrap_content" /> </RelativeLayout>

該布局只有兩個橫向的 ImageView 且都沒有指定 src 屬性。

創建一個 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) {  // 系統提供了 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);

        由此可以看出避免了在該類中出現 ImageView  imgLeft  =  new  ImageView(content); 的創建 ImageView 對象的代碼,也避免可為組件元素設置相應的布局元素的問題,如:

// 為組件設置相應的布局元素(左邊) LayoutParams leftParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);// 添加到 ViewGroup addView(imgLeft, leftParams);  // 為組件設置相應的布局元素(右邊) LayoutParams rightParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);// 添加到 ViewGroup addView(imgRight,rightParams);

當然該自定義的空間還不完善,可以在該類中添加接口,以方便點擊圖標時有相應的回調。這里也就沒有去創建該接口了。

接下來就是在需要的引用該模板:

先創建自己的名字空間:xmlns:custom="http://schemas.android.com/apk/res-auto" 其中 custom 為自定義的名字,res-auto 也可以改為該應用的包名。下面簡單創建一個布局,以此來演示對該 UI 模板的引用。

效果如下:

Android,ActionBar

代碼如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:custom="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.crazy.gemi.ui.pocket.PocketFragment">  <com.crazy.gemi.ui.topbar.TopBar  android:id="@+id/pocket_top_bar"  android:background="@drawable/bg_cheaper_fg"  android:layout_width="match_parent"  android:layout_height="wrap_content"  custom:topbar_left_icon="@drawable/pocket_logo"  custom:topbar_right_icon="@drawable/abc_btn_radio_to_on_mtrl_015"/>  <com.warmtel.expandtab.ExpandPopTabView  android:id="@+id/fg_pocket_expandtab_view"  android:layout_below="@id/pocket_top_bar"  android:layout_width="match_parent"  android:layout_height="wrap_content"  custom:tab_toggle_btn_bg="@drawable/bg_expa_near"  custom:tab_toggle_btn_font_color="@android:color/black"/>  <ImageView  android:id="@+id/fg_pocket_img"  android:layout_below="@id/fg_pocket_expandtab_view"  android:scaleType="centerCrop"  android:src="@drawable/pocket_bg"  android:layout_width="match_parent"  android:layout_height="match_parent" /> </RelativeLayout>

其中用 custom:topbar_left_icon="" 來加載自己想要加載的圖片(左邊的圖標)。這樣就可以通過添加或者不添加 custom 屬性來實現完對 UI 模板的引用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲小视频在线| 久久九九精品99国产精品| 国产精品18久久久久久麻辣| 在线观看欧美www| 日韩中文字幕久久| 92版电视剧仙鹤神针在线观看| 亚洲欧美精品一区二区| 欧美日韩福利在线观看| 91久久精品国产91久久性色| 国产啪精品视频网站| 欧亚精品在线观看| 国产亚洲综合久久| 国产一区二区免费| 久久亚洲综合国产精品99麻豆精品福利| 国产亚洲精品va在线观看| 日韩精品在线观看一区| 尤物yw午夜国产精品视频明星| 黄色精品在线看| 亚洲电影免费在线观看| 久久精品99久久久香蕉| 色综合久久中文字幕综合网小说| 色综合伊人色综合网| 精品女厕一区二区三区| 亚洲国产另类久久精品| 日韩中文字幕不卡视频| 国产精品爽爽ⅴa在线观看| 福利视频导航一区| 免费不卡在线观看av| 欧美激情一级二级| 日本精品在线视频| 亚州精品天堂中文字幕| 国产精品精品一区二区三区午夜版| 国产精品久久久久aaaa九色| 久久精品视频在线观看| 亚洲男人的天堂网站| 精品久久久久久久大神国产| 国产午夜精品理论片a级探花| 国产精品99久久久久久久久| 亚洲free性xxxx护士hd| 国内精品久久久久伊人av| 91精品久久久久| 亚洲一区二区三区777| 亚洲精品一区二区久| 精品激情国产视频| 国产精品久久电影观看| 国产噜噜噜噜噜久久久久久久久| 欧美激情精品久久久久久久变态| 成人女保姆的销魂服务| 国产91在线视频| 亚洲国产精品悠悠久久琪琪| 久久av在线看| 久久亚洲精品小早川怜子66| 日韩中文理论片| 日韩欧美国产激情| 亚洲免费av片| 成人黄色网免费| 亚洲精品视频免费在线观看| 91在线无精精品一区二区| 91国内精品久久| 精品国产乱码久久久久酒店| 国产视频福利一区| 成人在线免费观看视视频| 亚洲精品自拍视频| 成人精品视频久久久久| 久久精品在线播放| 丰满岳妇乱一区二区三区| 亚洲毛片在线免费观看| 亚洲男人天堂手机在线| 久久精品久久久久久国产 免费| 日韩美女av在线免费观看| 人九九综合九九宗合| 亚洲影院色在线观看免费| 视频一区视频二区国产精品| 色综合久久88色综合天天看泰| 久久精品久久久久久国产 免费| 国产精品高潮呻吟久久av野狼| 国产精品一区二区三区成人| 久久噜噜噜精品国产亚洲综合| 精品久久久久久久中文字幕| 最新69国产成人精品视频免费| 国产精品久久久久77777| 成人黄色生活片| 国产精品流白浆视频| 久久精品99久久久香蕉| 97视频在线观看亚洲| 国产精品美女无圣光视频| 色婷婷**av毛片一区| 亚洲性av网站| 黑人精品xxx一区一二区| 日韩电影中文字幕| 91精品一区二区| 欧美性xxxx在线播放| 日韩欧美福利视频| 97免费中文视频在线观看| 福利一区福利二区微拍刺激| 日韩成人中文字幕| 国产91精品久久久久久| 国产一区二区色| yellow中文字幕久久| 国产精品一久久香蕉国产线看观看| 国产精品视频播放| 国产做受69高潮| 亚洲国产欧美自拍| 日韩成人小视频| 中文字幕欧美日韩| 亚洲成人黄色网| 91沈先生作品| 亚洲一区999| 精品亚洲一区二区三区在线观看| 精品国产乱码久久久久久天美| 岛国精品视频在线播放| 欧美日韩国产成人| 欧美专区在线播放| 91香蕉国产在线观看| 中文字幕精品在线| 久久99久久亚洲国产| 亚洲美女在线看| 久久久国产精彩视频美女艺术照福利| 久久噜噜噜精品国产亚洲综合| 亚洲精品色婷婷福利天堂| 精品无人国产偷自产在线| 国产精品成人一区二区| 91成人天堂久久成人| 国产有码在线一区二区视频| 日韩国产高清视频在线| 91精品成人久久| 久久艳片www.17c.com| 久久精品色欧美aⅴ一区二区| 国产在线视频91| 97精品国产97久久久久久免费| 美女撒尿一区二区三区| 日韩电影中文 亚洲精品乱码| 色老头一区二区三区在线观看| 亚洲国产美女久久久久| 欧美一区三区三区高中清蜜桃| 成人免费大片黄在线播放| 欧美大尺度电影在线观看| 欧美高清自拍一区| 精品亚洲国产视频| 久久久久久久久久久人体| 欧美激情在线有限公司| 欧美二区在线播放| 精品久久久91| 亚洲高清免费观看高清完整版| 国产原创欧美精品| 久久av红桃一区二区小说| 精品视频www| 成人在线国产精品| 国产精品亚洲视频在线观看| 国产精品成人一区二区三区吃奶| 久久天天躁狠狠躁夜夜av| 国外成人在线视频| 欧美电影免费看| 一个人看的www久久| 色综合视频一区中文字幕| 国产成人精品在线| 亚洲免费成人av电影| 久久久国产一区二区三区| 亚洲乱码av中文一区二区| 国产精品免费看久久久香蕉| 日韩av影片在线观看| 在线播放国产精品| 国产精品成人国产乱一区| 91社影院在线观看|