1. 程式人生 > >android佈局複用 & 自定義控制元件

android佈局複用 & 自定義控制元件

        android中View的概念非常重要,它是使用者和手機互動的橋樑,就是說android手機向用戶展示的介面內容、你向手機輸入的內容的這個互動過程是通過View來實現的。android的佈局是在View的基礎上建立起來的,這個概念簡單理解就是多個控制元件組成一個佈局,佈局又可以相互巢狀,就可以編寫出豐富多彩的介面了。

       佈局複用: 佈局複用的兩個關鍵標籤:include,merge。

 如果你對android的基礎控鍵(TextVeiw,EditText,Button,ImageView....),常用基本布:LinearLayout,RelativeLayout,

已經有所瞭解了,你就會知道android專案中佈局檔案(.xml檔案)是放在res-layout資料夾下的,我們知道一個複雜的介面,它的佈局是必然是巢狀多層形成的(但出於效能考慮,最好不要超過三層巢狀),也許你做android專案時,會發現同一個工程中不同的介面中,有很多相同的佈局成分,那麼有沒有必要在每一個介面中都去寫這個相同的佈局成分呢?答案顯然是沒有必要的,完全可以做到佈局複用:現在佈局檔案中定義好所有需要多次使用的佈局,然後在需要引用的介面的xml檔案的具體位置呼叫:<include layout="@layout/佈局檔名",就可以將自定義佈局引用到呼叫的位置,就達到了佈局複用的效果,減少程式碼冗餘(原理很簡單,就是一行核心程式碼,就不附上原始碼咯!!!)。merge 標籤的關鍵字,解決ViewGroup重複疊加,效能提升。ViewStub定義時指定一個layout ,輕量級View,在呼叫inflate()方法前不會佔用任何佈局位置,看不見。通過inflate()方法才會載入佈局。

      自定義控制元件:   你已經學會佈局複用了,那自定義控制元件又是什麼玩意呢?先別急,我們想象一個場景,大多數的手機都會用三個按鍵/虛擬按鍵:返回鍵,選單鍵,後臺程式鍵,無論我們處於哪個介面,這三個按鍵的功能其實都是一樣的:返回鍵銷燬當前活動,選單鍵回到主頁面,後臺程式鍵檢視後臺的應用。如果我們在每一個介面都去編寫相同的業務邏輯,那顯然不符合程式開發的程式碼複用原則。那你又要問了,我不是已經通過佈局服用減少了程式碼冗餘嗎?但是再深入一點你就會發現你引入的佈局只是在介面的展現,如果你要實現業務邏輯(事件的監聽和響應)​,而這個業務邏輯又是相同的(例如返回鍵:銷燬當前活動,對到上一個活動),那麼你每一次引用這個佈局,都要去編寫一次相同的業務邏輯事件,這個就是相當大的冗餘了。如果說佈局複用是減少介面的冗餘,那自定義控制元件就是減少相同業務邏輯的冗餘了,所以自定義控制元件就非常有意義了。

    為了更好的理解自定義控制元件​,我們實際操作一個簡單案例(當然自定義控制元件功能強大,可以大有作為):介面中要引用一個相同選單佈局,返回鍵銷燬當前活動,刪除鍵刪除當前文字內容。

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 交流成長,如有漏洞,歡迎斧正!​