簡體   English   中英

在Android中創建復合視圖

[英]Create a composite view in Android

我想創建一個自定義視圖(我稱之為MyComplexView ),例如RelativeLayoutImageview ,一個TextView ,和一個Button

我想用布局聲明一個xml,然后創建類:

MyComplexView extends RelativeLayout{...}

但我不知道應該覆蓋什么來表明哪個布局應該膨脹。

我怎樣才能做到這一點? 謝謝

像這樣的東西:

  1. 從超類中添加構造函數。 (只有上下文的那個用於創建視圖programaticaly,其他用於在XML中添加視圖時。

  2. 例如,創建一個名為init()的方法,並從每個構造函數中調用它。

  3. 在init方法里面做:

    LayoutInflater.from(context).inflate(R.layout.my_view_layout,this,true);

現在在膨脹額外的參數實際意味着:

true - >將布局附加到您的案例相對布局中的根(如果您的布局根也是相對布局,那么在xml內部您可以只合並標簽,並在代碼中對齊它們以便層次結構更簡單)或任何布局你喜歡的布局。

這個 - >在您的情況下將膨脹視圖附加到您正在擴展的相對布局的布局。

它會自動附加到根目錄 - > extends RelativeLayout。

然后你可以使用findViewById:

this.findViewById(R.id.myView);

我不是100%確定你的主要目標是什么,所以我試着徹底:

如果要在其他布局中包含復雜布局,則只需定義my_complext_layout.xml ,並在其他布局中放置:

<include layout="@layout/my_complext_layout" />

如果您需要運行自己的代碼,那么您可以簡單地將此布局的根目錄設置為MyComplexView ,並且可以在創建視圖時運行代碼。

如果您打算讓代碼在布局上運行,那么只需實現OnGlobalLayoutListener並將其添加到視圖構造函數中的布局中。

MyComplexView實現一個構造函數:

public MyComplexView(Context context, AttributeSet attrs){
    LayoutInflater inflater = LayoutInflater.from(context);
    inflater.inflate(R.layout.header_view, this, true);
    mHeaderView = (TextView)findViewById(R.id.header);
    if(mHeaderView != null)
        mHeaderView.setText("Test");

}

請參閱開發人員文檔中的自定義組件 特別是化合物控制部分。

一旦你創建了你的java文件,為了在xml中引用它,你必須使用一個完全限定的包名,即:

<com.yourpackage.YourCustomView
android:layout_height="wrap_content"
android:layout_width="wrap_content" />

創建自定義視圖通常旨在創建一個尚不存在的窗口小部件。 你要做的是在多個地方重復相同的布局。

根據您的上下文,您有多個選項可以執行此操作。

  1. 如果要放置布局,只需在單獨的文件中創建布局,並在ListAdapter中使用它。 為此,請查看ListView教程

  2. 如果此布局是要嵌入多個活動的通用布局,請嘗試使用片段。 片段是活動的子部分,具有自己的視圖。 或者,您可以使用標記將布局嵌入到幾個xml中。

  3. 如果您真的想要一個自定義類和單個小部件,那么您需要擴展View類。 擴展布局意味着您不要以不同方式組織子窗口小部件(例如,將它們組織成圓形)。 擴展視圖,您可以以相同的方式准確地組織您想要的內容(按鈕,圖像,文本)。 但我不會騙你,這意味着很多工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM