2020-10-27

项目场景:根据软键盘弹出的高度,来控制吐司提示显示的位置

 

问题描述:根据软键盘弹出的高度,来控制吐司提示显示的位置。如果软键盘高度太高,顶部没有显示空间,吐司显示在中间,顶部没有显示空间,则显示在顶部


设计思路:

            1,首先获取软键盘的高度和屏幕的高度,计算出软键盘顶部到手机屏幕顶部距离y,

             2,如果距离y大于吐司提示的高度,吐司提示则显示到顶部,

                               如果小于吐司提示的高度,则显示到中间。

提示:这里填写问题的分析:
例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()和 Handler.sendMessage(),其中 obtainMessage 方式当数据量过大时,由于 MessageQuene 大小也有限,所以当 message 处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。


解决方案:

第一步:添加获取软键盘弹起监听,来获取软件盘高度;

final View myLayout = getWindow().getDecorView();
parentLayout.getViewTreeObserver(). addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
    
    @Override  
    public void onGlobalLayout() {  
        Rect r = new Rect();  
        // r will be populated with the coordinates of your view that area still visible.
        parentLayout.getWindowVisibleDisplayFrame(r);  
        int screenHeight = myLayout.getRootView().getHeight();  
        int heightDiff = screenHeight - (r.bottom - r.top); 
        if (heightDiff > 100) 
            // if more than 100 pixels, its probably a keyboard
            // get status bar height
            int statusBarHeight = 0;  
            try {
                Class<?> c = Class.forName("com.android.internal.R$dimen");
                Object obj = c.newInstance();
                Field field = c.getField("status_bar_height");
                int x = Integer.parseInt(field.get(obj).toString());
                statusBarHeight = context.getResources().getDimensionPixelSize(x);
            } catch (Exception e) {
                e.printStackTrace();
            }
            int realKeyboardHeight = heightDiff - statusBarHeight;
            Log.i("keyboard height = " + realKeyboardHeight);  
        }
    }  
});

第二步:计算出软键盘顶部到手机屏幕顶部距离y,并比较距离y与吐司提示的高度的大小。

如果距离y大于吐司提示的高度,吐司提示则显示到顶部,

如果小于吐司提示的高度,则显示到中间。

第三步:封装吐司提示的方法,可以通过传参动态改变提示位置。

mToast.setGravity(Gravity.CENTER, 0, 0);
mToast.show();

 

 

 

提示:这里填写该问题的具体解决方案:
例如:新建一个 Message 对象,并将读取到的数据存入 Message,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();换成 mHandler.sendMessage()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值