博客
关于我
Android:WebView内输入框被键盘遮挡解决方案
阅读量:505 次
发布时间:2019-03-07

本文共 4368 字,大约阅读时间需要 14 分钟。

Android 键盘适配优化与横竖屏切换问题解决方案

在开发Android应用时,键盘适配是一个常见的挑战,尤其是在横竖屏切换时可能会出现键盘显示异常的问题。本文将详细介绍一个针对键盘适配的优化方案,并探讨如何解决横竖屏切换后键盘无法正常弹出的问题。

键盘适配逻辑

本优化方案通过观察根视图(rootView)的显示状态,动态调整键盘布局,确保在不同屏幕方向和软键盘状态下应用程序能够正常显示。以下是主要实现步骤:

  • 初始化根视图状态:获取活动的根视图,并记录其初始显示高度和宽度。
  • 状态栏高度获取:通过资源ID获取状态栏的高度,用于后续布局计算。
  • 布局监听:使用ViewTreeObserver监听视图树的全局布局变化,动态更新根视图的显示状态。
  • 软键盘状态处理:根据根视图显示高度调整布局参数,确保键盘在不同状态下正确显示。
  • 横竖屏切换后键盘无法弹出的问题

    在某些情况下,特别是在横竖屏切换时,键盘可能无法正常弹出。经初步调查,这一问题可能与WebView的焦点丢失有关。以下是针对该问题的解决思路:

  • 焦点管理:在横竖屏切换时,确保WebView保留焦点,避免因焦点丢失导致键盘无法弹出。

  • 布局刷新:当屏幕方向发生变化时,动态刷新WebView的布局,确保键盘显示区域正确。

  • 软键盘状态调整:根据屏幕方向调整软键盘的显示状态,确保键盘在切换方向后能够正确弹出。

  • 代码实现

    以下是实现上述逻辑的关键代码片段:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    KeyBoardWorkaround keyBoardWorkaround = new KeyBoardWorkaround();
    keyBoardWorkaround.solve(this);
    }
    public class KeyBoardWorkaround {
    private static final String TAG = "KeyBoardWorkaround";
    private View rootView;
    private int rootViewVisibleHeight;
    private boolean hasInit = false;
    private int initHeight;
    private int initWidth;
    private FrameLayout.LayoutParams frameLayoutParams;
    private int statusBarHeight;
    public void solve(Activity activity) {
    // 获取根视图
    rootView = activity.getWindow().getDecorView();
    // 获取状态栏高度
    int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
    statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
    FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
    final View mChildOfContent = content.getChildAt(0);
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
    // 添加全局布局监听
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
    Rect rect = new Rect();
    rootView.getWindowVisibleDisplayFrame(rect);
    int visibleHeight = rect.height();
    Log.e(TAG, "visibleHeight = " + visibleHeight);
    Log.e(TAG, "visibleWidth = " + rect.width());
    if (!hasInit) {
    initHeight = rect.height();
    initWidth = rect.width();
    hasInit = !hasInit;
    }
    if (rootViewVisibleHeight == 0) {
    rootViewVisibleHeight = visibleHeight;
    return;
    }
    if (rootViewVisibleHeight == visibleHeight) {
    return;
    }
    if (visibleHeight == initWidth) {
    rootViewVisibleHeight = visibleHeight;
    frameLayoutParams.height = initWidth;
    frameLayoutParams.width = initHeight;
    mChildOfContent.requestLayout();
    hasRotate = true;
    return;
    }
    if (hasRotate) {
    rootViewVisibleHeight = visibleHeight;
    frameLayoutParams.height = initHeight;
    frameLayoutParams.width = initWidth;
    hasRotate = false;
    return;
    }
    if (rootViewVisibleHeight - visibleHeight > 200) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    frameLayoutParams.height = visibleHeight + statusBarHeight;
    } else {
    frameLayoutParams.height = visibleHeight;
    }
    mChildOfContent.requestLayout();
    rootViewVisibleHeight = visibleHeight;
    return;
    }
    if (visibleHeight - rootViewVisibleHeight > 200) {
    frameLayoutParams.height = initHeight;
    mChildOfContent.requestLayout();
    rootViewVisibleHeight = visibleHeight;
    return;
    }
    }
    });
    }
    }

    注意事项

  • 焦点管理:确保在横竖屏切换时,WebView保留焦点,可以避免因焦点丢失导致键盘无法弹出。

  • 状态栏高度获取:通过资源ID获取状态栏高度,确保在不同机型上都能正确获取。

  • 布局刷新:在屏幕方向切换时,动态刷新布局,确保键盘显示区域正确。

  • 软键盘状态调整:根据屏幕方向调整软键盘显示状态,确保键盘能够正确弹出。

  • 通过以上优化方案,可以有效解决键盘适配问题,确保应用程序在横竖屏切换时键盘能够正常弹出。

    转载地址:http://aefjz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现视频流转换为图片(附完整源码)
    查看>>
    Objective-C实现视频除雾算法(附完整源码)
    查看>>
    Objective-C实现角谷猜想(附完整源码)
    查看>>
    Objective-C实现解密 Atbash 密码算法(附完整源码)
    查看>>
    Objective-C实现解密藏头诗(附完整源码)
    查看>>
    Objective-C实现解析数学表达式解析(附完整源码)
    查看>>
    Objective-C实现解释器模式(附完整源码)
    查看>>
    Objective-C实现计算各种形状的面积算法(附完整源码)
    查看>>
    Objective-C实现计算排列和组合的数量算法 (附完整源码)
    查看>>
    Objective-C实现计算相似度算法(附完整源码)
    查看>>
    Objective-C实现读写蓝牙串口(附完整源码)
    查看>>
    Objective-C实现辗转相除法(附完整源码)
    查看>>
    Objective-C实现遗传算法(附完整源码)
    查看>>
    Objective-C实现醉汉随机行走问题(附完整源码)
    查看>>
    Objective-C实现醉汉随机行走问题(附完整源码)
    查看>>
    Objective-C实现重载[ ](附完整源码)
    查看>>
    Objective-C实现重载()(附完整源码)
    查看>>
    Objective-C实现链表(附完整源码)
    查看>>
    Objective-C实现链表交换节点算法(附完整源码)
    查看>>
    Objective-C实现长短期记忆人工神经网络LSTM(附完整源码)
    查看>>