亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android開發筆記之:Dialog的使用詳解

2020-04-11 12:23:01
字體:
來源:轉載
供稿:網友
Dialog是任何系統都必須有的一個控件,作為輔助窗口,用于顯示一些消息,或請求用戶采取一引起操作等。
在Android中也不例外,基本使用可能參看文檔。
使用時的注意事項
1. BACK鍵能取消掉對話框(dismiss),但是卻不會觸發其onOkey和onCancel回調接口,所以如果你的對話框會改某些狀態,一定要注意還有第三種方式取消對話框。
2. 盡量少用模態對話框(Model dialog),如果Dialog.setCancellable(false),就變成了一個模態對話框,除了程序內部把其Dismiss,否則按什么鍵都無法將其取消。這是極差的用戶體驗,對話框本身就是一種干擾,再無法取消會把用戶搞瘋的。所以除非特別有必要,也即當執行某個操作時不希望被打破,才可以使用模態對話框。
3. 盡量少用對話框,它對用戶是一種干擾,除非需要用戶做操作,或者做出選擇。通常的一般性的通知用Toast或者Notification就足夠了。
4. 不要使用對話框風格的Activity,也即把Activity變成一個對話框。因為這樣是自已定義的布局,與系統Dialog的風格可能會不一致。最嚴重的是當系統風格發生變化,Dialog的子類會變化,但Activity式的對話框就不會變化??梢栽贗CS中找一找Activity對話框,你會發現其OK是在左邊,而ICS中系統Dialog的OK都是在右邊的。
5. 盡量保證Dialog對象活在Activity的生命周期之內,也即至多是在onCreate()和onDestroy()之間。
6. 要想到和測試到Activity在其Dialog.dismiss()之前死掉的情況。因為Activity必須依附于某個正在顯示的Activity實例,當顯示和取消的時候其Activity實例必須存在,否則就會有"IllegalArgumentException: View not attached to window manager"。
復制代碼 代碼如下:

05-15 02:45:26.320: E/AndroidRuntime(1161): java.lang.IllegalArgumentException: View not attached to window manager
05-15 02:45:26.320: E/AndroidRuntime(1161):     at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
05-15 02:45:26.320: E/AndroidRuntime(1161):     at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:200)
05-15 02:45:26.320: E/AndroidRuntime(1161):     at android.view.Window$LocalWindowManager.removeView(Window.java:432)
05-15 02:45:26.320: E/AndroidRuntime(1161):     at android.app.Dialog.dismissDialog(Dialog.java:278)
05-15 02:45:26.320: E/AndroidRuntime(1161):     at android.app.Dialog.access$000(Dialog.java:71)
05-15 02:45:26.320: E/AndroidRuntime(1161):     at android.app.Dialog$1.run(Dialog.java:111)
05-15 02:45:26.320: E/AndroidRuntime(1161):     at android.app.Dialog.dismiss(Dialog.java:268)
05-15 02:45:26.320: E/AndroidRuntime(1161):     at com.hilton.effectiveandroid.app.DialogDemo$1.handleMessage(DialogDemo.java:26)
05-15 02:45:26.320: E/AndroidRuntime(1161):     at android.os.Handler.dispatchMessage(Handler.java:99)

7. Dialog.show()必須在主線程里調用,但Dialog.dismiss()卻可以在任何線程中調用。
三種使用方式比較
1. 直接創建一個局部的Dialog對象
優點是變量是局部的容易理解和維護。缺點是Dialog對象難以控制,容易引發RuntimeException。
2. 把Dialog對象變成Activity的域
優點是Dialog對象可以重復利用,且Activity可以控制以保證Dialog不會在Activity生命周期外顯示。是推薦的使用方式。
3. 用Activity的方法onCreateDialog(), showDialog()和dismissDialog()
優點是Frameworks會幫忙照看Dialog,在大多數情況下這是推薦的做法。但是對于Activity提前死掉的情況,此方法必有RuntimeException,且無法回避。
實例
復制代碼 代碼如下:

public class DialogDemo extends Activity {
    private static final int DISMISS_DIALOG = 1;

    private ProgressDialog mBetterDialog;
    private Handler mMainHandler = new Handler() {
 @Override
 public void handleMessage(Message msg) {
     switch (msg.what) {
     case DISMISS_DIALOG:
  Dialog dialog = (Dialog) msg.obj;
  dialog.dismiss();
  break;
     default:
  break;
     }
 }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.dialog_demo);

 final Button sucking = (Button) findViewById(R.id.sucking);
 sucking.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
  final Activity activity = DialogDemo.this;
  final ProgressDialog dialog = new ProgressDialog(activity);
  dialog.setTitle("Worst dialogging");
  dialog.setMessage("This is the worst dialogging scheme, NEVER use it. This dialog is easy to " +
   "run out of its attached activity, yielding WindowManager#BadTokenException if the activity is gone when dismissing");
  dialog.setIndeterminate(true);
  dialog.setCancelable(true);
  // You MUST do the show in main thread anyway
  dialog.show();
  new Thread(new Runnable() {
      public void run() {
   SystemClock.sleep(10000);
   /*
    * IllegalArgumentException: View not attached to window manager
    * If the activity showing the dialog was killed before dismiss() out of rotation or locale changed,
    * the dialog will gone with activity, but when dismiss() yields "IllegalArgumentException: View not attached to
    * window manager".
    * Checking isShowing() won't help.
    * Checking activity.isFinishing() won't help, either.
    * Dismiss it in main thread also won't give any help.
    */
   // THIS WON't WORK
//   if (dialog.isShowing()) {
//       dialog.dismiss();
//   }
//   if (!activity.isFinishing()) {
//       dialog.dismiss();
//   }
   Message msg = Message.obtain();
   msg.what = DISMISS_DIALOG;
   msg.obj = dialog;
   mMainHandler.sendMessage(msg);
      }
  }).start();
     }
 });

 final Button better = (Button) findViewById(R.id.better);
 better.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
  mBetterDialog = new ProgressDialog(DialogDemo.this);
  mBetterDialog.setTitle("Better dialogging");
  mBetterDialog.setMessage("This dialogging can be used. The dialog object is a field of its activity, so activity can" +
    " control it to make sure dialog only lives within activity lifecircle");
  mBetterDialog.setIndeterminate(true);
  mBetterDialog.setCancelable(true);
  // You MUST do the show in main thread anyway
  mBetterDialog.show();
  new Thread(new Runnable() {
      public void run() {
   SystemClock.sleep(10000);
   /*
    * This is much better, mBetterDialog is a field of its activity, so activity can take care of it in order
    * to make sure dialog only live within activity's life circle, to avoid any unexpected exceptions.
    */
   // THIS really works
       if (mBetterDialog != null && mBetterDialog.isShowing()) {
           mBetterDialog.dismiss();
       }
      }
  }).start();
     }
 });

 final Button optional = (Button) findViewById(R.id.optional);
 optional.setOnClickListener(new View.OnClickListener() {
     @SuppressWarnings("deprecation")
     public void onClick(View v) {
  showDialog(0);
  new Thread(new Runnable() {
      public void run() {
   SystemClock.sleep(10000);
   /*
    * This way works best for most of time, except if activity died before dismissing, exception must be
    * thrown: "IllegalArgumentException: View not attached to window manager".
    * Although activity takes care of its belonging dialog, there is no way to operate it manually any more.
    * First you do not have reference to dialog object and second, any manual operation only interferences
    * and breaks state maintained by frameworks.
    */
   dismissDialog(0);
      }
  }).start();
     }
 });
    }
    @Override
    protected Dialog onCreateDialog(int id) {
 ProgressDialog d = new ProgressDialog(this);
 d.setTitle("Optional dialogging");
 d.setMessage("This dialogging scheme works best for most times, the dialogs are all taken care of by activitys and frameworks" +
   ". Except for activity being killed during dialog showing");
 d.setIndeterminate(true);
 d.setCancelable(true);
 return d;
    }
    @Override
    protected void onDestroy() {
 super.onDestroy();
 // Activity is dying, all its belonging dialogs should be dismissed, of course.
 if (mBetterDialog != null && mBetterDialog.isShowing()) {
     mBetterDialog.dismiss();
     mBetterDialog = null;
 }
 // For dialogs showed via showDialog(int), no way to stop it in onDestroy()
// dismissDialog(0); // cause "IllegalArgumentException: no dialog with id 0 was ever shown via Activity#showDialog"
       // This is because Activity has to manage its dialog during onPause() and onResume() to restore
                   // dialogs' state. So if you manually dismiss it in onDestroy(), it will cause JE.

// removeDialog(0);// cause "IllegalArgumentException: no dialog with id 0 was ever shown via Activity#showDialog", when
   // dismissing in thread.
               // This is because Activity has to manage its dialog during onPause() and onResume() to restore
                     // dialogs' state. So if you manually dismiss it in onDestroy(), it will cause JE.
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
蜜月aⅴ免费一区二区三区| 最近2019中文字幕一页二页| 中文字幕精品久久久久| 日韩国产高清视频在线| 97视频com| 久久精品久久久久| 欧美性在线观看| 久久精品国产亚洲7777| 38少妇精品导航| 欧美日韩中国免费专区在线看| 国产成人av在线播放| 午夜精品一区二区三区在线视| 大胆欧美人体视频| 亚洲欧美在线第一页| 国模叶桐国产精品一区| 狠狠躁18三区二区一区| 精品一区二区三区四区在线| 性欧美暴力猛交69hd| 亚洲全黄一级网站| 日韩国产精品亚洲а∨天堂免| 国产精品69久久| 亚洲天堂av综合网| 亚洲人成亚洲人成在线观看| 中文字幕av一区| 国产精品国语对白| 成人激情综合网| 日韩美女主播视频| 欧美成人免费播放| 亚洲欧洲av一区二区| 日韩av综合网| 久久综合久久88| 亚洲影院在线看| 亚洲综合一区二区不卡| 国产精品福利在线| 午夜精品在线视频| 欧美最猛性xxxxx(亚洲精品)| 九九精品在线观看| 国产精品av在线播放| 精品在线观看国产| 亚洲精品av在线| 欧美性少妇18aaaa视频| 国产精品一区二区av影院萌芽| 2019精品视频| 国产精品人成电影| 在线成人中文字幕| 欧美中文字幕在线观看| 日本aⅴ大伊香蕉精品视频| 国产丝袜一区视频在线观看| 91视频-88av| 日韩中文字幕视频在线| 国产一区二区三区在线视频| 性色av香蕉一区二区| 亚洲性视频网站| 一本色道久久综合狠狠躁篇怎么玩| 2018中文字幕一区二区三区| 欧美国产精品人人做人人爱| 97不卡在线视频| 日韩av成人在线| 国产亚洲欧洲黄色| 欧美亚洲国产视频| 日韩在线观看免费高清完整版| 欧美精品18videosex性欧美| 亚洲精品中文字幕有码专区| 亚洲国产美女精品久久久久∴| 中文字幕欧美精品在线| 亚洲a在线观看| 精品视频在线播放色网色视频| 欧美另类精品xxxx孕妇| 在线观看中文字幕亚洲| 插插插亚洲综合网| 日韩精品极品视频免费观看| 国产精品视频在线播放| 91精品久久久久久久久中文字幕| 久久精品青青大伊人av| 日韩欧美中文字幕在线观看| 亚洲自拍欧美另类| 中文字幕欧美国内| 亚洲综合成人婷婷小说| 国产一区二区黑人欧美xxxx| 日韩久久精品电影| 热99精品里视频精品| 日韩av电影手机在线观看| 亚洲一区第一页| 国产亚洲精品久久久久久| 国产精品综合网站| 国产精品高潮呻吟视频| 久久久久久91| 91国偷自产一区二区三区的观看方式| 668精品在线视频| 日韩视频精品在线| 国产在线播放不卡| 色黄久久久久久| 97视频在线免费观看| 精品一区二区三区三区| 超碰精品一区二区三区乱码| 日韩亚洲欧美中文在线| 亚洲一区二区国产| 成人av在线天堂| 日韩欧美成人精品| 国产91av在线| 成人两性免费视频| 中文字幕视频一区二区在线有码| 日韩免费高清在线观看| 亚洲女人天堂成人av在线| 亚洲一区中文字幕在线观看| 伊是香蕉大人久久| 日韩的一区二区| 一本色道久久综合狠狠躁篇的优点| 精品中文字幕在线2019| 久久91亚洲精品中文字幕奶水| 日韩欧美在线看| 欧美成人午夜免费视在线看片| 日韩在线欧美在线| 日韩在线视频国产| 欧美巨大黑人极品精男| 欧美成人第一页| 久久久精品2019中文字幕神马| 欧美午夜精品在线| 亚洲第一天堂av| 日韩视频免费看| 日韩色av导航| 亚洲高清久久久久久| 欧美激情精品久久久久久免费印度| 午夜美女久久久久爽久久| 国产精品亚洲激情| 海角国产乱辈乱精品视频| 精品中文字幕在线观看| 亚洲免费电影在线观看| 亚洲а∨天堂久久精品9966| 欧美中文字幕视频| 久久久久久久久国产精品| 这里只有精品久久| 亚洲美女免费精品视频在线观看| 亚洲人成电影网站色| 国产98色在线| 2020欧美日韩在线视频| 国产欧美日韩高清| 久久精品电影网| 欧美日韩国产在线| 国产精品网站视频| 91精品国产777在线观看| 日韩美女写真福利在线观看| 亚洲第一在线视频| 国内精品免费午夜毛片| 亚洲国内高清视频| 久久成人人人人精品欧| 欧美性猛交xxxx黑人| 91香蕉嫩草影院入口| 日韩欧美在线一区| 亚洲男人的天堂在线播放| 国产精品一区二区av影院萌芽| 日韩精品极品在线观看| 国产精品久久久久久久久久免费| 欧美一区二区三区精品电影| 日韩欧美国产免费播放| 国产精品激情av在线播放| 性欧美xxxx| 国产日韩欧美视频在线| 欧美日韩综合视频网址| 亚洲已满18点击进入在线看片| 午夜精品一区二区三区在线播放| 中文在线资源观看视频网站免费不卡| 亚洲人成电影网| 国产一区二区美女视频|