Новый ответ Рубена Скрэттона (вычисление высоты int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
) не будет работать в действии, если вы установите режим полупрозрачной строки состояния.
если вы используете полупрозрачную строку состояния, activityRootView.getHeight()
никогда не изменит погоду, если видна программная клавиатура. он всегда будет возвращать высоту активности и статусную строку.
Например, Nexus 4, Android 5.0.1, установите android:windowTranslucentStatus
в true, он вернет 1184 навсегда, даже если у меня есть opend. Если вы установите для android:windowTranslucentStatus
значение false, он вернёт высоту правильно, если ime невидим, он вернёт 1134 (не включая строку состояния).
Я не знаю, погода это ошибка, я пробовал на 4.4.4 и 5.0.1, результат тот же.
Итак, до сих пор, второй наиболее согласованный ответ, решение Качи будет наиболее безопасным способом расчета высоты. Вот копия:
final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
... do something here
}
}
});