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

首先是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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值