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.