Как сохранить нижнюю навигационную панель от нажатия на клавиатуре

Как я могу создать липкий нижний колонтитул, который не будет перемещен вверх, когда появится клавиатура функциональной клавиши?

Ниже приведен пример изображения моей текущей настройки и того, чего я хочу достичь. У меня есть scrollview, который содержит мое содержимое страницы и linearlayout, которые выровнены с нижней частью родителя, которая действует как панель навигации.

Пример того, что я хочу сделать

Проблема заключается в том, что при всплывании клавиатуры она выводит весь мой вид вверх, включая нижний раздел навигации. Я не хочу отключать автоматическое подталкивание представления (путем установки android:windowSoftInputMode="adjustPan"), но вместо исключить один элемент из-под него вверх, моя нижняя панель навигации.

Я протестировал исправление windowSoftInputMode, но он скрывает содержимое моей страницы за клавиатурой. Есть ли способ, чтобы он продолжал выдвигать scrollview, но не нижний nav? Моим другим вариантом было установить visibility:gone на клавиатуре вверх, а затем перетащить его на клавиатуру вниз, но это кажется слишком сложным и не всегда надежным из того, что я читал.

Если у кого-нибудь есть примеры или предложения, я все уши. Спасибо.

Ответы

Ответ 1

Либо добавьте это как атрибут XML прокрутки

Android: isScrollContainer = "ложь"

или добавить это в тег активности в манифесте

Android: windowSoftInputMode = "adjustPan"

Ответ 2

Я пробовал много решений, найденных на SO, и добавлял android: windowSoftInputMode = "adjustNothing" в манифест для работы, которая работала для меня:

<activity
    android:name=".MainActivity"
    android:windowSoftInputMode="adjustNothing">

Связанная компоновка:

  <RelativeLayout
     ...
        <android.support.v4.widget.NestedScrollView
           ...
        </android.support.v4.widget.NestedScrollView>
        <android.support.design.widget.BottomNavigationView
             ...
            design:menu="@menu/navigation"/>
    </RelativeLayout>

Ответ 3

Я столкнулся с довольно подобной проблемой с различиями в том, что a) я сначала не использовал ScrollView, и б) элемент, который я не хотел переместить, был простым TextView.

Вот ответ, который я нашел: нажмите

Что я сделал, чтобы исправить это:

  • Использовать adjustResize
  • Используйте 4 макета: окружающий, 1 для заголовка, ScrollView и 1 для вашей "нижней навигации",
  • Не просто полагайтесь на android:layout_alignParentBottom="true", в то время как это переместит вашу навигационную панель в нижнюю часть экрана, это также означает, что клавиатура может переместить ее из-за "adjustResize",
  • Кроме того, используйте android:layout_height="wrap_content" в сочетании с android:layout_below="@id/MyScrollView" (так что макет будет использовать все пространство, которое он может получить между ScrollView и нижней частью экрана) и android:gravity="bottom" чтобы просто иметь все в нижней части макета.
  • Вы также можете использовать android:layout_height="match_parent" вместо android:layout_alignParentBottom="true" и android:layout_height="wrap_content" но я не полностью его тестировал.
  • Как я уже сказал, это приведет к тому, что макет "bottom nav" будет использовать все пространство, которое он может получить под ScrollView. Если вы этого не хотите, например, потому что ваш "нижний навигатор" имеет другой цвет, который вам не нужно показывать слишком много, попробуйте создать окружающий RelativeLayout для "нижней навигации" и еще один пустой макет внутри, который может нажать "снизу" nav "вниз. ;)

Ответ 4

Просто добавьте эту строку в свой onCreate, когда эта опция устанавливает, что окно не настраивается для показанного метода ввода. :

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

Ответ 5

вы просто добавляете этот код в свой манифест таким образом.

 <activity android:name=".MainActivity"
        android:windowSoftInputMode="adjustPan">

это работает для меня.. счастливое кодирование