Android全屏下输入法软键盘遇到的问题

原创 2016年05月31日 10:38:25

Android全屏下输入法软键盘遇到的问题

最近在项目中遇到了在全屏模式下输入法遮挡EditText的问题. 到目前只是暂时解决, 还没有完美解决.

看了很多博主的文章, 提到过很到方法大部分方法无效.
大部分的文章讲述的方法都是在非全屏下的可用的,但是到了全屏模式下就无效了.

从各位大神的博文中可以得到如下结论.

在全屏模式下onSizeChanged()方法不会被调用.
设置windowInputSoftMethod=”adjustResize”无效.
用ScrollView包裹需滚动的内容也无效.

2016/06/03补充:
经过我阅读很多文章发现: 全屏下输入法弹出布局不调整导致的遮盖问题, 这是android系统本来就有的问题 . 如果不设置为全屏, 或者在content区域使用android:fitsSystemWindows=”true”让内容区不扩展到状态栏, 这样使用adjustResize可以让输入法不遮挡控件, 当然, 前提是你的布局可以滚动. 这样的话, 你要透明化状态栏,将状态栏设置成和你内容区一样的颜色, 让它看起来像是全屏.

目前看到国内写得最好的文章
1. http://blog.csdn.net/a2758963/article/details/25163171
2. http://blog.csdn.net/a2758963/article/details/25280507
3. http://blog.csdn.net/mynameishuangshuai/article/details/51567357#t9

最后使用的也是第2篇文章中提到的AndroidBug5497Workaround开源代码的修改版. 但是效果不是很让人满意.

代码来自StackOverFlow的一个visionix的回答:

I implemented Joseph Johnson solution and it worked well, I noticed after using this solution sometimes the drawer on the application will not close properly. I added a functionality to remove the listener removeOnGlobalLayoutListener when the user closes the fragment where are edittexts located.

//when the application uses full screen theme and the keyboard is shown the content not scrollable! 
//with this util it will be scrollable once again
//http://stackoverflow.com/questions/7417123/android-how-to-adjust-layout-in-full-screen-mode-when-softkeyboard-is-visible
public class AndroidBug5497Workaround {


    private static AndroidBug5497Workaround mInstance = null;
    private View mChildOfContent;
    private int usableHeightPrevious;
    private FrameLayout.LayoutParams frameLayoutParams;
    private ViewTreeObserver.OnGlobalLayoutListener _globalListener;

    // For more information, see https://code.google.com/p/android/issues/detail?id=5497
    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

    public static AndroidBug5497Workaround getInstance (Activity activity) {
        if(mInstance==null)
        {
            synchronized (AndroidBug5497Workaround.class)
            {
                mInstance = new AndroidBug5497Workaround(activity);
            }
        }
        return mInstance;
    }

    private AndroidBug5497Workaround(Activity activity) {
        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
        mChildOfContent = content.getChildAt(0);
        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();

        _globalListener = new ViewTreeObserver.OnGlobalLayoutListener()
        {

            @Override
            public void onGlobalLayout()
            {
                 possiblyResizeChildOfContent();
            }
        };
    }

    public void setListener()
    {
         mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(_globalListener);
    }

    public void removeListener()
    {
         mChildOfContent.getViewTreeObserver().removeOnGlobalLayoutListener(_globalListener);
    }

    private void possiblyResizeChildOfContent() {
        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious) {
            int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
            int heightDifference = usableHeightSansKeyboard - usableHeightNow;
            if (heightDifference > (usableHeightSansKeyboard/4)) {
                // keyboard probably just became visible
                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
            } else {
                // keyboard probably just became hidden
                frameLayoutParams.height = usableHeightSansKeyboard;
            }
            mChildOfContent.requestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }

    private int computeUsableHeight() {
        Rect r = new Rect();
        mChildOfContent.getWindowVisibleDisplayFrame(r);
        return (r.bottom - r.top);
    } 
}
  • uses the class where is my edittexts located
@Override
public void onStart()
{
    super.onStart();
    AndroidBug5497Workaround.getInstance(getActivity()).setListener();
}

@Override
public void onStop()
{
    super.onStop();
    AndroidBug5497Workaround.getInstance(getActivity()).removeListener();
}

参考资料:
AndroidBug5497Workaround开源代码的github地址

Android How to adjust layout in Full Screen Mode when softkeyboard is visible

How do I Detect if Software Keyboard is Visible on Android Device?

Hiding Title in a Fullscreen mode?

版权声明:copyleft, 欢迎转载.

相关文章推荐

Android之解决输入法软键盘弹出挤压屏幕或覆盖控件问题

最近在最Android开发过程中,出现一个问题:一个界面上有文字输入框,当进行输入时,输入法软键盘会弹出挤压屏幕界面或者覆盖控件。 解决办法是:使用Window的setSoftInputMode()...
  • wei_zhi
  • wei_zhi
  • 2015年12月05日 09:24
  • 2610

解决android 软键盘在全屏下设置adjustResize无效的问题

全屏模式下,即使将activity的windowSoftInputMode的属性设置为:adjustResize,在键盘显示时它未将Activity的Screen向上推动,所以你Activity的vi...

android 软键盘在全屏下设置adjustResize无效的问题

全屏模式下,即使将activity的windowSoftInputMode的属性设置为:adjustResize,在键盘显示时它未将Activity的Screen向上推动,所以你Activity的vi...

android 软键盘在全屏下的布局计算问题

在非全屏模式下,将activity的windowSoftInputMode的属性设置为:adjustResize。同时在View的onSizeChanged(int w, int h, int old...

解决输入法软键盘上顶RadioGroup实现的底部菜单栏问题

问题如下本来应该是这样的: 结果由于在页面中增加了EditText输入框,当打开输入法的软键盘的时候,是下面这样 纠结一下,这个该如何是好:解决办法方法一:在这个AndroidManifest.x...
  • bcbbcc
  • bcbbcc
  • 2016年09月20日 23:54
  • 731

关于安卓app开发中与EditText相关的输入法(软键盘)隐藏问题的解决方案

1.创建安卓项目之后,编写需要用到EditText的布局文件,如下:     xmlns:tools="http://schemas.android.com/tools"     android:i...

android:windowSoftInputMode 属性(输入法软键盘的那点事)

原文见:点击打开链接 原文说的已经很清楚,但是通过自己动手实践才更加形象。以此在原文的基础上加了一些自己实践过的备注,方便以后再次使用。 一、windowSoftInputMode 是什么? an...
  • wkw1125
  • wkw1125
  • 2015年09月13日 11:52
  • 1702

Android点击空白区域,隐藏输入法软键盘

欢迎使用Markdown编辑器写博客很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步对软键盘进行隐藏。为了更好的体验,我们可以实现当用户使用完...

Android输入法与自定义软键盘初探

电视机顶盒项目需要用到键盘输入,众所周知,电视的遥控按键较少,无法满足输入的需求,如要输入英文、数字、符合组合的字母时。遥控器的按键就无法满足。基于以上需求,在网上查找了许多资料,和Google ap...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android全屏下输入法软键盘遇到的问题
举报原因:
原因补充:

(最多只允许输入30个字)