系統級別的window,應用級別的彈出框Dialog/popwindow (dismiss和cancel和hide)

desaco發表於2016-01-21

 AlertDialog不可以繼承AlertDialog,因為AlertDialog必須首先呼叫show(),然後才可以setContentView(),否則會有crash; 但是如果contentView中有EditText,則要求必須先呼叫setContentView(),然後才可以呼叫show(),否則輸入法無法彈出。

> 系統彈出框window
許可權:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
private void openWindow(){
        //獲取WindowManager例項
        final WindowManager windowManager= (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        //獲取視窗布局引數例項
        WindowManager.LayoutParams params=new WindowManager.LayoutParams();
        //設定視窗布局引數屬性
        params.width= WindowManager.LayoutParams.MATCH_PARENT;
        params.height=WindowManager.LayoutParams.MATCH_PARENT;

        //設定window的顯示特性
params.flags=WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
        //設定視窗半透明
        params.format= PixelFormat.TRANSLUCENT;
        //設定視窗型別
        params.type=WindowManager.LayoutParams.TYPE_PHONE;
        //獲取視窗布局例項
        final View windowView=View.inflate(this,R.layout.window,null);
        //獲取視窗布局中的按鈕例項
        btn_send= (Button) windowView.findViewById(R.id.btn_send);
        //設定點選事件
        btn_send.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                windowManager.removeView(windowView);
            }
        });
        //顯示視窗
        windowManager.addView(windowView,params);
    }

android系統級彈窗- https://blog.csdn.net/wujiewei2342/article/details/50704229
private void show() {

        //Looper.prepare();
        final WindowManager wm = (WindowManager) getApplicationContext().getSystemService("window");
        LayoutParams para = new LayoutParams();
        //設定彈窗的寬高
        para.height = LayoutParams.WRAP_CONTENT;
        para.width = LayoutParams.WRAP_CONTENT;
        //期望的點陣圖格式。預設為不透明
        para.format = 1;
        //當FLAG_DIM_BEHIND設定後生效。該變數指示後面的視窗變暗的程度。
        //1.0表示完全不透明,0.0表示沒有變暗。
        para.dimAmount = 0.6f;
        para.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_DIM_BEHIND;
        //設定為系統提示      
        para.type = LayoutParams.TYPE_SYSTEM_ALERT;
        //獲取要顯示的View
        final View mView = LayoutInflater.from(getApplicationContext()).inflate(
                R.layout.activity_next, null);
        //單擊View是關閉彈窗
        mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wm.removeView(mView);
            }
        });
        //顯示彈窗
        wm.addView(mView, para);

       //Looper.loop();
}
Android子執行緒真的不能更新UI麼- https://www.cnblogs.com/lao-liang/p/5108745.html
class NonUiThread extends Thread{
      @Override
      public void run() {
         Looper.prepare();
         TextView tx = new TextView(MainActivity.this);
         tx.setText("non-UiThread update textview");
         WindowManager windowManager = MainActivity.this.getWindowManager();
         WindowManager.LayoutParams params = new WindowManager.LayoutParams(
             200, 200, 200, 200, WindowManager.LayoutParams.FIRST_SUB_WINDOW,
                 WindowManager.LayoutParams.TYPE_TOAST,PixelFormat.OPAQUE);
         windowManager.addView(tx, params); 
         Looper.loop();
     }
 }

> 應用級別的Dialog,AlertDialog
使用Dialog實現全域性Loading載入框- http://blog.csdn.net/q4878802/article/details/50278283
Android:Dialog中隱藏鍵盤的注意事項- http://blog.csdn.net/bdmh/article/details/51143617

Dialog/AlertDialog的Context不能用全域性Application,只能用Activity的Context。

-- Android Dialog之dismiss和cancel和hide區別
 建議用dismiss,這個比cancel少一個判斷,一般來說是夠用了,當然如果你有CancelListener的話就用cancel;
 cancel:也呼叫了dismiss,只不過先判斷了mCancelMessage是否為空;
 @Override
    public void cancel() {
        if (!mCanceled && mCancelMessage != null) {
            mCanceled = true;
            Message.obtain(mCancelMessage).sendToTarget();
        }
        dismiss();
    }

 dismiss:大概就是刪除檢視,呼叫Onstop回撥,並把mShowing置為false。
 hide:隱藏起來又不銷燬

  dismiss方法會釋放對話方塊所佔的資源,而hide方法不會。activity退出前必須呼叫dismiss方法關閉對話方塊。
  如果對話方塊上有progressbar,你會發現,呼叫dismiss方法後,再呼叫show方法,出來的對話方塊,上面的progressbar不再會轉動,而呼叫hide方法的則沒有問題。
  所以,最正確的呼叫方法是,在activity的onDestory方法裡呼叫dismiss方法,其他地方都用hide方法隱藏對話方塊。

  dismiss可以在任何執行緒,並且銷燬了dialog物件,但是hide僅僅隱藏了對話方塊並沒有銷燬,如果打算用這方法來滅掉對話方塊就會出現問題,在Activity銷燬的時候就會出現崩潰日誌了,因為Activity銷燬時是需要把對話方塊都關閉掉的。原始碼可以看出,hide僅僅是將view.(gone)隱藏掉而已

> 應用級別的popwindow
android popwindow實現左側彈出選單層及PopupWindow- http://www.jb51.net/article/33533.htm
Android-自定義PopupWindow帶動畫的實現- http://blog.csdn.net/androidstarjack/article/details/48914139
關於PopupWindow的showAsDropDown()和showAtLocation()使用方式及其區別- http://blog.csdn.net/lnn368/article/details/51185732
PopUpWindow使用詳解(一)——基本使用- http://blog.csdn.net/harvic880925/article/details/49272285

相關文章