android開發中-使用Dialog prompt擷取輸入資訊

來源:互聯網
上載者:User

 

prompt dialog是指彈出一個表單提供輸入框讓使用者可以輸入資料,程式需要讀取這些資料然後再進行後續處理。在Javascript中Window.prompt會彈出一個對話方塊讓使用者輸入資訊,然後程式就暫停在輸入框這裡,等到使用者輸入完成點擊確定後,程式才接著執行,所以prompt dialog是同步的形式。但是在android中dialog都是非同步形式,那麼怎麼完成類似同步的效果呢?

這就需要用到回調了。(Ajax也是非同步形式,所以也需要回調,回調幫我們解決了非同步作業卻達到同步效果的行為。)在Android中,我們也是通過AlertDialog來建立PromptDialog。我們要做一下幾個步驟:

  1. 建立一個View對象,由View提供輸入的控制項和布局(一般我們通過LayoutInflater將xml布局檔案轉換成View對象)
  2. 建立一個Builder對象
  3. 將第一步建立的View對象設定到Builder中。
  4. 建立按鈕和設定回呼函數
  5. 根據之前配置的Builder產生Dialog對象
  6. 調用Dialog.show()將產生的Dialog顯示出來

所以我們先建立xml布局檔案,這個布局最終會放到Dialog中。prompt_view.xml:

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical" android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"></p><p> <TextView android:id="@+id/promptmessage"<br /> android:layout_height="wrap_content" android:layout_width="wrap_content"<br /> android:layout_marginLeft="20dip" android:layout_marginRight="20dip"<br /> android:text="請在這裡輸入資訊:" android:gravity="left"<br /> android:textAppearance="?android:attr/textAppearanceMedium" /><br /> <EditText android:id="@+id/editText_prompt"<br /> android:layout_height="wrap_content" android:layout_width="fill_parent"<br /> android:layout_marginLeft="20dip" android:layout_marginRight="20dip"<br /> android:scrollHorizontally="true" android:autoText="false"<br /> android:capitalize="none" android:gravity="fill_horizontal"<br /> android:textAppearance="?android:attr/textAppearanceMedium" /></p><p></LinearLayout> 

然後將這個xml布局檔案轉換成View:

LayoutInflater li = LayoutInflater.from(this);<br />View view = li.inflate(R.layout.prompt_view, null); 

將View放到Builder中,設定按鈕和回呼函數,然後調用builder的create方法建立Dialog對象並將這個dialog顯示出來。

public void onShowPromptDialog(View v){<br /> //inflate需要顯示到Dialog裡的View對象<br /> LayoutInflater li = LayoutInflater.from(this);<br /> View view = li.inflate(R.layout.prompt_view, null);</p><p> AlertDialog.Builder builder = new AlertDialog.Builder(this);<br /> builder.setTitle("prompt測試");<br /> builder.setIcon(R.drawable.icon);<br /> //之前inflate的View 放到dialog中<br /> builder.setView(view);<br /> builder.setPositiveButton("確定", this);<br /> builder.setNegativeButton("取消", this);<br /> builder.create().show();</p><p>} 

這邊我們設定回調方法由Activity代理處理,所以Activity需要implements DialogInterface.onClickListener:

public class DemoDialog extends Activity implements DialogInterface.OnClickListener {</p><p>} 

然後為Activity添加未實現的onClick方法:

@Override<br />public void onClick(DialogInterface dialog, int which) {</p><p> if(which == Dialog.BUTTON_POSITIVE){</p><p> AlertDialog ad = (AlertDialog) dialog;<br /> EditText t = (EditText) ad.findViewById(R.id.editText_prompt);<br /> Toast.makeText(this, t.getText().toString(), Toast.LENGTH_LONG)<br /> .show();<br /> }</p><p>} 

這邊我們做的處理是:判斷Dialog中被點擊的是否是確定按鈕,如果是則從dialog中尋找提供輸入的View控制項(EditText),然後擷取使用者填寫的內容用Toast顯示出來。onClick方法會將當前被點擊的Dialog當成第一個參數,然後點擊的按鈕id當成第二個參數調用回呼函數,由於第一個參數的類型所有Dialog的基類介面DialogInterface所以需要強制轉換成AlertDialog對象才可以將View尋找出來,第二個參數按鈕ID,則會有三種值,因為AlertDialog最多可以有3個按鈕,Dialog類中提供了對於這3個按鈕對應的靜態變數值,所以可以通過將button id和這3個靜態變數值比較來獲得使用者點擊的是哪個按鈕。

在Android中使用PromptDialog有個需要注意的地方是,因為Android中Dialog都是非同步模式,所以你無法在將Dialog顯示出來後馬上就尋找Dialog中的輸入框,然後擷取輸入值,因為這時候使用者才看到輸入框並沒有填入值,所以擷取輸入值,並進行後續處理必須寫在回調方法裡。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.