1. 程式人生 > >Android自定義View-TitleBar(標題欄)詳細說明

Android自定義View-TitleBar(標題欄)詳細說明

我們在開發Android介面時常常要在許多頁面中共用風格相似的標題欄,為了減少重複性工作我們可以將標題欄做成一個通用的自定義控制元件。

我將通過兩種形式的自定義方式介紹自定義TitleBar


第一種方式(不涉及自定義屬性)

首先通過在Layout中建一個佈局檔案先確定Title的主要子控制元件titlebar.xml 如下包含2個Button 一個TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="50dp"
    android:background="@color/bg_title_bar"
    android:orientation="horizontal" >
        <Button
        android:id="@+id/btn_left"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"/>
    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center" />
      <Button
        android:id="@+id/btn_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       />
</LinearLayout>

當然如果我們之後不需要頻繁改變上述佈局中各個子控制元件的樣式和內容,就可以直接在JAVA程式碼中獲取並繫結監控器如下;

package com.example.briefvideo;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 自定義的TitleBar控制元件
 * 
 * @author baron 提供監聽器介面,呼叫者可以實現監聽器介面包含左右兩個按鈕的點選事件方法 然後繫結監聽器
 */
public class TitleBarView extends LinearLayout {
	// 右側按鈕屬性
	Button btnRight;
	// 左側按鈕屬性
	Button btnLeft;
	// 標題
	TextView tvTitle;
	BtnClickListener listener;

	public TitleBarView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}
	/**
	 * 初始化元件
	 * 
	 * @param context
	 */
	private void init(Context context) {
		LayoutInflater.from(context).inflate(R.layout.titlebar, this);
		btnLeft = (Button) findViewById(R.id.btn_left);
		btnRight = (Button) findViewById(R.id.btn_right);
		tvTitle = (TextView) findViewById(R.id.title);
	
		btnLeft.setText(leftTxt);
		if(leftable==false){
			btnLeft.setVisibility(View.GONE);	
		}
		btnRight.setText(rightTxt);
		if(rightable==false){
			btnRight.setVisibility(View.GONE);	
		}
		btnLeft.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				listener.leftClick();
			}
		});
		btnRight.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				listener.rightClick();
			}
		});
	}

	/**
	 * 提供載入自定義監聽器方法
	 * 
	 * @param listener
	 */
	public void setTitleBarListener(BtnClickListener listener) {
		this.listener = listener;
	}

	/**
	 * 按鈕點選介面,呼叫者實現
	 */
	public interface BtnClickListener {
		void leftClick();

		void rightClick();
	}

	/**
	 * 設定Titlebar內容(Java程式碼中設定)
	 * 
	 * @param leftDrabable
	 *            左側背景
	 * @param leftTxt
	 *            左側文字
	 * @param titleTxt
	 *            中間標題
	 * @param rightDrawable
	 * @param rightleftTxt
	 *            右側文字
	 */
	public void setTitleBarView(int leftDrabable, String leftTxt,
			String titleTxt, int rightDrawable, String rightTxt) {
		tvTitle.setText(titleTxt);
		btnLeft.setText(leftTxt);
	}

}
至此我們可以直接在程式碼中引用TitleBarView
    <com.example.briefvideo.TitleBarView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
    </com.example.briefvideo.TitleBarView>
可以直接在java中利用TitleBar中提供的點選事件監聽器給左右兩個Button設定點選事件,同時可以通過setTitleBarView方法修改一些屬性(buttong可見或不可見等)


第二種方式(利用自定義屬性)


首先依舊是通過在Layout中建一個佈局檔案先確定Title的主要子控制元件titlebar.xml 如下包含2個Button 一個TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="50dp"
    android:background="@color/bg_title_bar"
    android:orientation="horizontal" >
        <Button
        android:id="@+id/btn_left"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"/>
    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center" />
      <Button
        android:id="@+id/btn_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       />
</LinearLayout>

然後我們在attrs.xml(如果values資料夾中沒有attrs.xml則新建一個)新增自定義的屬性

<resources>
    <declare-styleable name="TitleBarView">  
        <attr name="titleText" format="string"/>  
        <attr name="titleSize" format="dimension"/>  
        <attr name="titleColor" format="color"/>  
        <attr name="leftText" format="string"/> 
        <attr name="leftDrawable" format="reference"/>  
        <attr name="leftTextColor" format="color"/>  
        <attr name="leftBackground" format="reference|color"/>  
        <attr name="leftable" format="boolean"/>  
        <attr name="rightText" format="string"/>  
        <attr name="rightTextColor" format="color"/>
        <attr name="rightDrawable" format="reference"/>   
         <attr name="rightable" format="boolean"/>  
        <attr name="rightBackground" format="reference|color"/>  
    </declare-styleable>
      <!-- between the icon and text. -->
     <attr name="leftText">
        <enum name="maintitle"     value="極致影音" />  
    </attr>
</resources>

然後我們就可以在TitleBarView程式碼中獲取到這些屬性,並將屬性與titlebar.xml佈局中的3個子控制元件相繫結設定
/**
 * 自定義的TitleBar控制元件
 * 
 * @author baron 提供監聽器介面,呼叫者可以實現監聽器介面包含左右兩個按鈕的點選事件方法 然後繫結監聽器
 */
public class TitleBarView extends LinearLayout {
// 右側按鈕屬性
Button btnRight;
Drawable rightDrawable;
String rightTxt;
boolean rightable;
// 左側按鈕屬性
Button btnLeft;
Drawable leftDrawable; 
String leftTxt;
boolean leftable;
// 標題
TextView tvTitle;
tring titleTxt;
BtnClickListener listener;

public TitleBarView(Context context, AttributeSet attrs) {
super(context, attrs);
getStyle(context, attrs);
init(context);
}


public void getStyle(Context context, AttributeSet attrs) {
// 獲取在attrs中設定的屬性組
TypedArray array = context.obtainStyledAttributes(attrs,
R.styleable.TitleBarView);
// 右側按鈕屬性
rightTxt = array.getString(R.styleable.TitleBarView_rightText);
rightDrawable = array
.getDrawable(R.styleable.TitleBarView_rightDrawable);
rightable= array.getBoolean(R.styleable.TitleBarView_rightable, true);
// 左側按鈕屬性
leftTxt = array.getString(R.styleable.TitleBarView_leftText);
leftDrawable = array.getDrawable(R.styleable.TitleBarView_leftDrawable);
leftable= array.getBoolean(R.styleable.TitleBarView_rightable, true);
// 標題
titleTxt = array.getString(R.styleable.TitleBarView_titleText);
}


/**
* 初始化元件
* 
* @param context
*/
private void init(Context context) {
LayoutInflater.from(context).inflate(R.layout.titlebar, this);
btnLeft = (Button) findViewById(R.id.btn_left);
btnRight = (Button) findViewById(R.id.btn_right);
tvTitle = (TextView) findViewById(R.id.title);

btnLeft.setText(leftTxt);
if(leftable==false){
btnLeft.setVisibility(View.GONE);<span style="white-space:pre">	</span>
}
btnRight.setText(rightTxt);
if(rightable==false){
btnRight.setVisibility(View.GONE);<span style="white-space:pre">	</span>
}
btnLeft.setOnClickListener(new OnClickListener() {
@Override
		public void onClick(View v) {
			listener.leftClick();
			}
		});
btnRight.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listener.rightClick();
}
});
}
/**
* 提供載入自定義監聽器方法
* 
* @param listener
*/
public void setTitleBarListener(BtnClickListener listener) {
this.listener = listener;
}

/**
* 按鈕點選介面,呼叫者實現
*/
public interface BtnClickListener {
void leftClick();
void rightClick();
}

/**
* 設定Titlebar內容(Java程式碼中設定)
* 
 * @param leftDrabable
 *            左側背景
* @param leftTxt
*            左側文字
* @param titleTxt
*            中間標題
* @param rightDrawable
* @param rightleftTxt
*            右側文字
*/
public void setTitleBarView(int leftDrabable, String leftTxt,
String titleTxt, int rightDrawable, String rightTxt) {
tvTitle.setText(titleTxt);
btnLeft.setText(leftTxt);
}


}
至此我們可以直接在程式碼中引用TitleBarView,並且可以給我們自定義的屬性設值
       <com.example.briefvideo.TitleBarView
        xmlns:titlebarview="http://schemas.android.com/apk/res/com.example.briefvideo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        titlebarview:titleText="極致影音">
    </com.example.briefvideo.TitleBarView>

其中注意,一般我們在使用空間的屬性時前面都會有  android: 這個是名稱空間的指定

我們在XML佈局中使用空間時都必須有<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

其實這裡就是指定一個名稱空間,意思就是android:這個命名的控制元件指向哪裡。

顯然我們要用自己定義的屬性,也要指定名稱空間,否則是無法識別的

            xmlns:titlebarview="http://schemas.android.com/apk/res/com.example.briefvideo"
        android:layout_width="match_parent"
        titlebarview:titleText="極致影音"

相關推薦

Android定義View-TitleBar標題詳細說明

我們在開發Android介面時常常要在許多頁面中共用風格相似的標題欄,為了減少重複性工作我們可以將標題欄做成一個通用的自定義控制元件。 我將通過兩種形式的自定義方式介紹自定義TitleBar 第一種方式(不涉及自定義屬性) 首先通過在Layout中建一個佈局檔案先確定Ti

Android定義View實戰會波動的View

今天寫這篇部落格的目的,主要是幫助自己總結一下今天學習到的自定義View的相關知識,如果順便能夠幫助大家一點點,那我也感覺很開心。 首先,自定義的一般步驟是: 1.建立自定義View,繼承系統自帶的View,並重寫其相關構造方法; 2.在Values下面新

Android定義View初探——仿360垃圾清理

明天就是五一勞動節了,在這裡先祝各位程式猿勞動節快樂,別在加班了! 自從嘗試過寫自定義View(Android自定義View初探(一)——餅圖)之後,每當看到別人的應用時,總是在想別人的實現方式,或許,這就是程式猿的悲哀吧O(∩_∩)O~。 前兩天就想嘗試去

Android定義View總結基礎知識與例項

自定義View是最能體現一個Android開發者水平的技能之一了。 接下來的一些列部落格將總結一下Android的自定義相關View知識,包括View的結構,事件體系,工作原理,自定義View的繪製等。 參考資料部分來自於書上以及各種部落格。 新建了一個qq群 482

android定義View學習----建立一個檢視類

建立一個檢視類 精心設計的自定義檢視與其他精心設計的類非常相似。它使用易於使用的介面封裝了一組特定的功能,它可以高效地使用CPU和記憶體,等等。不過,作為一個設計良好的班級,自定義檢視應該: 符合Android標準 提供適用於Android XML佈局的自

android定義viewdraw和ondraw

1、draw()和onDraw()的區別 1、draw()方法詳解 在自定義View的時候可以重寫draw和onDraw()方法 先看darw()方法: 從方法的上描述看:呼叫draw()的時候,必須手動的給view指定在

android定義view學習之時尚錶盤

最近在學習自定義view,順便謝謝自己的路程,後面回首看看以前的自己有多菜。。。。下方的是實現圖,首先需要說明的是,這個效果是看了一遍部落格,然後自己想著去實現,並給出此部落格:點選開啟連結正文:首先學習自定義view需要稍稍入門一下,然後是各種函式的使用,以及大量的練習,至

Android圓形圖片不求人,定義View實現BitmapShader使用

在很多APP當中,圓形的圖片是必不可少的元素,美觀大方。本文將帶領讀者去實現一個圓形圖片自定View,力求只用一個Java類來完成這件事情。 一、先上效果圖 二、實現思路 在定義View 的onMeasure()方法裡設定View的寬高相等,應該取寬高中的最小值。

android定義Button樣式清晰簡單

最近在學習一下簡單的控制元件,如Button,TextView等...但系統提供的樣式大多都滿足不了,所以我們需要自己來自定義樣式來滿足自己的需求。 下面跟大家分享一下最近學到的一種自定義方式,以下用Button按鈕來做例子: 步驟1: 在res/drawable資料夾

Android定義View--翻書控制元件

0.前言 最近重看了一遍封神演義,感覺QQ閱讀那個翻書的效果挺好的,準備做一個。上週五下午用了兩個小時只寫了一部分功能,以後有時間再完善 1.分析 先看效果圖 這個空間,說簡單也簡單,說難也難,簡單就在於這個效果主要就是依賴canvas的clippath才見到部分canvas,難就難在裁

Android 定義view1) --- Attr、Style和Theme詳解

轉載:https://www.jianshu.com/p/dd79220b47dd 概念說明:       Attr:屬性,風格樣式的最小單元;      Style:風格,它是一系列Attr的集合用以定義一個View

Android定義View——定義搜尋框SearchView 非常實用的控制元件

好多東西寫起來太麻煩了,而且我在最開始用的也不是自己寫的,所以找了一個非常棒的測試了一下.  轉載的 在 Android開發中,當系統資料項比較多時,常常會在app新增搜尋功能,方便使用者能快速獲得需要的資料。搜尋欄對於我們並不陌生,在許多app都能見到它,比如豌

android定義View之仿通訊錄側邊滑動,實現A-Z字母檢索

我們的手機通訊錄一般都有這樣的效果,如下圖: OK,這種效果大家都見得多了,基本上所有的android手機通訊錄都有這樣的效果。那我們今天就來看看這個效果該怎麼實現。 一.概述 1.頁面功能分析 整體上來說,左邊是一個ListView,右邊是一個自定義View,但

Android定義View-Draw原理篇

Android自定義View通常需要經過measure、layout和draw過程。 如果你沒有了解過measure過程,可以先看看這篇文章。 如果你沒有了解過layout過程,可以先看看這篇文章。 一、draw的作用:繪製View檢視 二、draw過程:類似meas

Android 定義View

前言:可是有時候我們總感覺官方定義的一些基本元件不夠用,自定義元件就不可避免了。那麼如何才能做到像官方提供的那些元件一樣用xml來定義他的屬性呢? 先總結下自定義View的步驟: 1、自定義View的屬性; 2、在View的構造方法中獲得自定義的屬性。 一、在re

HenCoder Android 定義 View 1-7:屬性動畫 Property Animation進階篇

這期是 HenCoder 自定義繪製的第 1-7 期:屬性動畫(進階篇) 簡介 上期的內容,對於大多數簡單的屬性動畫場景已經夠用了。這期的內容主要針對兩個方面: 針對特殊型別的屬性來做屬性動畫; 針對複雜的屬性關係來做屬性動畫。 TypeEvaluator

android定義View、正弦波水波紋

文章目錄 1、正弦曲線知識 2、靜態正弦曲線繪製 3、動態正弦曲線繪製 4、完整原始碼 1、正弦曲線知識 對這個初中知識遺忘了的可以先看看正弦曲線百度百科詞條方便加深理解。

android定義View定義EditText新增刪除功能

           忙忙碌碌20天,新的專案終於接近尾聲了。今天公司召集幾個使用者體驗師和美工一起吐糟這20天做的這個新產品,對於產品提出了很多建議,這幾天就改介面了。在這個專案中大量的使用了EditText元件,並且添加了刪除功能。這裡面都是用RelativeLayou

Android定義view,打造絢麗的驗證碼

前言:我相信信念的力量,信念可以支撐起一個人,一個名族,一個國家。正如“人沒有夢想和鹹魚有什麼區別”一樣,我有信念,有理想,所以我正在努力向著夢想前進~。 自定義view,如果是我,我首先要看到自定義view的效果圖,然後再想想怎麼實現這種效果或功能,所以先貼

Android 定義Viewinflate()模式

1.建立LayoutInflater例項 有兩種方式 1. LayoutInflater layoutInflater= LayoutInflater.from(MainActivity.this); LayoutInflater layoutInfla