android佈局複用 & 自定義控制元件
佈局複用: 佈局複用的兩個關鍵標籤:include,merge。
如果你對android的基礎控鍵(TextVeiw,EditText,Button,ImageView....),常用基本布:LinearLayout,RelativeLayout,
自定義控制元件: 你已經學會佈局複用了,那自定義控制元件又是什麼玩意呢?先別急,我們想象一個場景,大多數的手機都會用三個按鍵/虛擬按鍵:返回鍵,選單鍵,後臺程式鍵,無論我們處於哪個介面,這三個按鍵的功能其實都是一樣的:返回鍵銷燬當前活動,選單鍵回到主頁面,後臺程式鍵檢視後臺的應用。如果我們在每一個介面都去編寫相同的業務邏輯,那顯然不符合程式開發的程式碼複用原則。那你又要問了,我不是已經通過佈局服用減少了程式碼冗餘嗎?但是再深入一點你就會發現你引入的佈局只是在介面的展現,如果你要實現業務邏輯(事件的監聽和響應),而這個業務邏輯又是相同的(例如返回鍵:銷燬當前活動,對到上一個活動),那麼你每一次引用這個佈局,都要去編寫一次相同的業務邏輯事件,這個就是相當大的冗餘了。如果說佈局複用是減少介面的冗餘,那自定義控制元件就是減少相同業務邏輯的冗餘了,所以自定義控制元件就非常有意義了。
為了更好的理解自定義控制元件,我們實際操作一個簡單案例(當然自定義控制元件功能強大,可以大有作為):介面中要引用一個相同選單佈局,返回鍵銷燬當前活動,刪除鍵刪除當前文字內容。
1:先建立一個android工程,在res檔案下的layout檔案下新建action.xml檔案(只是測試自定義控制元件,這裡只是最簡單的介面,實際需要介面的美化化和效能考慮)
<?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="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/show_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="原來的內容,你想怎麼操作呢??功能按鈕在下面哦:你可以返回,也可以刪除我哦"
/>
<Button
android:id="@+id/back_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回"
/>
<Button
android:id="@+id/delete_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="刪除"
/>
</LinearLayout>
2:在專案的src java原始檔中新建class:ActionDemo並且繼承LinearLayout
public class ActionDemo extends LinearLayout{
private TextView showTxt;
public ActionDemo(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.action, ActionDemo.this);
showTxt = (TextView)findViewById(R.id.show_txt);
Button backButton = (Button)findViewById(R.id.back_btn);
Button deleteButton = (Button)findViewById(R.id.delete_btn);
backButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((Activity)getContext()).finish();
}
});
deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showTxt.setText("");
}
});
}
}
解釋:建構函式: public AtionDemo(Contextcontext, AttributeSet attrs)
是在引用這個自定義控制元件時呼叫的,動態載入需要佈局過濾器(LayoutInflater)物件的inflate方法,所以我們寫的LayoutInflater.from(context)在當前上下文建立一個LayoutInflater物件,然後呼叫inflate方法,第一個引數:R.layout.action指定佈局檔案,第二個引數:AtionDemo.this指明載入的佈局的父佈局。為按鈕設定好監聽,就是我們所說的相同的業務邏輯功能了。
3:自定義控制元件的呼叫
在layout資料夾下main_activity中加入引用的自定用控制元件的程式碼:
com.jola.self_userdefine_ui.ActionDemo自定義控制元件java程式碼 包名.類名
<com.jola.self_userdefine_ui.ActionDemo
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</com.jola.self_userdefine_ui.ActionDemo>
4虛擬機器上執行:點選“返回”按鈕:銷燬當前活動,點選“刪除”按鈕:文字內容刪除了
做好了自定義控制元件,在其它任何地方引用都可以實現先相同的功能,而不必要多次編寫業務邏輯程式碼,實現程式碼的複用。
總結:佈局複用,可以使定義的佈局在不同的介面中多次引用,核心程式碼自定義控制元件,是佈局複用的升級,不僅是佈局的複用,更是業務邏輯功能的複用。定義好相同功能的控制元件後,在java原始碼中新建claa類,實現相同的業務邏輯。編寫完成後,引用自定義控制元件核心程式碼:包名.類名,而不用在呼叫的介面編寫相同的業務邏輯程式碼了。
Android 交流成長,如有漏洞,歡迎斧正!