Android: как мне предотвратить, чтобы программная клавиатура подталкивала мой взгляд вверх?


386

У меня есть вертикальный выдвижной ящик в нижней части моего приложения. Когда программная клавиатура открывается, она выдвигает язычок для выдвижного ящика вверх, поэтому она садится на верхнюю часть клавиатуры. Я на самом деле хочу, чтобы он оставался внизу экрана и становился скрытым при отображении клавиатуры.

Кто-нибудь еще сталкивался с этой проблемой? Знаете, как это исправить?


1
Привет, у меня та же проблема, какой флаг вы использовали в файле манифеста, можете ли вы PLZ помочь мне с этим
— Nixit Patel

1
Этот вопрос дублируется здесь: stackoverflow.com/questions/5516216/…
— WonderWorker

Ответы:


657

Вы можете просто поменять windowSoftInputModeфлаг своей активности adjustPanв своем AndroidMainfest.xmlфайле внутри тега активности.

Проверьте официальную документацию для получения дополнительной информации.

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>

43
Я не хочу, чтобы представление панорамировалось, я хочу, чтобы оно оставалось неподвижным там, где оно есть, и просто прикрывал клавиатуру все, что собирается скрывать.
— Кристофер Перри

5
При панорамировании это означает, что представление будет прокручиваться, чтобы сделать видимым то представление, которое вы печатаете. Другими словами, если только что появившаяся клавиатура не закрывала сфокусированный вид, она останется статичной.
— Александр Олейников

18
Я сталкиваюсь с той же проблемой. сделал флаг windowSoftInputMode для «AdjustPan» в файле manifeast. Но не работает. как это решить
— Субрат

20
В моем случае не помогает наличие ряда кнопок в нижней части экрана и ScrollView над ними. Кнопки нажимаются вверх независимо от значения в windowSoftInputMode.
— Артем Руссаковский

3
не работает во фрагменте. Как это сделать во фрагменте?
— Прашант Деббадвар

175

Ни один из ответов не работал для меня, но это сработало:

android:windowSoftInputMode="adjustNothing"

6
Это заставляет клавиатуру отображаться с наложением содержимого, без создания макета для пересчета его высоты.
— Райнхард

13
Это решает проблему с тем, что клавиатура подталкивает контент вверх, хотя это то, чего я и ОП хотели достичь.
— Даниэль Дуглас

8
заимствуя у @Dom, вы можете использовать getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);это программное обеспечение для установки значения
— Bron Davies

1
Этот действительно работает для меня, в отличие от других ответов (
— Jelly Bean

Отлично! Это также работает в моем случае. Я показываю диалог с текстом редактирования внутри. Как только диалог открывается, клавиатура тоже появляется. Я пробовал "AdjustPan", но он заблокировал функцию появления клавиатуры. Таким образом, «настроить ничего» работал лучше в моем случае.
— Сембоздемир

85

В моем случае причина, по которой кнопки нажимались вверх, заключалась в том, что вид над ними был a ScrollView, и он сворачивался при нажатии кнопок над клавиатурой независимо от того, какое значение android:windowSoftInputModeя настраивал.

Я смог избежать того, чтобы моя нижняя строка кнопок была нажата программной клавиатурой, установив android:isScrollContainer="false"ее ScrollViewнад кнопками.


2
Но в этом случае программная клавиатура закрывает часть экрана, и прокрутки вниз нет. Похоже, есть только один способ предотвратить появление нижней панели вверху клавиатуры - скрыть ее, когда клавиатура открыта ...
— Дмитрий

1
это оно! Этот параметр, на мой взгляд, очень интересен, поскольку я нашел единственный способ добиться эффекта пропущенного свойства «AdjustNothing»!
— rupps

Я использую это с Textview Работая отлично tnx
— Сунил Чаудхари

2
@ Артем Руссаковский Я не знаю, кто вы, но я люблю вас за это решение. Большое спасибо.
— Лев

1
@ Артем Руссаковский это работает отлично. Большое спасибо.
— SkypeDogg

72

Вы можете попытаться добавить этот атрибут динамически, добавив следующий код в onCreateметод вашей деятельности:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Это сработало для меня, но это:

android:windowSoftInputMode="adjustPan"

техника его подводит.


Вы добавили android:windowSoftInputMode="adjustPan"в AndroidManifest.xml?
— Habeeb Perwad

Нет, поскольку это не имело никакого значения для меня. Первая строка кода сделала свою работу. :) @HabeebPerwad
— Дом

Я добавил строку секунд в файл AndoidManifest.xml. Я думаю, что после этого только это сработало. так просто спросил.
— Хабиб Perwad

1
@ Дом, как использовать " getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);" во фрагменте?
— Тушар Гогна

1
В заключение! Это работает! У меня был контроллер (простирается от FragmentActivity) и некоторые виды, прикрепленные к нему (ракурсы расширяются от RelativeLayout). Итак, с точки зрения беспокойства я сделал так, controller.getWindow()...как ты сказал. Работы
— Алаа М.

39

Эти ответы здесь не помогли мне. Итак, я попробовал это:

android:windowSoftInputMode="adjustResize"

Это работает как шарм, теперь заголовок моего приложения не исчезает. Это гладко.


Это почти идеально работает для меня. Единственная проблема заключается в том, что строка / строка подсказок клавиатуры все еще скрывает мою раскладку. Сталкивались ли вы с такой проблемой?
— Суфийский

Я не сталкивался с этой проблемой. @Sufian
— amalBit

Я тогда не сталкивался с какими-либо проблемами. Теперь я не уверен. @Sufian
— amalBit

Для тех, кто может столкнуться с подобной проблемой, это, вероятно, было связано с TabLayout. Проблема исчезла, как только я установил ее видимость View.GONE. Возможно, пришло время изменить мой макет.
— Суфиан

13

Чтобы сделать это программно во фрагменте, вы можете использовать следующий код

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Поместите это в onResume ()


11

Для будущих читателей.

Я хотел конкретного контроля над этой проблемой, поэтому я сделал следующее:

От фрагмента или действия скройте остальные виды (которые не нужны, когда клавиатура поднята), а затем восстановите их, чтобы решить эту проблему:

            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    rootView.getWindowVisibleDisplayFrame(r);
                    int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    //ok now we know the keyboard is up...
                        view_one.setVisibility(View.GONE);
                        view_two.setVisibility(View.GONE);

                    }else{
                    //ok now we know the keyboard is down...
                        view_one.setVisibility(View.VISIBLE);
                        view_two.setVisibility(View.VISIBLE);

                    }
                }
            });

1
@Skynet Ты абсолютно прав! Это было индивидуальное решение, которое я использовал для своей проблемы.
— Петр

7
Эй, это было великолепно. Тем не менее, когда клавиатура закрыта, существует короткий период (миллисекунды), когда вид переключается на видимый. Поэтому вместо того, чтобы устанавливать видимость напрямую, я использовал view.post(Runnable runnable)и установил видимость оттуда. Для меня это получилось здорово
— daisura99

9

Просто одна строка, которая будет добавлена ​​...

Добавьте android:windowSoftInputMode="stateHidden|adjustPan"необходимую активность вашего manifest file.

Я только что решил :)


8

Для пользователей xamarin добавьте этот код в атрибут Activity класса MainActivity,

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

или вы можете добавить этот код Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)в метод OnCreate класса MainActivity.



7

Пока ответы мне не помогли, так как у меня есть кнопка и поле textInput (рядом) под textView, которое скрывалось клавиатурой, но это решило мою проблему:

android:windowSoftInputMode="adjustResize"

7

Добавьте следующий код в «активность» файла манифеста.

android:windowSoftInputMode="adjustResize"

Это хорошо работает. Тем не менее, просто совет, он не работает хорошо, когда вы используете проценты. Потому что это перенастраивать некоторые элементы. Итак, если у вас есть элементы Constraints с процентами, у вас будут проблемы. Вместо этого используйте wrap_content, и он будет работать очень хорошо.
— Тьяго Силва


6

Это было лучшее, что сработало для меня

android:windowSoftInputMode="adjustNothing"

Попробуй это!


4

Ну, я смотрел эти ответы, но в моем случае я попал в ту же проблему и нашел убежище благодаря очень удобному и простому решению, которое включает в себя добавление очень маленького невинного атрибута в ваш тег Scrollview, находящийся в вашем XML-файле. Это

android:isScrollContainer="false"

Удачи!



2

Для прокрутки:

если после добавления android:windowSoftInputMode="stateHidden|adjustPan"в ваш Android манифест все равно не работает.

На это может повлиять то, что когда появится клавиатура, она перейдет в режим прокрутки, и если ваша кнопка / какие-либо объекты не будут отображены в окне прокрутки, тогда объекты будут следовать за клавиатурой и перемещать ее положение.

Проверьте свой XML, где находится ваша кнопка, и убедитесь, что она находится под вашей прокруткой, а не за ее пределами.

Надеюсь, это поможет. : D


2

В моем случае мне нужно было, чтобы клавиатура оставалась скрытой, и сразу после нажатия кнопки мой макет должен быть скорректирован, поэтому я просто добавил эту команду в манифест, и она стала супер правильной.

android:windowSoftInputMode="stateHidden|adjustResize"

2

Когда вы хотите скрыть вид при открытой клавиатуре.

Добавьте это в свою активность в файле манифеста

android:windowSoftInputMode="stateHidden|adjustPan"

2

Никто из них не работал для меня, попробуйте этот

 private void scrollingWhileKeyboard() {
    drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            try {
                drawerlayout.getWindowVisibleDisplayFrame(r);
                int screenHeight = drawerlayout.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;
                if (keypadHeight > screenHeight * 0.15) {
                    tabLayout.setVisibility(View.GONE);
                } else {
                    tabLayout.setVisibility(View.VISIBLE);
                }
            } catch (NullPointerException e) {

            }
        }
    });

}

1

Главное окно действия не изменится, чтобы освободить место для виртуальной клавиатуры. Скорее, содержимое окна будет автоматически панорамироваться, так что текущий фокус никогда не будет скрыт клавиатурой, и пользователи всегда смогут увидеть, что они печатают.

android:windowSoftInputMode="adjustPan"

Это может быть лучшим решением для того, что вы хотели.



1

Этот код может вам помочь. Используйте это в своем oncreateметоде.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Я пробовал это, но у меня возникают проблемы, когда вид отсекает немного нижней части вида и толкает вид, чтобы наложить время выше? Любые идеи о том, что меняет макет или что нужно? stackoverflow.com/questions/39909897/…
— Lion789

1

Включите в свой файл манифеста действие, которое вы хотите отобразить. Но убедитесь, что вы не используете полноэкранный режим.

android:windowSoftInputMode="adjustPan"


1

Я решил свою проблему, добавив

 android:windowSoftInputMode="adjustNothing" 

В манифест файл добавить.

и установив ограничение Recyclerviews isScrollContainer в false.

android:isScrollContainer="false"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.