popwindow 焦点问题,物理返回键截获,软键盘监听问题

来源:互联网 发布:windows安全模式进不了 编辑:程序博客网 时间:2024/05/21 12:44

首先是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不可缺少

                                              

0 0
原创粉丝点击