系统级别的window,应用级别的弹出框Dialog/popwindow (dismiss和cancel和hide)

 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

你可能感兴趣的:(系统级别的window,应用级别的弹出框Dialog/popwindow (dismiss和cancel和hide))