Android 布局詳解

來源:互聯網
上載者:User

標籤:android   style   blog   http   color   使用   

Android 布局詳解

1.重用布局

當一個布局檔案被多處使用時,最好<include>標籤來重用布局。

例如:workspace_screen.xml的布局檔案,在另一個布局檔案中被重複使用三次,那麼可使用如下的布局代碼:

<LinearLayout

  androd:layout_width=”fill_parent”

  androd:layout_height=”fill_parent” >

  <!-- 引用三次workspace_screen -->

  <include android:id=”@+id/cell1 layout=”@layout/workspace_screen” />

  <include android:id=”@+id/cell2 layout=”@layout/workspace_screen” />

  <include android:id=”@+id/cell3 layout=”@layout/workspace_screen” />

</LinearLayout>

  上面的代碼中的<include>標籤還使用了一個android:id屬性,實際上,該屬性指定的是workspace_screen.xml布局檔案中的根節點的android:id屬性值。若原根節點已經設定了android:id屬性值,那麼<include>標籤的android:id屬性值將被覆蓋workspace_screen.xml布局檔案中的根節點的android:id屬性值。<include>標籤還可以覆蓋被引用的布局檔案根節點額所有與布局有關的屬性(也就是以“android:layout_”開頭的屬性)。通過覆蓋屬性值,可以使被引用的布局檔案中的視圖擁有不同的布局風格。例如,下面的布局檔案代碼引用了image_holder.xml檔案兩次,但只有第一個<include>標籤覆蓋了一些屬性:

<!-- 覆蓋了根節點中的width和height -->

<include layout=”@layout/image_holder”

  android:layout_width=”fill_parent”

  android:layout_height=”fill_parent” />
<!-- 下面的沒有覆蓋任何屬性 -->

<include layout=”@layout/image_holder” />

注意:如果像覆蓋布局的尺寸,必須同時覆蓋android:layout_width和android:layout_height。不能只覆蓋其中一個屬性,否則對這兩個屬性值的覆蓋都無效。

<include>標籤在設計與裝置相關的布局檔案時非常重要,例如,將手機橫屏(landscape)和豎屏(portrait)時可以使用不同的布局檔案,但有可能橫多視圖的布局是相同的。這樣就可以在res/layout目錄中放置橫屏和豎屏都需要用到的布局,而在res/layout-land和res/layout-port目錄中的布局檔案可以使用<include>標籤引用這些布局。

 

2.布局別名

  在res目錄下的所有子目錄都是資來源目錄,例如res/values、res/layout等。這些木中儲存的都是預設的資源。但在滿足某些情況下系統需要使用另外的資源,例如,支援國際化的程式如果當前環境是中文,就要求所有字串資源從res/values-zh目錄中去讀,若環境是英文的,則要去res/valuse-en中去讀。其中res/values-zh、res/valuse-en就是本地化資來源目錄。所謂本地化目錄就是滿足特定要求的資源檔存放的目錄,例如,螢幕的尺寸、不同的android版本、不同的語言環境、不同的螢幕方向等等。若果系統方向沒有滿足當前特定要求的本地化資來源目錄,就會從預設的資來源目錄中去尋找資源。例如,現在本地資來源目錄只有res/values-zh和res/values-en,而當前語言環境為法語,但沒有res/values-fr目錄,所有系統會到預設的資來源目錄中尋找資來源目錄(res/values)尋找相應的字串資源。

所謂布局別名就是為不同的布局檔案指定同一個資源ID,以便在不同的環境下系統可以使用同一個布局資源ID訪問不同的布局資源。使用布局別名必須注意布局檔案的引用只能放在本地化資來源目錄中,而不能放到預設的資來源目錄   (res/values)中。例如:

假如在res/layout目錄中有兩個布局檔案:main_layout.xml和main_layout_en.xml,並且在主視窗中使用setContentView(R.layout.main_layout)將main_layout.xml與當前視窗關聯。現在建立一個res/values-en目錄,然後在該目錄下建立一個refs.xml檔案(資源檔名可以任意命名),最後在refs.xml檔案中輸入如下內容:

<resources>

  <!-- 為main_layout_en.xml檔案指定一個名為main_layout的別名 -->

  <item name=”main_layout” type=”layout”>@layout/main_layout_en</item>

</resources>

  如果當前環境正好是英文,系統就會使用res/values目錄中的資源,所以會為main_layout_en.xml檔案指定一個別名。如果別名正好與某一個布局檔案的資源ID相同,那麼就相當於修改該資源ID的指標,也就是說如果在英文環境下,R.layout.main_layout引用的不再是main_layout.xml,而是main_layout_en.xml。

  一般如果目錄中的檔案太亂,需要整理一般有兩種處理方式:

  ① 建立若干個子目錄,然後分門別類地將目錄的檔案放到這些剛建立的目錄中。

  ② 不移動元目錄中的檔案,而是為每一個檔案建立一個索引(可以將這些索引資料存放區在資料庫或其他檔案中),然後對這些索引進行分組管理。這麼做的好處是並不需要移動檔案,而且同一個檔案還可以屬於不同的類別。如果採用第一種方式,就需要將檔案所屬的每個類別對應的目錄都複製一份,浪費空間。

 

3.動態裝載布局

  例如,主布局檔案(activity_load_layout.xml)只包含一個 <LinearLayout>標籤,並未包含任何子標籤(item.xml),因為所有視圖都是動態載入的。

  如果需要動態裝載、添加視圖,桐城在主視窗類(LoadLayoutActivity)中調用LayoutInflatable.inflate方法建立一個新的視圖,inflate方法的原型如下:

  public View inflate(int resource, ViewGroup root);

  resource:表示要裝載的視圖ID;root:表示要裝載的視圖的父視圖。如果沒有父視圖,則為null。

 

 

 

4.動態設定布局屬性

  動態添加視圖時是不會採用靜態方法設定布局,而要想重新設定布局屬性,就需要使用LayoutParams類。但要注意,由於主視窗布局使用的是LinearLayout布局,所以要使用android.widget.LinearLayout.LayoutParams類。修改後的LoadLayoutActivity類的代碼如下:

public class LoadLayoutActivity extends Activity {

  @Override  // 設定所有控制項置中顯示

  protected void i=onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    LinearLayout parent = (LinearLayout ) getLayoutInflater().inflate(R.layout.sctivity_load_layout, null);

    for(int i=0; i<10; i++) {

      View view = getLayoutInflater().inflate(R.layout.activity_load_layout, null);

      TestView textView = (TestView) view.findViewById(R.id.textview);

      text.setText(“text”+i);

      // 建立LayoutParams對象

      android.widget.LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LayoutPatams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

      // 設定gravity欄位的值(水平置中)

      layoutParams.gravity = Gravity.CENTER_HORIZONTAL;

      // 動態添加視圖是指定父視圖(LinearLayout)的布局參數

      parent.addView(view, layoutParams);

    }

    setContentView(parent);

  }

}

 

5.從右向左布局(RTL Layout)

  從Android4.2開始,Android SDK支援從右向左UI布局的方式。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.