У меня проблемы с полупрозрачной панелью действий / навигационной панелью в новом Android KitKat (4.4) и windowSoftInputMode="adjustResize"
.
Обычно меняя InputMode на AdjustResize, приложение должно изменять размер, когда отображается клавиатура ... но здесь этого не будет! Если я удалю линии для эффекта прозрачности, изменение размера работает.
Итак, если клавиатура видна, мой ListView находится под ней, и я не могу получить доступ к последним элементам. (Только спрятав клавиатуру вручную)
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.XYZStyle" >
<activity
android:name="XYZ"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Значения-V19 / styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView_contacts"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:divider="@null"
android:dividerHeight="0dp"
android:drawSelectorOnTop="true"
android:fastScrollAlwaysVisible="true"
android:fastScrollEnabled="true"
android:paddingBottom="@dimen/navigationbar__height" >
</ListView>
</RelativeLayout>
Есть идеи для исправления этого?
Ответы:
Вам не хватает следующего свойства:
в корне
RelativeLayout
этого фрагмента макета .xml.Обновить:
В прошлом году был интересный доклад Криса Бейна, в котором подробно объясняется, как это работает:
https://www.youtube.com/watch?v=_mGDMVRO3iE
источник
Там в соответствующем докладе ошибки здесь . Я нашел обходной путь, который, судя по ограниченному тестированию, помогает без последствий. Добавьте пользовательскую реализацию вашего корня
ViewGroup
(я почти всегда используюFrameLayout
, так что это то, с чем я тестировал) с помощью приведенной ниже логики. Затем используйте этот настраиваемый макет вместо корневого макета и убедитесь, что вы установилиandroid:fitsSystemWindows="true"
. Затем вы можете просто вызвать вgetInsets()
любое время после макета (например, добавитьOnPreDrawListener
), чтобы настроить остальную часть вашего макета с учетом системных вставок, если хотите.Поскольку
fitSystemWindow
s не рекомендуется, обратитесь к ответу ниже, чтобы решить проблему.источник
Ответ @kcoppock действительно полезен, но fitSystemWindows устарел на уровне API 20
Итак, начиная с API 20 (KITKAT_WATCH) вы должны переопределить onApplyWindowInsets
источник
ViewCompat.setOnApplyWindowInsetsListener
dispatchApplyWindowInsets
вместо этого переопределение (тот же код) сработало для меняЭто помогло мне иметь полупрозрачную строку состояния и AdjustResize во фрагменте:
Сделайте собственный RelativeLayout, как сказали @ Victor91 и @kcoppock.
Используйте CustomRelativeLayout в качестве родительского макета для вашего фрагмента.
Объявить тему с помощью android: windowTranslucentStatus = true
Контейнер Activity должен быть объявлен в манифесте с помощью android: windowSoftInputMode = "adjustResize" и использовать объявленную тему.
Пожалуйста, используйте fitsSystemWindows для корневого макета фрагмента!
Затем в xml,
источник
Если вы хотите настроить вставки и ориентируетесь на уровень API> = 21, вы можете сделать это без создания настраиваемой группы представлений. Просто установив
fitsSystemWindows
отступы по умолчанию будут применяться к вашему представлению контейнера, что может вам не понадобиться.В этот метод встроены проверки версии, и только устройства> = 21 будут выполнять код внутри лямбда. Пример Котлина:
Убедитесь, что ваш макет все еще устанавливает
fitsSystemWindows
флаг, иначе прослушиватель вставок окна не будет вызываться.Эти источники полезны:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec https://medium.com/@azizbekian/windowinsets-24e241d4afb9
источник
BaseFragment
вместе с ним,view.fitsSystemWindows = true
и он просто работает без каких-либо изменений в фактических макетах XML или подклассах View.У меня была та же проблема, у My Activity был ScrollView в качестве корневого представления, и с активированной полупрозрачной панелью состояния он не менял размер правильно, когда отображалась клавиатура ... и, следовательно, экран не прокручивался, скрывая представления ввода.
Решение: все (макет и логика действий) перемещено внутрь нового фрагмента. Затем изменил действие, чтобы включить только этот фрагмент. Теперь все работает как положено!
Это план занятия:
источник
На основе обходного пути Джозефа Джонсона в Android Как настроить макет в полноэкранном режиме, когда отображается экранная клавиатура
назовите это
onCreate()
послеsetContentView()
в своей деятельности.AndroidBug5497Workaround.assistActivity(this);
немного отличается от оригинала заменить
return (r.bottom - r.top);
наreturn r.bottom;
вcomputeUsableHeight()
по какой-то причине я должен установить свой
fitsSystemWindows
атрибут активности наfalse
.этот обходной путь спас меня. у меня это хорошо работает. надеюсь может помочь вам.
класс реализации:
источник
Не должно работать с полупрозрачной строкой состояния; этот параметр переводит окно в полноэкранный режим, который не работает с AdjustResize.
Вы можете использовать AdjustPan или свойства fitsSystemWindows. Я бы посоветовал прочитать об этой функции, хотя у нее есть серьезные побочные эффекты:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
источник
AndroidBug5497Workaround.java позаботьтесь об утечке памяти. нужно под кодом
Мой образец с использованием RxJava, который автоматически вызывает removeOnGlobalLayoutListener (), когда onPause () в жизненном цикле Activity
источник
У меня была проблема.
Я установил для windowDrawsSystemBarBackgrounds значение «true», и мое приложение должно отображаться в строке состояния.
Это тема моей деятельности.
и мне помогли блог Цзяньшу . вы можете читать код, но текст, как я. Я добавляю еще немного кода.
Это мой фрагмент макета.
Я хочу, чтобы он был вам полезен. удачи!
источник
источник
У меня такая же проблема. Я решил с помощью координатора
activity.main.xml
content_main2.xml
MainActivity.java
теперь добавьте эту строку linearLayoutManager.setStackFromEnd (true);
источник
источник
Сначала добавьте это в корневой макет.
Когда вы используете этот подход, вы несете ответственность за то, чтобы важные части пользовательского интерфейса вашего приложения (например, встроенные элементы управления в приложении Maps) не были закрыты системными панелями. Это может сделать ваше приложение непригодным для использования. В большинстве случаев вы можете справиться с этим, добавив атрибут android: fitsSystemWindows в ваш XML-файл макета со значением true. Это регулирует отступ родительской ViewGroup, чтобы оставить место для системных окон. Этого достаточно для большинства приложений.
Однако в некоторых случаях вам может потребоваться изменить отступ по умолчанию, чтобы получить желаемый макет для вашего приложения. Чтобы напрямую управлять расположением вашего контента относительно системных полос (которые занимают пространство, известное как «вставки содержимого» окна), переопределите fitSystemWindows (вставки прямоугольника). Метод fitSystemWindows () вызывается иерархией представлений при изменении вставок содержимого для окна, чтобы окно могло соответствующим образом настроить свое содержимое. Переопределив этот метод, вы можете обрабатывать вставки (и, следовательно, макет вашего приложения), как хотите.
https://developer.android.com/training/system-ui/status#behind
Если вы хотите стать мастером по установке окон, посмотрите видео от разработчика Android. https://www.youtube.com/watch?v=_mGDMVRO3iE
источник
Лучшая практика позволяет пользователю прокручивать содержимое при отображении клавиатуры. Итак, чтобы добавить эту функциональность, вам нужно поместить корневой макет в метод Activity
ScrollView
и использовать егоwindowSoftInputMode="adjustResize"
.Но если вы хотите использовать эту функцию с
<item name="android:windowTranslucentStatus">true</item>
флагом на Android 5, контент не будет прокручиваться и будет перекрываться с клавиатурой.Чтобы решить эту проблему, проверьте этот ответ
источник