|
(1)Android自定義對話框是一種非常實用的控件。與AlertDialog不同的是,自定義Dialog沒有ALertDialog的builder,因此在Button按鈕監(jiān)聽這一塊需要自己定義,這也使自定義Dialog變得比較復雜。常用的是在Dialog中
(2)Android自定義Dialog運行時往往需要與調(diào)用它的Activity進行數(shù)據(jù)傳遞,比如Dialog中的EditText輸入的數(shù)據(jù)需要回調(diào)到Activity中使用,這個功能在C#中式非常常見的。但Android與C#所不一樣的是。當Dialog運行時,Android是非阻塞的,也就是其下的.show()之下的代碼還是會繼續(xù)運行,而C#則是阻塞的。因此很多習慣C#的朋友在遇到Android的Dialog運行時,也是希望在show()之后直接獲取Dialog中的數(shù)據(jù)。這事實上是行不通的。一種比較可行的方法是在自定義Dialog類時聲明數(shù)據(jù)回調(diào)的接口,然后在Activity中實現(xiàn)接口的方法。
以下是一個簡單的例子,用于解決這兩個問題:
- public class InputDialog extends Dialog
- { private Context context;
- private EditText editText;
- private Button button_sure;
- private Button button_cancel;
- public OnSureClickListener mListener;
-
- public InputDialog(Context context)
- {
- super(context);
- this.context = context; }
- public InputDialog(Context context,OnSureClickListener listener)
- //對InputDialog的構(gòu)造函數(shù)進行重載,添加了OnSureClickListener這個參數(shù)
- {
- super(context);
- mListener = listener;
- }
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.project_edit_dialog);
- setView();
- }
- private void setView()
- {
- button_sure = (Button) findViewById(R.id.button_project_dialog_sure);
- button_cancel = (Button) findViewById(R.id.button_project_dialog_cancel);
- editText = (EditText) findViewById(R.id.edit_project_new_name);
- //這里的監(jiān)聽事件,因為該類繼承l(wèi)Dialog類的DialogInterface,而DialogInterface中也有OnClickListener,因此需要用到全名View.OnClickListener
- button_sure.setOnClickListener(new View.OnClickListener()
- {
- public void onClick(View v)
- {
- mListener.getText(editText.getText().toString());
- dismiss();
- }
- });
- button_cancel.setOnClickListener(new View.OnClickListener()
- {
- public void onClick(View v)
- {
- mListener.getText(editText.getText().toString());//在Button監(jiān)聽事件中實現(xiàn)這一方法
- dismiss();
- }
- });
- }
-
- public interface OnSureClickListener
- {
- void getText(String string); //聲明獲取EditText中數(shù)據(jù)的接口
- }
- }<pre class="java" name="code"> </pre><br>
- <pre></pre>
- <p>以上代碼完成了自定義Dialog類的構(gòu)建。接下來,如果想要在Activity中獲取Dialog中的數(shù)據(jù),只需實例化Dialog即可。</p>
- <pre class="java" name="code">OnClickListener click_new = new OnClickListener()
- {
- public void onClick(View v)
- {
- OnSureClickListener listener1 = new OnSureClickListener(){
- public void getText(String string)
- {
- inputFile = string;
- try
- {
- addFile();
- } catch (IOException e){}
- }
- };
- InputDialog d1 = new InputDialog(ProjectActivity.this,listener1);
- d1.show();
- }
-
- };</pre>
- <p>在一個普通的Button OnClickListener中,實例化一個OnSureClickListener,Dialog中的EditText值便賦予給了Activity的成員變量inputFile。</p>
- <p> 一</p>
- <p> </p>
- <pre></pre>
|