Задний план
У меня есть активность входа в систему, которая имеет макет как таковой (вертикально, сверху вниз):
- заголовок (логотип ImageView и TextView)
- image&viewPager, который занимает остальную часть экрана
- Кнопка «Редактировать тексты и вход» появляется поверх кнопки № 2 (закрывает ее часть), но внизу экрана.
Мне нужно, чтобы это действие было полноэкранным, скрывая строку состояния, и когда появляется программная клавиатура, немного изменить раскладку для того, что показано выше # 3 .
Проблема
Представляется, что сочетание этих требований весьма проблематично.
У меня есть 2 основные проблемы с ними:
То, что я сделал для обнаружения отображаемой программной клавиатуры, похоже, не работает здесь, хотя оно отлично работало в других действиях.
Когда появляется программная клавиатура, она либо повторно показывает строку состояния, либо перемещает содержимое над нижней областью (#3) вместо изменения его размера, а также скрывает кнопку внизу (из #3) и показывает только EditText как первое представление над программной клавиатурой.
Поскольку нет никакого способа действительно прослушивать, когда программная клавиатура отображается/скрывается, мне пришлось создать индивидуальный макет, который просто сообщает мне, когда ее размер изменился. Когда его высота уменьшается, я предполагаю, что отображается клавиатура, и наоборот.
Что я пробовал
- Я пробовал несколько вариантов макета. Кажется, не помогает
- Я использовал этот макет в качестве корня фрагмента, чтобы проверить, отображается ли программная клавиатура (поскольку она меняет свой размер): https://stackoverflow.com/a/25895869/878126 К сожалению, он работает со всеми другими действиями, кроме этого.
- Я пробовал различные значения «windowSoftInputMode», включая «adjustResize» и «adjustPan».
- Я думал, что проблемы связаны с тем, что я использую прозрачную панель навигации, поэтому я отключил ее, а также отключил «fitsSystemWindows» для нижней области (# 3).
Я пробовал таким образом скрыть строку состояния:
requestWindowFeature(Window.FEATURE_NO_TITLE);
а еще вот так:
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); } else getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
Текущий макет
вот краткое описание текущего макета:
<LayoutSizeChangedSensorFrameLayout>
<RelativeLayout>
#1
<LinearLayout vertical, aligned to parent-top>
<ImageView/>
<TextView/>
<CirclePageIndicator/>
</LinearLayout>
#2
<ImageView aligned to parent-bottom, and below #1 />
<ViewPager aligned to the ImageView from all sides/>
#3
<LinearLayout vertical, aligned to the parent-bottom>
<TextView/>
<EditText/>
<Button/>
</LinearLayout>
</RelativeLayout>
</LayoutSizeChangedSensorFrameLayout>
А это тема мероприятия:
<style name="AppTheme.Material" parent="@style/Theme.AppCompat.Light.DarkActionBar">
...
<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowTranslucentNavigation" tools:ignore="NewApi">true</item>
<item name="android:windowTranslucentStatus" tools:ignore="NewApi">true</item>
<item name="android:navigationBarColor" tools:ignore="NewApi">@android:color/transparent</item>
</style>
Вопрос
Почему скрытие строки состояния не работает постоянно или влияет на то, что отображается при отображении программной клавиатуры?
Почему моя настроенная раскладка не может определить, что отображается экранная клавиатура?
Есть ли другие способы добиться того, что я пробовал?