我正面临开发Android应用程序的奇怪场景。 我需要在软键盘打开/关闭时通知我的应用程序的某些组件,并为他们提供键盘高度,以便他们做出相应的反应。 我试过跟随;
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
}
});
但它在4.2.2上工作不正常对我来说似乎不合逻辑,因为需要指定布局属性中的离散差异来感知键盘事件。我上网了很多但找不到真正有用的东西。在这方面的任何帮助将受到高度赞赏。
谢谢, 阿马尔
答案 0 :(得分:0)
很长一段时间后才看到这个问题,但我应该添加我的方法,以便它可能对其他人有所帮助。
首先,我在我的UI中添加了一个不可见的Layout
'invisible_layout',以便跟踪大小更新。然后在此OnGlobalLayoutListener
上添加Layout
以侦听布局更新。调整大小时,Layout
的全高和更新用于抢占键盘外观。
int prevViewHeight = 0;
public void keyboardObserver() {
final View containerView = findViewById(R.id.invisible_layout);
containerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if(prevViewHeight != containerView.getHeight()){
prevViewHeight = containerView.getHeight();
int heightDiff = containerView.getRootView().getHeight() - containerView.getHeight();
// heightDiff is the height of the keyboard
if (heightDiff > heightComparator() ) { // if more than 100 dp, its probably a keyboard...
if ( heightDiff > heightComparator() ) {
// do what is required on keyboard show
} else {
// do what is required on keyboard hide
}
}
}
});
}
public int heightComparator() {
Display mDisplay = getWindowManager().getDefaultDisplay();
int height = 0;
if(Build.VERSION.SDK_INT < 13){
height = mDisplay.getHeight();
} else
{
Point size = new Point();
mDisplay.getSize(size);
height = size.y;
}
return height / 3; // I'm assuming that if the resized height is greate than 1/3 of the screen height, then keyboard is displayed
}
欢迎提出优化建议。