首先是setFocusable这个方法,获取焦点;如果不获取焦点,那么popwindow中的控件都没有办法获取焦点和事件响应问题。
如果获取焦点,那么popwindow就会拦截屏幕上的点击触摸事件以及物理键等。那么只有当popwindow消失,那么popwindow下面的页面才会响应事件。
当然也可以做到popwindow获取事件响应也可以让popwindow以外的区域也可以获取,那就是设置setBackgroundDrawable(new BitmapDrawable())。但是这样会造就只要触摸到popwindow以外区域popwindow就会消失。说白了setBackgroundDrawable(new BitmapDrawable())其实似的popwindow消失而是其他页面获取焦点。
设置了setBackgroundDrawable(new BitmapDrawable()),那么强制性的(当焦点在popwindow以外)消失popwindow,那么
this.setOutsideTouchable(false);就会无效,那么popwindow,你想让其在触摸popwindow以外区域不消失,都失效。
总之:setBackgroundDrawable(new BitmapDrawable()) 这个方法会强制性的将popwindow在 事件在popwindow区域以外的时候消失。但是有的时候,setFocusable 无效。如响应物理返回键,所以有的时候必须添加setBackgroundDrawable(new BitmapDrawable()) 来响应物理返回键。
那么setFocusable 让popwindow获取焦点,如何自己处理物理返回键呢?
只能从软键盘的弹出隐藏做监听:
public class SoftInputListener { private static boolean sLastVisiable = true; private SoftInputListenerCallback back; public SoftInputListener(Activity activity , SoftInputListenerCallback callback) { back = callback; addOnSoftKeyBoardVisibleListener(activity); } /**监听软键盘状态 * @param activity * @param */ public void addOnSoftKeyBoardVisibleListener(Activity activity) { final View decorView = activity.getWindow().getDecorView(); decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); decorView.getWindowVisibleDisplayFrame(rect); int displayHight = rect.bottom - rect.top; int hight = decorView.getHeight(); boolean visible = (double) displayHight / hight < 0.8; if(visible != sLastVisiable){ back.onSoftKeyBoardVisible(visible); } sLastVisiable = visible; } }); } public interface SoftInputListenerCallback { abstract void onSoftKeyBoardVisible(boolean visible); }在activity中调用:
new SoftInputListener(this, new SoftInputListener.SoftInputListenerCallback(){ @Override public void onSoftKeyBoardVisible(boolean visible) { if(!visible) { if(CommentCons.mInputPopdw != null && CommentCons.mInputPopdw.isShowing()) { CommentCons.mInputPopdw.dismiss(); } } } });
通过手动关闭软键盘:
public void closeSoftInput() { Activity activity = (Activity) mContext; if(activity.getWindow().getAttributes().softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) { InputMethodManager inputMethodManager=(InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow( mEditInput.getWindowToken(),0); } }manifest文件 必须添加:
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" > stateAlwaysHidden不可缺少