Android: Як я можу запобігти тому, щоб м'яка клавіатура підштовхувала погляд?


385

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

Хтось ще стикався з цією проблемою? Знаєте, як це виправити?


1
привіт, у мене виникає така ж проблема, який прапор ви використали у файлі маніфесту, чи можете ви мені допомогти у цьому
Nixit Patel

1
Це питання дублюється тут: stackoverflow.com/questions/5516216/…
WonderWorker

Відповіді:


655

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

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

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

43
Я не хочу, щоб погляд переглядав панораму, я хочу, щоб він залишався статичним там, де він є, і просто майте клавіатуру прикрити, що б вона не прикривала.
Крістофер Перрі

5
Під панорамуванням мається на увазі, що подання буде прокручуватися, щоб зробити видимим той вид, в який ви вводите текст. Іншими словами, якщо щойно з'явилася клавіатура не приховала зосереджений погляд, вона залишиться статичною.
Олександр Олейников

18
Я зіткнувся з тією ж проблемою. зробив прапор windowSoftInputMode "коригуватиPan" у файлі маніфесту, але не працює. як це вирішити
Субрат

20
Не допомагає в моєму випадку мати рядок кнопок у нижній частині екрана та ScrollView над ними. Кнопки натискають вгору незалежно від значення, яке знаходиться у windowSoftInputMode.
Артем Русаковський

3
не працює в фрагменті. Як зробити це фрагментом?
Prashanth Debbadwar

175

Жодна відповідь не працювала для мене, але це зробило трюк:

android:windowSoftInputMode="adjustNothing"

6
Завдяки цьому клавіатура відображається накладеним вмістом, не створюючи компонування, щоб перерахувати його висоту.
Рейнхерд

13
Це вирішує проблему клавіатури, що підштовхує вміст вгору, хоча саме цього я і ОП хотіли досягти.
Даніель Дуглас

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

1
Цей для мене працює, на відміну від інших відповідей (желе bean 4.1)
Virus721

Ідеально! Це працює і в моєму випадку. Я показую діалогове вікно, яке має редакційний текст всередині. Як тільки відкриється діалогове вікно, з'явилася і клавіатура. Я спробував "налаштуватиPan", але він блокував появу функції клавіатури. Отже, "налаштуванняНощого" працював краще в моєму випадку.
sembozdemir

85

У моєму випадку причина натискання кнопок була в тому, що вигляд над ними був a ScrollView, і він згорнувся, коли кнопки, натиснуті над клавіатурою, незалежно від того, яке значення android:windowSoftInputModeя встановлював.

Я був в змозі уникнути мій нижній ряд кнопок отримувати виштовхується нагору м'якою клавіатури, встановивши android:isScrollContainer="false"на ScrollViewякий сидить над кнопками.


2
Але в цьому випадку м'яка клавіатура охоплює частину екрану, і немає можливості прокрутити вниз. Схоже, існує лише один спосіб запобігти появі нижньої панелі у верхній частині клавіатури - приховати її, коли клавіатура відкрита ...
Дмитро

1
ось воно! На мою думку, це налаштування є дуже цікавим зауваженням, тому що це єдиний спосіб, який я знайшов досягти ефектів відсутності властивості "коригувати ніщо"!
рвап

Я використовую його з Textview Working great tnx
Sunil Chaudhary

2
@Artem Russakovskii Я не знаю, хто ти, але люблю тебе за це рішення. Дуже дякую.
Лев

1
@Artem Russakovskii це прекрасно працює. Дуже дякую.
SkypeDogg

72

Ви можете спробувати додати цей атрибут динамічно, ввівши в onCreateметод своєї діяльності такий код :

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

Це працювало для мене, але це:

android:windowSoftInputMode="adjustPan"

не.


Ви додали android:windowSoftInputMode="adjustPan"в AndroidManifest.xml?
Хабіб Первад

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

Я додав другий рядок у файл AndoidManifest.xml. Я думаю, що після цього тільки це спрацювало. тому просто запитав.
Хабіб Первад

1
@Dom, як використовувати 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

Поки відповіді не допомогли мені, оскільки у мене є кнопка та поле для введення тексту (поруч) під textView, яке постійно заховано клавіатурою, але це вирішило мою проблему:

android:windowSoftInputMode="adjustResize"

7

Додайте наступний код до "активності" файлу Manifest.

android:windowSoftInputMode="adjustResize"

Це добре працює. Однак, лише ради, він не працює добре, коли ви використовуєте відсотки. Тому що це коригує деякі елементи. Отже, якщо у вас є елементи обмеження з відсотками, у вас виникнуть проблеми. Використовуйте натомість wrap_content, і це буде дуже добре.
Тіаго Сільва


6

Це було найкраще, що працювало для мене

android:windowSoftInputMode="adjustNothing"

Спробуй це!


4

Я переглянув ці відповіді, але в моєму випадку я потрапив у ту саму проблему і потрапив у притулок через дуже зручне і найпростіше рішення, яке передбачає поміщення дуже маленького невинного атрибута у ваш тег Scrollview, що знаходиться у вашому XML-файлі. Це є

android:isScrollContainer="false"

Удачі!



2

Для перегляду прокрутки:

якщо після додавання android:windowSoftInputMode="stateHidden|adjustPan"у Android Manifest і досі не працює.

Це може вплинути, тому що, коли клавіатура з'явиться, вона перейде у вікно прокрутки, і якщо ваша кнопка / будь-які об’єкти відсутня у вашому огляді прокрутки, то об’єкти будуть слідувати за клавіатурою та переміщувати її положення.

Перевірте свій 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 єScrollContainer на хибне.

android:isScrollContainer="false"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.