Android 当键盘出现时,Facebook应用程序如何处理布局变化?

Android 当键盘出现时,Facebook应用程序如何处理布局变化?,android,android-softkeyboard,Android,Android Softkeyboard,Facebook应用程序在登录屏幕上惊人地处理用户界面的变化。看看吧 无键盘 带键盘(注意如何需要帮助?英语更改视图消失) 是的,我确实知道adjustPan和adjustResize设置,但Facebook如何准确地设置当键盘存在时哪些视图将可见?当软键盘可见时,它们似乎正在显示/隐藏特定文本(如上面示例中的“需要帮助”或英语) edittext.post(new Runnable() { public void run() { edittext.r

Facebook应用程序在登录屏幕上惊人地处理用户界面的变化。看看吧

无键盘

带键盘(注意如何需要帮助?英语更改视图消失)


是的,我确实知道adjustPan和adjustResize设置,但Facebook如何准确地设置当键盘存在时哪些视图将可见?

当软键盘可见时,它们似乎正在显示/隐藏特定文本(如上面示例中的“需要帮助”或英语)

edittext.post(new Runnable() {
        public void run() {
            edittext.requestFocusFromTouch();
            InputMethodManager lManager = (InputMethodManager) activity
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            lManager.showSoftInput(edittext, 0);
        }
    });

为什么?

下面是Android框架工程师的答案

显示的IME没有什么意义,因为IME 行为取决于它——它可能是一个透明的覆盖,而不是影响 应用程序、小条带或所有其他类型的东西

因此,与IME交互的主要方式是设置 softInputMode可调整大小,以便在IME要求时 遮住屏幕的一部分,你的应用程序的UI将被调整大小以适应这种情况 如有需要,请考虑

但是,有不同的方式/方法/解决方法,通过使用这些应用程序(如Facebook)可以潜在地检测软键盘是否可见,并且根据结果,应用程序可以在其UI中显示/隐藏文本/小部件

方法1:

InputMethodManager imm = (InputMethodManager) getActivity()
            .getSystemService(Context.INPUT_METHOD_SERVICE);

    if (imm.isAcceptingText()) {
        //soft keyboard is shown, so hide "need help" text, for example
    } else {
        //Software Keyboard was not shown;
    }
方法2:

final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
        new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int heightView = activityRootView.getHeight();
                int widthView = activityRootView.getWidth();
                if (1.0 * widthView / heightView > 3) {
                    //Make changes for Keyboard not visible
                } else {
                    //Make changes for keyboard visible
                }
            }
        });
现在,上述两种方法并不一定在所有情况下都能100%工作(正如SDK之外的不受支持的操作所期望的那样)


Facebook可能正在使用上述任何一种方法,谁知道呢,他们可能以不同的方式实现了它

这可能是一个解决方案,但当用户按下后退按钮,键盘消失时,会发生什么呢?EditText仍然有焦点,键盘不再存在。您可以随时覆盖按下的
并再次显示项目,也可以使EditText失去焦点。谢谢您的回答,但这与我的问题无关。
final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
        new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int heightView = activityRootView.getHeight();
                int widthView = activityRootView.getWidth();
                if (1.0 * widthView / heightView > 3) {
                    //Make changes for Keyboard not visible
                } else {
                    //Make changes for keyboard visible
                }
            }
        });