2013年1月15日 星期二

[Android]AlertDialog之章

Alertdialog相關Survey:
官網AlertDialog 簡介(英文)

AlertDialog/ProgressDialog 對話框處理


一個簡單的小互動 彈跳視窗AlertDialog

首先這是我的UI layout
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

            android:id="@+id/get"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button1"
        android:layout_alignParentLeft="true"
        android:ems="10"
        android:inputType="textPersonName" >


   

宣告他們
private EditText get;
private Button push;
private String tmp;


protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
push = (Button) findViewById(R.id.push);
get = (EditText)findViewById(R.id.get);
push.setOnClickListener(new OnClickListener(){
public void onClick(View view){
tmp = get.getText().toString();
say();
}
}
);
}
//實作一個method 並設定標題跟裡面顯示的文字,在這邊我將將顯示的文字設成EditText get取得的值,並且可以設成OK或是我知道了
也可以將訊息內容 設成exception e 顯示提示錯誤的文字

private void  say() {
new AlertDialog.Builder(this).setTitle("您好")
.setMessage(tmp + "您好")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
}).show();

結果:
假設輸入 丁丁 就會變成 丁丁您好 ; 迪西就會變成 迪西您好 ; 波波就會變成 波波您好


話說有個類似的東西叫做Toast  (吐司)的 也會有類似的效果,改天來玩玩!



特別分享  不按按鈕關閉alertdialog的方法(2013/2/7更新)


用  create創建 alertdialog物件
AlertDialog dialog = new AlertDialog.Builder(context).create();


關閉對話框:
dialog.dimiss();

自行定義dialog的參數,需要在show()方法後面設定:
  1. dialog.show()  
  2. WindowManager.LayoutParams params = dialog.getWindow().getAttributes();  
  3. params.alpha = 0.8f; //透明度 
  4. params.width = 460;  //dialog寬度  
  5. params.y = height -20//顯示位置,默認居中顯示  
  6. controlPanel.getWindow().setAttributes(params);  

[Android]AlertDialog進階應用---內嵌圖片的AlertDialog




相關Survey:

AlertDialog用法续:在对话框显示View





[Android]一個簡單的小互動 彈跳視窗AlertDialog 中我們了解如何呼叫並實作一個AlertDialog的訊息彈跳視窗

而如果只是單純訊息顯示是否嫌太過單調
因為最近需要實作一個內嵌圖片的AlertDialog
除了內建的三個按鈕
setPositiveButton()--確認
setNegativeButton()--取消
setNeutralButton()--忽略
外若有表單實作需求可以查看相關survey:
Givemepass - 如何使用AlertDialog
shung007-[Android] 如何發送簡訊並使用自訂的AlertDialog (How to send SMS and use custom AlertDialog)
   Chickenrice's Workshop        -    [Android] AlertDialog-嵌入客製化表  (參考成功)

gyflyx的专栏 -  android Dialog介绍


老鼠的隨手筆記 - Android - 基礎筆記(一) AlertDialog




安卓巴士 - AlertDialog详解  (相關應用應有盡有,寫得很詳細)


實作本文開始:
找一張圖片  放在res/drawable資料夾裡面

在layout裡面建立一個xml  -  dialog.xml


內文:


  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  >
            android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/dingding" />



主程式:


public class MainActivity extends Activity {
private EditText et;
private Button bt;
private String logid;
private ImageView img;
private View adview;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText)this.findViewById(R.id.et);
bt = (Button)this.findViewById(R.id.bt);

LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
adview = inflater.inflate(R.layout.dialog,null);


bt.setOnClickListener(new OnClickListener(){
public void onClick(View v){
logid =  et.getText().toString();
say();
}});}

private void  say() {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(logid + "您好,經過前世運算機算出你前世可能是:");
  //builder.setMessage("");
  builder.setView(adview);
  DialogInterface.OnClickListener OkClick = new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
              }
          };
  builder.setPositiveButton("確定", OkClick);
  builder.show();
         }}}


執行結果1:
執行結果2:(好笑的來了...)


圖片是寫死的 所以誰輸入 誰的前世都是丁丁
但是其實可以用一些程式去控制  像if 或 switch機制等

收工!

========================================================================
2013/1/28更新 點選AlertDialog的確定後 再輸入一次值之後 程式會直接出現未知的錯誤並關閉
參見survey:http://www.javaworld.com.tw/jute/post/view?bid=26&id=300242
http://emmet1988.iteye.com/blog/1039436
http://www.eoeandroid.com/thread-66288-1-1.html

有評論說是一妻不二嫁 一個xml對應到兩個view的關係所以出錯
所以必須釋放掉 "removeView"

解法:
將LayoutInflater inflater = getLayoutInflater();

View adview = inflater.inflate(R.layout.dialog,null);
設成局部變數 即:



private void  say(int seat_id) {
LayoutInflater inflater = getLayoutInflater();
View adview = inflater.inflate(R.layout.dialog,null);
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(seat_id + "號座乘客按了下車鈴");
  //builder.setMessage("");
  builder.setView(adview);
  DialogInterface.OnClickListener OkClick = new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
              
              }
          };
  builder.setPositiveButton("確定", OkClick);
  builder.show();
}
就解決了,不過變成沒辦法儲存資訊 因為呼叫method才會產生view
再點選又是新的view了...


[Android]AlertDialog.Builder生命週期與視窗溢位問題




android 中視窗溢位(android.view.WindowLeaked)


1.Activity 的生命週期與 Dialog 的不一樣 
AlertDialog.Builder builder=new AlertDialog.Builder(context);
2.context 是Activity的上下文本 (context)
3.Dialog 要在Activity 銷毀前 dismiss()掉,不然就會發生WindowLeaked
 在android中常常會遇到與context有關的内容: 在語法 AlertDialog.Builder builder = new AlertDialog.Builder(this); 中,要求傳遞的參數就是一個context,在這我們傳入的是this,那麼這個this究竟指的是什麼呢? 這裡的this指的是Activity.this,是這個語法所在的Activity的this,是這個Activity 的上下文本context。
有教學看到 this.getApplicationContext(),但又有人說這是不對的。 
AlertDialog對象是依賴於一個View的,而View是和一个Activity對應的。 
於是在這裡牽涉到生命周期的問題,this.getApplicationContext()取的是這個應用程式的Context,Activity.this取的是這個Activity的Context,這兩個的生命週期是不同的,前者的生命周期是整個應用,後者的生命週期只是它所在的Activity。
而AlertDialog應該只是屬於一個Activity的,在Activity銷毀的時候它應該也會跟著銷毀,不會再存在;但是,傳入this.getApplicationContext(),就表示它的生命週期是整個程式,這顯然超過了他的生命週期了。所以在這我們應該正確的只能使用Activity的this。


沒有留言:

張貼留言