Я много исследовал, чтобы настроить макет, когда софт-клавиатура активна, и я успешно реализовал его, но проблема возникает, когда я использую android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
это в своем теге активности в файле манифеста.
Для этого я использовал android:windowSoftInputMode="adjustPan|adjustResize|stateHidden"
разные варианты, но не повезло.
После этого я реализовал FullScreen
программно и попробовал различные макеты для работы, FullScreen
но все тщетно.
Я ссылался на эти ссылки и просмотрел здесь много постов, связанных с этой проблемой:
http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html
http://davidwparker.com/2011/08/30/android-how-to-float-a-row-above-keyboard/
Вот код XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/masterContainerView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ffffff">
<ScrollView android:id="@+id/parentScrollView"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<TextView android:id="@+id/setup_txt" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Setup - Step 1 of 3"
android:textColor="@color/top_header_txt_color" android:textSize="20dp"
android:padding="8dp" android:gravity="center_horizontal" />
<TextView android:id="@+id/txt_header" android:layout_width="fill_parent"
android:layout_height="40dp" android:text="AutoReply:"
android:textColor="@color/top_header_txt_color" android:textSize="14dp"
android:textStyle="bold" android:padding="10dp"
android:layout_below="@+id/setup_txt" />
<EditText android:id="@+id/edit_message"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="Some text here." android:textSize="16dp"
android:textColor="@color/setting_editmsg_color" android:padding="10dp"
android:minLines="5" android:maxLines="6" android:layout_below="@+id/txt_header"
android:gravity="top" android:scrollbars="vertical"
android:maxLength="132" />
<ImageView android:id="@+id/image_bottom"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_below="@+id/edit_message" />
</LinearLayout>
</ScrollView>
<RelativeLayout android:id="@+id/scoringContainerView"
android:layout_width="fill_parent" android:layout_height="50px"
android:orientation="vertical" android:layout_alignParentBottom="true"
android:background="#535254">
<Button android:id="@+id/btn_save" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_alignParentRight="true"
android:layout_marginTop="7dp" android:layout_marginRight="15dp"
android:layout_below="@+id/edit_message"
android:text = "Save" />
<Button android:id="@+id/btn_cancel" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginTop="7dp"
android:layout_marginRight="10dp" android:layout_below="@+id/edit_message"
android:layout_toLeftOf="@+id/btn_save" android:text = "Cancel" />
</RelativeLayout>
</RelativeLayout>
Я хочу, чтобы нижние 2 кнопки были направлены вверх, когда на клавиатуре появляется изображение.
источник
android:windowSoftInputMode="adjustPan"
скажите мне, если это работает ..adjustResize
иadjustPan
в то же время, из Javadocandroid.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE
: «Это не может быть объединено с {@link SOFT_INPUT_ADJUST_PAN}»Ответы:
Основываясь на обходном пути yghm, я написал удобный класс, который позволяет мне решить проблему с помощью одной строки (конечно, после добавления нового класса в мой исходный код). Однострочник это:
И класс реализации:
Надеюсь, это кому-нибудь поможет.
источник
return (r.bottom - r.top);
с ,return r.bottom
чтобы он работал на моем HTC One Mini, в противном случае вид деятельности будет зайдет слишком высоко по размеру строки состояния. Я еще не проверял это на другом устройстве все же. Надеюсь, что это может помочь.frameLayoutParams.height = usableHeightSansKeyboard;
я должен использоватьframeLayoutParams.height = usableHeightNow;
Если я этого не делаю, некоторые элементы выпадают за пределы экрана.Так как ответ уже был выбран и проблема известна как ошибка, я подумал, что добавлю «Возможное решение».
Вы можете включить полноэкранный режим, когда отображается программная клавиатура. Это позволяет корректно работать «AdjustPan».
Другими словами, я все еще использую @android: style / Theme.Black.NoTitleBar.Fullscreen как часть темы приложения и stateVisible | AdjustResize как часть режима мягкого ввода окна активности, но чтобы заставить их работать вместе, я должен переключить полноэкранный режим до появления клавиатуры.
Используйте следующий код:
Отключить полноэкранный режим
Включить полноэкранный режим
Примечание: вдохновение пришло от: Скрытие заголовка в полноэкранном режиме
источник
Я попробовал решение от Джозефа Джонсона , но, как и другие, столкнулся с проблемой разрыва между контентом и клавиатурой. Проблема возникает из-за того, что режим мягкого ввода всегда панорамируется при использовании полноэкранного режима. Это панорамирование мешает решению Джозефа, когда вы активируете поле ввода, которое будет скрыто программным вводом.
Когда появляется мягкий ввод, содержимое сначала панорамируется на основе его первоначальной высоты, а затем изменяется в соответствии с макетом, запрошенным решением Джозефа. Изменение размера и последующее расположение не отменяют панорамирование, что приводит к разрыву. Полный порядок событий:
Отключить панорамирование невозможно, но можно принудительно установить смещение панорамирования равным 0, изменив высоту содержимого. Это может быть сделано в слушателе, потому что он запускается перед панорамированием. Установка высоты содержимого на доступную высоту приводит к плавному взаимодействию с пользователем, то есть к отсутствию мерцания.
Я также внес эти изменения. Если что-то из этого вызывает проблемы, дайте мне знать:
getWindowVisibleDisplayFrame
.Rect
Кэшируются , чтобы предотвратить немного ненужный мусор.Он был протестирован на Nexus 5 и на эмуляторах с уровнями API 16-24 с размерами экрана от крошечного до большого.
Код был портирован на Kotlin, но перенести мои изменения обратно на Java просто. Дайте мне знать, если вам нужна помощь:
источник
possiblyResizeChildOfContent
вызова, так и вremoveListener
вызове, и даже после достиженияremoveListener
точки остановаpossiblyResizeChildOfContent
все еще вызывается. Кто-нибудь еще с этим вопросом?Я только что нашел простое и надежное решение, если вы используете системный интерфейс ( https://developer.android.com/training/system-ui/immersive.html ).
Это работает в том случае, когда вы используете
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
, например, если вы используетеCoordinatorLayout
.Он не будет работать
WindowManager.LayoutParams.FLAG_FULLSCREEN
(тот, который вы также можете установить в темеandroid:windowFullscreen
), но вы можете добиться аналогичного эффектаSYSTEM_UI_FLAG_LAYOUT_STABLE
(который "имеет тот же визуальный эффект" в соответствии с документами ), и это решение должно работать снова.Я проверил это на своем устройстве под управлением Marshmallow.
Ключевым моментом является то, что программные клавиатуры также являются одним из системных окон (таких как строка состояния и панель навигации), поэтому
WindowInsets
отправляемая системой система содержит точную и надежную информацию о ней.Для случая использования, например,
DrawerLayout
когда мы пытаемся рисовать за строкой состояния, мы можем создать макет, который игнорирует только верхнюю вставку и применяет нижнюю вставку, которая учитывает программную клавиатуру.Вот мой обычай
FrameLayout
:И использовать это:
Теоретически это должно работать для любого устройства без безумной модификации, гораздо лучше, чем любой взлом, который пытается взять в качестве эталона случайный размер экрана
1/3
или1/4
размер экрана.(Для этого требуется API 16+, но я использую полноэкранный режим только на Lollipop + для рисования за строкой состояния, поэтому в этом случае это лучшее решение.)
источник
Обратите внимание, что
android:windowSoftInputMode="adjustResize"
не работает, когдаWindowManager.LayoutParams.FLAG_FULLSCREEN
установлен для деятельности. У вас есть два варианта.Либо отключите полноэкранный режим для вашей деятельности. Активность не изменяется в полноэкранном режиме. Вы можете сделать это либо в XML (путем изменения темы упражнения), либо в коде Java. Добавьте следующие строки в ваш метод onCreate ().
ИЛИ
Используйте альтернативный способ для достижения полноэкранного режима. Добавьте следующий код в ваш метод onCreate ().
Обратите внимание, что метод-2 работает только в Android 4.1 и выше.
источник
Мне тоже пришлось столкнуться с этой проблемой, и у меня была работа, которую я проверил на HTC one, galaxy s1, s2, s3, note и HTC Sensation.
поместите слушателя глобального макета на корневой вид вашего макета
и там я проверил разницу в высоте, и если разница в высоте экрана больше трети высоты экрана, мы можем предположить, что клавиатура открыта. взял это из этого ответа .
это, вероятно, не пуленепробиваемый и, возможно, на некоторых устройствах это не будет работать, но это сработало для меня, и надеюсь, что это поможет вам тоже.
источник
Я реализовал решение Джозефа Джонсона, и оно работало хорошо, я заметил, что после использования этого решения иногда ящик приложения не закрывается должным образом. Я добавил функцию удаления слушателя removeOnGlobalLayoutListener, когда пользователь закрывает фрагмент, где находятся текстовые правки.
использует класс, где находятся мои edittexts
источник
Добавьте
android:fitsSystemWindows="true"
к макету, и этот макет изменит размер.источник
Чтобы заставить его работать с FullScreen:
Используйте плагин для ионной клавиатуры. Это позволяет вам слушать, когда клавиатура появляется и исчезает.
OnDeviceReady добавить этих слушателей событий:
Логика:
В основном, если разница между ними равна минус, то это количество пикселей, которое клавиатура покрывает вашим вводом. Так что если вы подстроите свой родительский div этим, это должно противодействовать этому.
Добавление тайм-аутов к логике говорит, что 300 мс также должны оптимизировать производительность (так как это позволит отображать время клавиатуры.
источник
Я попробовал класс Джозефа Джонсона, и он работал, но не вполне соответствовал моим потребностям. Вместо того, чтобы эмулировать android: windowSoftInputMode = "AdjustResize", мне нужно было эмулировать android: windowSoftInputMode = "AdjustPan".
Я использую это для полноэкранного веб-просмотра. Чтобы переместить представление контента в правильную позицию, мне нужно использовать интерфейс javascript, который предоставляет подробную информацию о положении элемента страницы, который имеет фокус и, таким образом, получает ввод с клавиатуры. Я пропустил эти детали, но предоставил свою переписать класс Джозефа Джонсона. Это обеспечит очень прочную основу для реализации пользовательского панорамирования и его изменения размера.
источник
Действительно, вид мягкой клавиатуры, кажется, никак не влияет на
Activity
то, чтоwindowSoftInputMode
я выбираю вFullScreen
режиме.Хотя я не смог найти много документации по этому свойству, я думаю, что
FullScreen
режим был разработан для игровых приложений, которые не требуют большого использования программной клавиатуры. Если у вас есть вид деятельности, который требует взаимодействия с пользователем с помощью программной клавиатуры, пожалуйста, пересмотрите использование темы, отличной от FullScreen. Вы можете отключить TitleBar, используяNoTitleBar
тему. Почему вы хотите скрыть панель уведомлений?источник
Просто держи как
android:windowSoftInputMode="adjustResize"
. Потому что он предназначен для того, чтобы оставить только одно вне"adjustResize"
и"adjustPan"
(режим настройки окна задается либо с помощью AdjustResize, либо AdjustPan. Настоятельно рекомендуется всегда указывать одно или другое). Вы можете найти это здесь: http://developer.android.com/resources/articles/on-screen-inputs.htmlЭто прекрасно работает для меня.
источник
В настоящее время я использую этот подход, и он работает как шарм. Хитрость в том, что мы получаем высоту клавиатуры из различных методов 21 сверху и снизу, а затем используем ее в качестве нижнего отступа нашего корневого представления в нашей деятельности. Я предположил, что ваш макет не нуждается в верхнем заполнении (идет ниже строки состояния), но если вы это сделаете, сообщите мне, чтобы обновить мой ответ.
MainActivity.java
Не забудьте указать свой корневой вид с идентификатором:
activity_main.xml
Надеюсь, это кому-нибудь поможет.
источник
использовать только
android:windowSoftInputMode="adjustResize|stateHidden
как вы используете AdjustPan затем отключить свойство изменения размераисточник
источник
основанный на https://stackoverflow.com/a/19494006/1815624 и желание сделать это ...
обновленная идея
объединяя ответы от
Соответствующий код:
Полный источник на https://github.com/CrandellWS/AndroidBug5497Workaround/blob/master/AndroidBug5497Workaround.java
старая идея
Создайте статическое значение высоты контейнеров перед открытием клавиатуры. Установите высоту контейнера в зависимости от того,
usableHeightSansKeyboard - heightDifference
когда клавиатура открывается, и установите ее обратно в сохраненное значение, когда она закрывается.Методы в MainActivity
Пример контейнера XML
Аналогичным образом можно добавить поля при необходимости ...
Другим соображением является использование padding. Пример этого можно найти по адресу:
https://github.com/mikepenz/MaterialDrawer/issues/95#issuecomment-80519589
источник
1) Создать KeyboardHeightHelper:
2) Пусть ваша деятельность будет на весь экран:
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
3) Прослушайте изменения высоты клавиатуры и добавьте нижний отступ для вашего вида:
Таким образом , каждый раз, когда на экране появляется клавиатура - нижний отступ для вашего вида будет меняться, и содержимое будет переупорядочено.
источник
Вы хотите, чтобы нижняя панель придерживалась нижней части экрана, но когда отображается клавиатура, она должна двигаться вверх, чтобы располагаться над клавиатурой, верно?
Вы можете попробовать этот фрагмент кода:
BottomBar будет придерживаться нижней части представления, а LinearLayout, содержащий ScrollView, займет то, что осталось от представления после отображения верхней / нижней панели и клавиатуры. Дайте мне знать, если это работает и для вас.
источник
Спасибо, Джозеф, за твой ответ. Тем не менее, в методе возможно ResizeChildOfContent (), часть
не работал для меня, так как нижняя часть зрения стала скрытой. Поэтому мне пришлось взять глобальную переменную restoreHeight, и в конструкторе я вставил последнюю строку
а затем я заменил ранее упомянутую часть
Но я понятия не имею, почему ваш код не работает для меня. Было бы очень полезно, если бы кто-то мог пролить свет на это.
источник
Я только использовал полноэкранный режим, чтобы скрыть строку состояния. Тем не менее, я хочу, чтобы приложение изменило размеры при отображении клавиатуры. Все другие решения (вероятно, из-за возраста должности) были сложными или невозможными для моего использования (хочу избежать изменения кода Java для мешка PhoneGap Build).
Вместо использования полноэкранного режима я изменил конфигурацию для Android, чтобы она не была полноэкранной:
И добавил
cordova-plugin-statusbar
через командную строку:Когда приложение загрузилось, я просто вызываю метод на плагине, чтобы скрыть себя, например:
Это работает как шарм. Единственным недостатком является то, что строка состояния четко видна во время загрузки приложения. Для моих нужд это не было проблемой.
источник
Я опробовал все возможные ответы от stackOverflow, наконец, я решил после недельного долгого поиска. Я использовал расположение координат, и я изменил это с помощью linearLayout, и моя проблема исправлена. Я не знаю, возможно, в координатной компоновке есть ошибки или что-то еще, моя ошибка.
источник
Я испробовал множество решений, в том числе Джозефа Джонсона и Йохана Стейтса. Но в результате я получил пробел между контентом и клавиатурой на некоторых устройствах (например, Lenovo s820) во всех случаях. Поэтому я внес некоторые изменения в их коды и, наконец, получил рабочее решение.
Моя идея основана на добавлении полей в верхнюю часть контента при отображении клавиатуры.
Как видите, я добавляю 30 px к разнице, потому что между верхней частью экрана и областью содержимого с полем есть небольшое белое пространство. И я не знаю, откуда это появляется, поэтому я решил просто уменьшить поля, и теперь все работает именно так, как мне нужно.
источник
Сегодня не работает AdjustResize на полноэкранном режиме, проблема актуальна для Android SDK.
Из ответов, которые я нашел:
решение - но решение показывает это на изображении:
Затем я нашел решение и удалил одно ненужное действие:
Итак, посмотрите мой фиксированный код решения на Kotlin:
Мой код для исправления ошибок:
источник
Не используйте:
потому что работает плохо. Вместо этого используйте:
источник
В моем случае эта проблема начала возникать, когда я добавил Crosswalk в свое приложение Cordova. Мое приложение не используется в полноэкранном режиме и Android: windowSoftInputMode = "AdjustPan".
У меня уже был плагин для ионной клавиатуры в приложении, поэтому определить, была ли клавиатура вверх или вниз, было легко благодаря этому:
Я перепробовал все вышеперечисленные исправления, но простой строкой, которая в итоге сделала это для меня, было следующее: css:
Надеюсь, это спасет вас от нескольких дней, которые я потратил на это. :)
источник