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