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