顯示具有 User Interface 標籤的文章。 顯示所有文章
顯示具有 User Interface 標籤的文章。 顯示所有文章

星期二, 10月 04, 2011

dismiss and cancel dialog


dismiss and cancel dialog

* dismiss()
- thread-safe.

* cancel()
- triggered by "back"。
- 注意! 此動作不只會觸發onCancelListener也會觸發onDismissListener。

實作AutoCompleteTextView

實作AutoCompleteTextView

1.XML文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >
  7. <TextView  
  8.     android:layout_width="fill_parent" 
  9.     android:layout_height="wrap_content" 
  10.     android:text="@string/hello"
  11.     />
  12. <AutoCompleteTextView 
  13. android:id="@+id/autoCompleteTextView1" 
  14. android:text="" 
  15. android:layout_width="fill_parent" 
  16. android:layout_height="wrap_content">
  17.     <requestFocus></requestFocus>
  18. </AutoCompleteTextView>
  19. </LinearLayout>



2.java文件
  1. package test.AutoCompleteTextView;

  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.ArrayAdapter;
  5. import android.widget.AutoCompleteTextView;

  6. public class HelloAutoCompleteTextViewActivity extends Activity {
  7.     /** Called when the activity is first created. */
  8. //宣告一個AutoCompleteTextView物件為actv
  9. //實現ArrayAdapter產生str字串陣列的適配器
  10. //setAdapter()將適配器設定給actv
  11. private AutoCompleteTextView actv;
  12.     @Override
  13.     public void onCreate(Bundle savedInstanceState) {
  14.         super.onCreate(savedInstanceState);
  15.         setContentView(R.layout.main);
  16.         
  17.         actv = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
  18.         String[] str = {"abc" , "abcd" , "bcd" , "bcde"};
  19.         
  20.        ArrayAdapter adapter = new ArrayAdapter(this , android.R.layout.simple_dropdown_item_1line , str);
  21.        actv.setAdapter(adapter);
  22.     }
  23. }

星期一, 10月 03, 2011

Binding to Data with AdapterView

Android應用程式學習筆記

Binding to Data with AdapterView

AdapterView是ViewGroup的子類,它的子View是通過Adapter綁定的數據形式所決定的。AdapterView不管你想在何時顯示數據都是可用的。

Gallery、ListView和Spinner是AdapterView的子類的例子,你可以綁定特定數據並顯示。

AdapterView物件有兩個主要屬性:

  • 把數據填充到佈局上。
  • 處理用戶的選擇。

Filling the  layout with data

插入到佈局的數據通常通過AdapterView綁定倒是配器上的,它從外部資源取得數據。

以下為例子:

  1. 建立Spinner,綁定一個新的ArrayAdapter,ArrayAdapter從資源中讀取顏色陣列。
  2. 從一個View建立另一個Spinner,並與SimpleCursorAdapter綁定,從聯絡人中讀取姓名。

// Get a Spinner and bind it to an ArrayAdapter that 
// references a String array.
Spinner s1 = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter adapter = ArrayAdapter.createFromResource(
    this, R.array.colors, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(adapter);
// Load a Spinner and bind it to a data query.
private static String[] PROJECTION = new String[] {
        People._ID, People.NAME
    };
Spinner s2 = (Spinner) findViewById(R.id.spinner2);
Cursor cur = managedQuery(People.CONTENT_URI, PROJECTION, null, null);
     SimpleCursorAdapter adapter2 = new SimpleCursorAdapter(this,
    android.R.layout.simple_spinner_item, // Use a template
                                          // that displays a
                                          // text view
    cur, // Give the cursor to the list adapter
    new String[] {People.NAME}, // Map the NAME column in the
                                         // people database to...
    new int[] {android.R.id.text1}); // The "text1" view defined in
                                     // the XML template
                                         
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s2.setAdapter(adapter2);

Handling User Selection


// Create a message handling object as an anonymous class.
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {
    public void onItemClick(AdapterView parent, View v, int position, long id)
    {
        // Display a messagebox.
        Toast.makeText(mContext,"You've got an event",Toast.LENGTH_SHORT).show();
    }
};
// Now hook into our object and set its onItemClickListener member
// to our class handler object.
mHistoryView = (ListView)findViewById(R.id.history);
mHistoryView.setOnItemClickListener(mMessageClickedHandler); 

Creating a Custom Dialog

Android應用程式學習筆記

Creating a Custom Dialog

如果你想客製化設計對話框,你可以用布局和部件為對話框視窗建立自己的布局。在已定義你的布局後,傳入根視圖物件或是布局來源ID到setContentView(View)。

例子,建立右圖所示的對話框。

1.建立XML布局文件custom_dialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/layout_root"
              android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:padding="10dp"
              >
    <ImageView android:id="@+id/image"
               android:layout_width="wrap_content"
               android:layout_height="fill_parent"
               android:layout_marginRight="10dp"
               />
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="fill_parent"
              android:textColor="#FFF"
              />
</LinearLayout>
XML定義了ImageView和TextView以及LinearLayout。

2.設置對話框的佈局為上述的布局文件並定義ImageView和TextView的內容。

Context mContext = getApplicationContext();
Dialog dialog = new Dialog(mContext);

dialog.setContentView(R.layout.custom_dialog);
dialog.setTitle("Custom Dialog");
TextView text = (TextView) dialog.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.android);
在實體化對話框之後,setContentView(int)設定你的客製布局為對話框的布局,傳入客製布局的ID,現在對話框有一個已定義的布局,你可以呼叫findViewById(int)取得布局的Veiw物件並修改內容。

3.顯示對話框。


以Dialog類為基礎的對話框必須有標題,如果你不呼叫setTitle(),顯示標題的空間就會是空的,但是視可見的。如果你不想要有標題,你應該使用AlertDialog類建立客製化對話框。然而,因為用AlertDialog.Builder類建立AlertDialog是最簡單的,不需要setContentView(int)方法,取而代之,你必須呼叫setView(View)方法。該方法接收一個View物件,所以你需要從XML建立布局。

擴展XML布局,getLayoutInflater()取得LayoutInflater物件(或是getSystemService()),然後呼叫inflate(int , ViewGroup)方法,第一個參數是布局資源的ID,第二個參數是根View物件的ID。在此處,你可以在以擴展的布局中找到View物件並定義ImageView和TextView的內容。然後實體化AlertDialog.Builder並setView(view)設置對話框擴展布局。


AlertDialog.Builder builder;
AlertDialog alertDialog;
Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
                               (ViewGroup) findViewById(R.id.layout_root));
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);

builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();


星期日, 10月 02, 2011

Creating a ProgressDialog

Android應用程式學習筆記

Creating a ProgressDialog

ProgressDialog是AlertDialog類的延伸,它可以顯示一個紡車形式的進度動畫,表示未確定進度的任務,或是進度條,表示已定義進度的任務。該對話框可以提供按鈕,比如取消下載的按鈕。

可以簡單地呼叫ProgressDialog.show()打開進度對話框。比如圖顯示的進度對話框可以輕鬆地實現,無須通過onCreateDialog(int)回調方法管理對話框。



ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                        "Loading. Please wait...", true);

第一個參數是應用程式Context,第二個參數是對話框的標題,第三個參數是訊息,最後一個參數是顯示是否是不確定的進度(此參數只與創建進度條有關)。

進度對話框的預設形式是向紡車,如果你想要創建進度條來顯示下載進度,需要一些程式碼,以下將一一討論。


Showing a Progress Bar

實現進度條的步驟:

  1. ProgressDialog(context)建構式初始化進度對話框。
  2. setProgressStyle(int)設定進度對框的樣式為"STYLE_HORIZONTAL",即設定任何屬性,比如訊息。
  3. 當你準備好顯示對話框,呼叫show()或從onCreateDialog(int)回調方法回傳ProgressDialog。
  4. 你可以增加顯示在進度條上的進度,呼叫setProgress(int)傳入百分之百完成的數值或是呼叫incrementProgressBy(int)增加一個百分之百完成的數值。

實現以上步驟大概是這樣子:


ProgressDialog progressDialog;
progressDialog = new ProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);

以上是簡單的設定進度條,建立進度對話框所需要的大部分程式碼實際上牽涉到進度的更新。你可能會發現必須為你的工作建立第二個執行續,然後用Handler物件向Activity的UI執行續回報進度。那如何使用Handler物件實現第二個執行續的通訊,會在之後學習到。






Creating an AlertDialog

Android應用程式學習筆記

Creating an AlertDialog

AlertDialog是Dialog類的延伸,它有能力建造大部分的對話框的使用者介面且是建議使用的對話框形式,你應該使用有任何以下屬性的對話框:

  • A tile
  • A text message
  • one , two or three buttons
  • A list of selected items (with optional checkboxs or radio buttons)
要創建AlertDialog,使用AlertDialog.Builder子類,用AlertDialog.Builder(context)取得Builder物件然後用公開方法來定義所有AlertDialog的特性,在完成Builder物件之後,用create()方法取得AlertDialog物件。

以下的主題要放在如何使用AlertDialog.Builder類定義AlertDialog的特性。


Adding buttons

使用set...Button()方法創建有並肩按鈕的AlertDialog,如右圖所示。


AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                MyActivity.this.finish();
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
AlertDialog alert = builder.create();

首先,setMessage(CharSequence)增加一個訊息到對話框,接著,setCancelable(boolean)設定對話框為not cancelable(所以用戶無法透過back鍵來關閉對話框)。為每個按鈕使用一個set...Button()方法,比如,setPositiveButton(),它接收按鈕的名稱及一個DialogInterface.onClickListener,定義當用戶選擇按鈕對應的動作。

Adding a list

使用setItem()方法創建有可選擇的項目列表的對話框,如右圖所示。

final CharSequence[] items = {"Red", "Green", "Blue"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
});
AlertDialog alert = builder.create();

首先,setTitle(CharSequence)設定對話框標題,接著,setItem()增加一個可選擇項目列表,它接收一個用來顯示的項目陣列及一個DialogInterface.onClickListener,定義用戶選擇項目對應的動作。


Adding checkboxs and radio buttons

使用setMultiChoiceItems()或setSingleChoiceItems()方法創建複選或單選的選擇列表於對話框中。如果你在onCreateDialog()方法中創建其中一種可選擇的列表,Android系統將為你管理列表的狀態,只要Activity是活耀的,對話框會記住先前被選擇的項目,但是當用戶結束activity,選擇就會遺失。

創建有單選項目的列表的對話框,使用先前的例子的程式碼,但setItem()方法用setSingleChoiceItem()方法代替。

final CharSequence[] items = {"Red", "Green", "Blue"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
});
AlertDialog alert = builder.create();

setSingleChoiceItem()的第二個參數是為checkedItem的整數數值,它表示預設被選擇的項目,使用"-1"表示預設沒有項目被選擇。

Creating Dialogs

Android應用程式學習筆記

Creating Dialogs

對話框通城市小小的視窗,顯示在目前的activity面前,底層的activity失去焦點而對話框鳩收所有用戶的互動。對話框正常用途是通知,應該中斷用戶並執行簡短的直接與應用程式進展相關的任務(比如,進度條或者登入提示)。

Dialog類是創建對話框的基礎類,然而,通常不應該直接實現Dialog類,應該使用以下的子類的其中一個:
AlertDialog
可以管理零、一、二和三個按鈕,或者可選擇項目列表,包括checkboxs、radio buttons的對話框,AlertDialog有能力建構大部分的對話框的使用者介面並且也是被推薦的對話框類型。
ProgressDialog
顯示進度輪或是進度條的對話框。因為它是AlertDialog的延伸,所以它也支援按鈕的功能。
DatePickerDialog
 允許用戶選擇日期的對話框。
TimePickerDialog
允許用戶選擇時間的對話框。
如果你想要客製化自己的對話框,你可以繼承基礎Dialog物件或上述提到的子類來定義新的布局。


Showing a Dialog

對話框總是創建與顯示為activity的一部分,通常應該從Acitvity的onCreateDialog(int)回調方法創建對話框。當你使用該回調方法,Android系統會自動管理每個對話框的狀態並把它們掛在activity上,有效的使activity為對話框的"主人"。每個對話框從activity繼承一些特性,例如,當對話框打開時,菜單鍵揭示為activity產生的選擇菜單和音量鍵藉activity調整音頻。

當你想顯示對話框,呼叫showDialog(int)方法並傳入能唯一辨識你想顯示的對話框的整數。

當對話框被請求的第一時間,Android呼叫來自Activity的onCreateDialog(int),它是實現Dialog類的地方,該方法傳入的整數與你傳入showDialog(int)的整數是相同的。創建對話框之後,在方法最後回傳一個物件。

在對話框顯示之前,系統也會呼叫自選的回調方法onPrepareDialog(int , Dialog),如果你想要在每次打開對話框的時候改變任何對話框的特性,就要定義該方法。每次打開對話框就會呼叫該方法,而onCreateDialog(int)只會在對話框第一次打開的時候被呼叫。如果你不想定義onPrepareDialog(int , Dialog),對話框將維持與前一次打開的一樣,該方法傳入對話框的id和在onCreateDialog(0回傳的Dialog物件。

定義onCreateDialog(int)和onPrepareDialog(int , Dialog)回調方法的最好方式是用switch判斷式檢查傳入的id參數。每一個case對應一個對話框ID並且創造和定義各自的對話框。例如,想像一個遊戲使用兩個不同的對話框,一個顯示遊戲已經暫停,另一個顯示遊戲已經結束。首先,為每個對話框定義整數ID。


static final int DIALOG_PAUSED_ID = 0;
static final int DIALOG_GAMEOVER_ID = 1;

然後,用switch case為每個對話框定義onCreateDialog(int)回調方法。


protected Dialog onCreateDialog(int id) {
    Dialog dialog;
    switch(id) {
    case DIALOG_PAUSED_ID:
        // do the work to define the pause Dialog
        break;
    case DIALOG_GAMEOVER_ID:
        // do the work to define the game over Dialog
        break;
    default:
        dialog = null;
    }
    return dialog;
}

 當顯示其中對話框的時候,呼叫showDialog(int)傳入對話框ID。


showDialog(DIALOG_PAUSED_ID);


Dismissing a Dialog

當你想關閉一個對話框時,你可以在對話框物件上呼叫dismiss()方法,如果有必要,你也可以從activity呼叫dismissDialog(int),它可以為你有效的在對話框物件呼叫dismiss()方法。

如果你使用onCreateDialog(int)來管理你的對話框的狀態,然而你每次關閉對話框時,對話框物件的狀態會被Activity保留,如果你決定你不再需要此對話框或很重要的狀態被清除,你應該呼叫removeDialog(int)方法,移除任何物件內部引用和如果對話框正顯示,它將被關閉。

Using dismiss listener

如果你想要應用程式在對話框關閉時執行一些程序,你應該附加一個on-dismiss監聽器到對話框。

首先,定義DialogInterface.onDismissDialog接口,此接口只有一個方法onDismiss(DialogInterface),當對話框關閉時呼叫該方法。然後,傳送一個onDismissListener實作到setOnDismissListenr()。

然而,注意對話框也可以被"取消",這是一個特殊的情況,表示對話框被用戶明確的取消。這樣的情況發生在如果用戶按壓back鍵關閉對話框,或如果對話框明確呼叫cancel()方法(也許是來自對話框的取消按鈕)。當對話框被取消,OnDismissListener仍會被通知,但是如果你想要被告知對話框已經明確的被取消了,那你應該用setCancelListener()來註冊一個DialogInterface.onCancelListener。



星期日, 9月 25, 2011

Declaring Layout

Android應用程式學習筆記

Declaring Layout

佈局(Layout,以下都稱作布局)是在一個activity中使用者介面的結構,它定義了佈局結構及確保每個元素顯示給使用者,你有兩種方式可以宣告你的布局:

  • Declaring UI elements in XML
    Android提供對應view類與子類的簡單XML詞彙,例如,部件與佈局。
  • Instantiate layout elements at runtime
    你的應用程式能在編程時建立View及ViewGroup。
Android架構給妳相當高的靈活性,你可以使用其中一種方式或兩種方式都用來宣告與管理你的應用程式的使用者介面。例如,你可以在XML宣告你的應用程式的預設布局,包括顯示在布局上的屏幕元素及佈局的屬性。你可以在應用程式中添加程式碼,在執行時修改屏幕物件的狀態,包括宣告在XML的也可以修改。

在XML宣告你的使用者介面的好處是使你更能從控制使用者介面行為的程式碼中分離出來,將你的使用者介面的描述從應用程式程式碼中分離出來,如此表示你可以修改或調整使用者介面描述不需要修改原始碼及重新編譯。例如,你可以為不同取向的介面、不同裝置屏幕大小、不同語言來建立布局文件。此外,在XML宣告布局更容易想像使用者介面的結構,如此就能更輕鬆的調適錯誤。

一般來說,宣告UI元件的XML詞彙緊隨類別與方法的結構與命名,這裡元件名稱對應到類別名稱,屬性名稱對應到方法。事實上,該隊應是非常直覺的,你可以猜到甚麼樣的屬性對應甚麼樣的方法,或者甚麼樣的方法對應到給定的xml元件。然而不是所友都能辨識出來,在一些案例中,有一些命名有輕微的不同。例如,EditView元件有一個text屬性對應了EditView.settext()方法。


Write the XML

使用android的XML詞彙,你可以快速地設計你的UI及UI中的屏幕元件,與你用HTML建立網頁的方式一樣-有許多巢狀標籤。

每個布局文件必須確切地包含一個根標籤,它必須是View或ViewGroup物件。一旦你定義了根標籤,你可以增加其他的布局物件及部件作為子標籤,逐步建立起定義布局的View階層樹。例子,以下有一個XML文件使用了垂直的線性布局並容納了一個TextView與一個Button。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent" 
              android:layout_height="fill_parent" 
              android:orientation="vertical" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello, I am a TextView" />
    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button" />
</LinearLayout>

在XML宣告了你的布局後,儲存為.xml附檔名的檔案,並存在res/layout目錄下,


Load the XML Resource

當你編譯你的應用程式,每一個XML布局文件編譯成View資源,你應該從程式碼中載入布局資源,在Activity.onCreate()回呼方法中實現。藉著呼叫setContentView()方法,用R.layout.layout_filenam格式來引用布局資源。例如如果你的布局文件存為main_layout.xml,你就會如此為activity載入此文件:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
}

當你的activity啟動時,android架構會去呼叫在activity中的onCreate()回呼方法。


Attributes

每個View與ViewGroup物件支持它們自己的XML屬性,有些屬性是給特定View物件(例如,TextView物件支持textSize屬性),這些屬性也是繼承自任何繼承自這個類別的View物件。有些屬性對於所有View物件是普遍的,因為它們都是繼承自根View類別(如Id屬性)。且其他屬性被視為"布局參數",它們是描述View物件的布局取向。

ID
任何一個View物件都有一個整數ID屬性伴隨,辨識在階層樹中的View的唯一標籤。當應用程式被編譯,這個ID以一個整數被引用,但是ID屬性在XML文件中通常被分配為一個字串。ID屬性對所有View物件是相當普遍的且你會很常使用到它,在XML文件中是如此表示的:

android:id="@+id/my_button"

字串開頭的@表示XML解析器應該分析及擴展其餘的字串並視為一個ID資源。加號符號(+)是表示這是一個新的資源名稱,必須鍵立即增加到我們的資源(R.java檔案)。Android架構提供許多其他ID資源,當引用一個ID資源時,你不需要加號符號,但是必須加上android package namesapce,如以下:

android:id="@android:id/empty"

有android package namespace,我們現在從android.R資源中引用一個ID。
為了建立試圖以及從應用程式引用它們,普遍的模式是:

  1. 定義view/widget物件並分配一個唯一的ID:
    <Button android:id="@+id/my_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/my_button_text"/>
  2. 建立view物件實體,從佈局中取得它(通常在onCreate()方法中):
    Button myButton = (Button) findViewById(R.id.my_button);
當建立RelativeLay時,為view物件定義ID是相當重要的。在相對布局(Relativelayout)中,兄弟view物件可以定義布局相對於其他兄弟view物件透過引用唯一的ID來達成。


Layout Parameters

XML布局屬性命名為layout_something來為view定義布局參數,對ViewGroup也是如此。

每個ViewGroup類都是繼承ViewGroup.LayoutParams來實現巢狀類,這個子類包括定義每個子view物件的大小及位置的特性,ViewGroup物件也是。以下圖示顯示父view group來定義每個子view的布局參數。


注意每個布局參數子類都有自己的語法來設定數值,每個子元件必須定義布局參數。

每個view小組包括寬和高(layout_width及layout_height),且每個view也必須定義它們,許多布局參數也包括選擇邊沿與邊界。

你可以指定確切的尺寸,雖然你通常不想如此,更加平常的是,擬將使用這些常數來設定寬和高:
  • wrap_contents
    告訴你的view物件自己的尺寸需要包含內容,意思就是view的尺寸要剛好能容納內容。
  • fill_parent
    告訴你的view物件尺寸與父view物件一樣大。
一般來說,是不推薦使用絕對單位如像素指定布局的寬和高,取而代之的是使用相對尺寸如 density-independent pixel (dp)、wrap_contents、fill_parent是較適合的方式,因為能幫助確保你的應用程式顯示在不同的裝置上。


Layout Position

View的幾何形狀是矩形,view都有它的位置,可以用left和top一對來表示、用二維座標來表示、用寬和高來表示。位置和座標的單位都是像素。

呼叫getLeft()和getTop()方法取得view物件的位置是有可能的,前者回傳left或X來表示view的座標,後者回傳top或Y來表示座標。這些方法皆是回傳與它的父view物件相對的位置,例如,getLeft()回傳20,表示位於父view物件的左邊緣右邊20像素的位置。

此外,有提供許多方便的方法來避免不必要的運算,如getRight()和getBottom()。


Size , Pading and Margin

一個view大小可以表示成寬和高,實際上一個view具有兩組的寬和高。

第一組是measured width和measured height,這些尺寸定義了view在父view物件想要有多大,測量的尺寸能藉著呼叫getMeasuredWidth()方法和getMeasuredHeight()方法取得寬和高。

第二組是width和height,或有時是drawing width和drawing height,這些尺寸定義了view實際在屏幕上的大小,這些數值可能與measured width和measrued height的數值不同,我們可以呼叫getWidth()方法和getHeight()方法取得寬和高。

去測量尺寸時,view是有考慮到填充的大小,Padding是表示view的左側、頂部、右側、底部的大小,Padding可以用像素來彌補view的內容,例如left padding of 2就是只view的內容往左邊界的右邊推出去2個像素。我們可以呼叫setPadding(int ,int ,int ,int)來設定Padding以及呼叫getPaddingLeft()、getPaddingTop()、getPaddingRight()、getPaddingBottom()來取得Padding大小。



好了,以上是宣告布局的內容,以下做一個整理:
在這篇內容中說道如何宣告一個布局、如何設定布局的屬性。

1.我們有兩種方式能宣告布局,有就是說我們有兩種方式能編輯activity的使用者介面。
  • 在XML中編輯。
  • 在程式碼中編輯。
建議是將使用者介面的布局編輯在XMl文件中。

2.使用View和ViewGroup對應的標籤來編輯布局文件。
  • <RelativeLayout>對應RalativeLayout。
  • <TextView>對應TextView。
  • <Button>對應Button。
  • ...
3.在activity的onCreate()方法中呼叫setContentView()來取得布局資源。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
}

4.在布局文件中設定View和ViewGroup的屬性。

5.view與viewgroup之間的關聯。

6.布局文件中view與viewgroup的位置設定。