Есть ли способ в Android, чтобы получить высоту виртуальной клавиатуры, отображаемой на устройстве во время выполнения? На самом деле я хочу показать текстовое поле над клавиатурой.
Чтобы решить эту я написал keyboardHeightProvider, который может рассчитать высоту плавающего мягкая клавиатура. Активность может быть установлен в adjustNone или adjustPan в AndroidManifest.xml.
https://github.com/siebeprojects/samples-keyboardheight
Зибе
Я перепробовал много предложенных методов для этого, но никто, казалось, работали для СДЛ Андроид. Я думаю, что это либо потому, что дисплей СДЛ есть "Полный" как экран; или что он сидит в "и AbsoluteLayout" и поэтому высота от "Вид" и никогда не меняется. Этот метод работал для меня:
https://stackoverflow.com/questions/13534365/getting-the-dimensions-of-the-soft-keyboard
mRootWindow = getWindow();
mRootView = mRootWindow.getDecorView().findViewById(android.R.id.content);
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout(){
Rect r = new Rect();
View view = mRootWindow.getDecorView();
view.getWindowVisibleDisplayFrame(r);
// r.left, r.top, r.right, r.bottom
}
});
Да можно, с помощью Viewtree наблюдателя и глобального слушателя макет, попробуйте указанные ниже действия
теперь всякий раз, когда экранная клавиатура отображается андроид изменить размер вашего экрана, и вы получите звонок на ваш слушатель. Что'ы это единственное, что вам сейчас нужно сделать-это рассчитать разницу между высотой вашего корневого мнение после повторного размера и первоначального размера. Если разница составляет более 150 рассматривайте это как клавиатура была завышена.
Ниже приведен пример кода
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
public void onGlobalLayout(){
int heightDiff = root.getRootView().getHeight()- root.getHeight();
// IF height diff is more then 150, consider keyboard as visible.
}
});
С уважением, Techfist
поместите текстовое поле в родительском дне.
android:layout_alignParentBottom="true"
и в файле манифеста сделать adjustresize мягкий ввод ``
android:windowSoftInputMode="adjustResize"
тогда текстовое поле будет двигаться вверх, когда клавиатура появляется.
Вы можете'т сказать. Нет, правда: вы просто можете'т сказать.
Клавиатура не нуждается в какой-либо конкретной формы. Это не должны быть помещены в нижней части экрана (много из популярные параметры не), он не должен держать его текущего размера при изменении текстовых полей (почти никто в зависимости от флагов). Он даже не должны быть прямоугольный. Он может также просто принять за весь экран.
(копия моего ответа на подобный вопрос, https://stackoverflow.com/questions/13534365/getting-the-dimensions-of-the-soft-keyboard )
Я'вэ создал проект библиотеки получить высоту клавиатуры для Android, даже если деятельность не'т использовать adjustResize` режим ввода.
Мое решение-сочетание всех вышеуказанных решений. Это решение тоже суховато, но решить проблему (по крайней мере для меня).
окончательный вид = команду findViewById(Р. ИД.базы);
вид.getViewTreeObserver().addOnGlobalLayoutListener(новый OnGlobalLayoutListener() {
@Переопределить onGlobalLayout общественного недействительными() {
инт rootViewHeight = вид.getRootView().getHeight(); Смотреть ТВ = команду findViewById(Р. ИД.temp_view); положение int[] = новый тип int[2]; ТВ.getLocationOnScreen(местоположение); int высота = (тип int) (локация[1] + телевизор.getMeasuredHeight()); дефф = rootViewHeight - высота; // дефф-высота мягкая клавиатура
} });
Но в любом случае, чтобы решить проблему @zeeshan0026 только один флаг в манифесте андроид:windowSoftInputMode="и adjustResize"
в достаточно.
Смотрите не больше! Я'вэ искал решение для этого в течение длительного времени. После нескольких дней попыток все трюки предложил на СОФ, я нашел идеальное решение, которое действительно работает.
Этот проект GitHub демонстрирует это наилучшим образом: https://github.com/siebeprojects/samples-keyboardheight
Получайте удовольствие!
Я использовал это, чтобы получить высоту клавиатуры программно в Android и протестировали его, пожалуйста, попробуйте еще это:
myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
Rect r = new Rect();
parent.getWindowVisibleDisplayFrame(r);
int screenHeight = parent.getRootView().getHeight();
int heightDifference = screenHeight - (r.bottom - r.top);
Log.d("Keyboard Size", "Size: " + heightDifference);
//boolean visible = heightDiff > screenHeight / 3;
}
});
Спасибо.
Этот метод работает с adjustNothing или любой windowSoftInputMode на вашу деятельность.
<activity android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/AppTheme"
android:windowSoftInputMode="stateHidden|adjustNothing"/>
С помощью PopupWindow
, вы можете иметь отдельные "и поведение клавиатуры" и для него, и он сообщит вам, что размер клавиатуры. В PopupWindow имеет высоту экрана, а ширину 0px, так что вы выиграли'т вижу, он выиграл'т повлиять на вашу деятельность, но и предоставим вам необходимую информацию.
Создайте класс, называемый KeyboardHeightProvider
и добавьте следующий код:
public class KeyboardHeightProvider extends PopupWindow {
public KeyboardHeightProvider(Context context, WindowManager windowManager, View parentView, KeyboardHeightListener listener) {
super(context);
LinearLayout popupView = new LinearLayout(context);
popupView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
popupView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
DisplayMetrics metrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(metrics);
Rect rect = new Rect();
popupView.getWindowVisibleDisplayFrame(rect);
int keyboardHeight = metrics.heightPixels - (rect.bottom - rect.top);
int resourceID = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceID > 0) {
keyboardHeight -= context.getResources().getDimensionPixelSize(resourceID);
}
if (keyboardHeight < 100) {
keyboardHeight = 0;
}
boolean isLandscape = metrics.widthPixels > metrics.heightPixels;
boolean keyboardOpen = keyboardHeight > 0;
if (listener != null) {
listener.onKeyboardHeightChanged(keyboardHeight, keyboardOpen, isLandscape);
}
});
setContentView(popupView);
setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
setWidth(0);
setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
setBackgroundDrawable(new ColorDrawable(0));
parentView.post(() -> showAtLocation(parentView, Gravity.NO_GRAVITY, 0, 0));
}
public interface KeyboardHeightListener {
void onKeyboardHeightChanged(int keyboardHeight, boolean keyboardOpen, boolean isLandscape);
}
}
Обратите внимание, как PopupWindow имеет свой собственный setSoftInputMode (...), так что он не'т важно, что вы установить в вашей деятельности, в PopupWindow еще долго будет сказываться на клавиатуре, открывая или закрывая и обеспечит родительской активности высоту. Если высота в
>= 100` можно считать открытой клавиатуре.
Чтобы его использовать, просто инстанцировать его в вашей деятельности'метод onCreate ы (...)
метод после setContentView(...)`:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
LinearLayout llRoot = findViewById(R.id.llRoot); //The root layout (Linear, Relative, Contraint, etc...)
new KeyboardHeightProvider(this, getWindowManager(), llRoot, new KeyboardHeightProvider.KeyboardHeightListener() {
@Override
public void onKeyboardHeightChanged(int keyboardHeight, boolean keyboardOpen, boolean isLandscape) {
Log.i("keyboard listener", "keyboardHeight: " + keyboardHeight + " keyboardOpen: " + keyboardOpen + " isLandscape: " + isLandscape);
//Do what you want or have to with the parameters..
}
});
//...
}