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"

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

amalBit
источник
Это почти идеально работает для меня. Единственная проблема заключается в том, что строка / строка подсказок клавиатуры все еще скрывает мою раскладку. Сталкивались ли вы с такой проблемой?
Суфийский
Я не сталкивался с этой проблемой. @Sufian
amalBit
Я тогда не сталкивался с какими-либо проблемами. Теперь я не уверен. @Sufian
amalBit
Для тех, кто может столкнуться с подобной проблемой, это, вероятно, было связано с TabLayout. Проблема исчезла, как только я установил ее видимость View.GONE. Возможно, пришло время изменить мой макет.
Суфиан
13

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

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

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

ChaturaM
источник
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);

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

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

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

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

Sravani
источник
8

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

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

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

Тушар Патель
источник
8

Этот работал для меня

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
Суреш Патту
источник
7

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

android:windowSoftInputMode="adjustResize"
Майкл Макдауэлл
источник
7

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

android:windowSoftInputMode="adjustResize"
Хосе Курьян
источник
Это хорошо работает. Тем не менее, просто совет, он не работает хорошо, когда вы используете проценты. Потому что это перенастраивать некоторые элементы. Итак, если у вас есть элементы Constraints с процентами, у вас будут проблемы. Вместо этого используйте wrap_content, и он будет работать очень хорошо.
Тьяго Силва
7
android:windowSoftInputMode="stateHidden|adjustNothing"

Этот код работает.

amyShamna
источник
Я думаю, что android: windowSoftInputMode = "stateHidden | AdjustPan" также должен работать.
Артур Сади Кордейру Россетти
6

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

android:windowSoftInputMode="adjustNothing"

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

rajlaxmi_jagdale
источник
4

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

android:isScrollContainer="false"

Удачи!

Али Наваз
источник
4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Этот работает на меня.

Чжан Слардар
источник
2

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

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

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

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

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

Yils
источник
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) {

            }
        }
    });

}
Saljith Kj
источник
1

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

android:windowSoftInputMode="adjustPan"

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

user3243900
источник
1

Попробуйте использовать это:

android:windowSoftInputMode="stateHidden|adjustPan"
Ашиш Гаутам
источник
1

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Шив Пракаш Ядав
источник
Я пробовал это, но у меня возникают проблемы, когда вид отсекает немного нижней части вида и толкает вид, чтобы наложить время выше? Любые идеи о том, что меняет макет или что нужно? stackoverflow.com/questions/39909897/…
Lion789
1

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

android:windowSoftInputMode="adjustPan"
user3419461
источник
1

@manifest в вашей деятельности:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
Хуан Мендес
источник
1

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

 android:windowSoftInputMode="adjustNothing" 

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

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

android:isScrollContainer="false"
МИЛЛИОН ГЕШО
источник