EditText показывает строку состояния или вызывает перемещение содержимого выше вместо изменения размера

Задний план

У меня есть активность входа в систему, которая имеет макет как таковой (вертикально, сверху вниз):

  1. заголовок (логотип ImageView и TextView)
  2. image&viewPager, который занимает остальную часть экрана
  3. Кнопка «Редактировать тексты и вход» появляется поверх кнопки № 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>

Вопрос

Почему скрытие строки состояния не работает постоянно или влияет на то, что отображается при отображении программной клавиатуры?

Почему моя настроенная раскладка не может определить, что отображается экранная клавиатура?

Есть ли другие способы добиться того, что я пробовал?


person android developer    schedule 23.06.2015    source источник
comment
Удачи в решении этого?   -  person Easwaramoorthy K    schedule 24.10.2016
comment
Решение, которое у нас было, состоит в том, чтобы перейти к чему-то, что имеет текст редактирования вверху.   -  person android developer    schedule 24.10.2016


Ответы (2)


Мне удалось скрыть строку состояния, когда отображается программная клавиатура, выполнив следующие 2 шага:

  1. Добавление следующего в onCreate действия:

    //No title bar is set for the activity
    requestWindowFeature(Window.FEATURE_NO_TITLE);  
    //Full screen is set for the Window  
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
  2. Установка windowFullscreenна trueв теме:

    <style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowFullscreen">true</item>
    </style>
    

К сожалению, это не полный ответ, но он может помочь вам в этом.

person buron    schedule 05.08.2015
comment
Основная проблема заключалась в том, что кнопка входа в систему, которая находится под EditText, может быть скрыта из-за клавиатуры, которая находится поверх нее. Не могли бы вы показать полный пример? - person android developer; 05.08.2015
comment
Большое спасибо!! ЭТО лучший способ всегда скрывать строку состояния: ‹item name=android:windowFullscreen›true‹/item› Я пробовал много способов, но это решение сработало для меня. Для идеального решения, которое я использовал вместе с кодом @gelldur: gist.github.com/gelldur/9c22ab760ebbc976c95b - person Abigail La'Fay; 17.04.2019

Помимо добавления FLAG_FULLSCREEN к окну, FLAG_FORCE_NOT_FULLSCREEN — этот флаг также можно сбросить:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

person Aditya    schedule 20.08.2019