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 PinYinIME横屏模式禁止全屏输入 & 调整横屏模式下键盘高度

一、实现android横屏模式下,禁止原生输入法PinYinIME全屏输入模式。 使用PinYinIME时,往往会遇到以下情景,文本框设定了不显示抽取框的参数(可理解为不允许输入法全屏);而输入法经...
  • mazhidong
  • mazhidong
  • 2017年09月08日 14:42
  • 283

Android在全屏状态下键盘覆盖输入框问题

Android中有个Bug,在设置getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.Layo...
  • bdemq
  • bdemq
  • 2015年06月27日 18:50
  • 1180

android 全屏模式下软键盘弹出问题

在没有使用全屏模式时,处理软键盘弹出网上有很多例子,通常在 manifest 文件对应的 activity 里加上两行代码:             android:name="com.unio...
  • longner
  • longner
  • 2017年05月20日 15:26
  • 1206

Android 横屏时禁止输入法全屏

一是在源码里进行修改。frameworks/base/core/java/Android/inputmethodservice/InputMethodService.java            ...
  • yangxi_001
  • yangxi_001
  • 2017年04月17日 11:09
  • 1519

android软键盘问题解决方案(软键盘占据全屏,软键盘排挤页面布局)

1.在使用EditText进行文本输入时,若不进行特殊的设置,使用Android自带的软键盘,该软键盘会占用整个界面,那么,如何让键盘只占用屏幕的一部分呢?  答:android:imeOption...
  • jiguangcanhen
  • jiguangcanhen
  • 2014年09月03日 15:28
  • 1613

全屏状态下的输入法布局问题

公司最新的launcher,为了达到更美观的效果,要求实现全屏,Android对全屏机制的支持相对来说比较弱,在不改变framework机制调整的情况下有很多莫名其妙的问题,调起来很不顺利,最麻烦的莫...
  • hjj0212
  • hjj0212
  • 2014年02月11日 11:04
  • 1923

android dialog 显示时弹出输入法

LayoutInflater inflater = LayoutInflater .from(CashCaptureActivity.this); Li...
  • GameLife_lch
  • GameLife_lch
  • 2017年06月12日 11:34
  • 236

android 沉浸式状态栏 软键盘挡住输入框问题

http://blog.csdn.net/brian512/article/details/52096445 http://www.jianshu.com/p/a95a1b84da11
  • asd2603934
  • asd2603934
  • 2017年05月23日 10:38
  • 571

Android 聊天列表 软键盘遮挡住输入框所在容器的问题

很多朋友说在androidManifest.xml中的activity中设置 android:windowSoftInputMode="adjustUnspecified|stateHidden" ...
  • frj463806056
  • frj463806056
  • 2015年01月12日 13:12
  • 1526

对Android 软键盘向下的监听

因为业务需要,有时候我们好监听软键盘向下的动作,当我们按下向下的按钮时,可以进行监听,从而执行相应的动作。...
  • yxhuang2008
  • yxhuang2008
  • 2016年12月23日 23:44
  • 6347
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android全屏下输入法软键盘遇到的问题
举报原因:
原因补充:

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