FloatingActionButton над клавиатурой и BottomNavigationView скрыты под клавиатурой в Android

Я столкнулся с проблемой, которую просто не могу обернуть. Это довольно просто;

У меня есть мнение, в котором у меня есть EditText, FloatingActionButton и BottomNavigationView, Когда я выбираю EditText клавиатура выскакивает. Это когда я хочу FloatingActionButton плавать над клавиатурой и BottomNavigationView оставаться скрытым за клавиатурой.

Я пытался использовать оба android:windowSoftInputMode как adjustResize и в качестве adjustPan, Бывший сделает FloatingActionButton и BottomNavigationView оставаться скрытым за клавиатурой. Последний будет толкать как FloatingActionButton и BottomNavigationView вверх над клавиатурой.

В дополнение к этому я попытался использовать простой кастом BottomNavigationView элемент, который устанавливает его собственный visibility в hidden когда клавиатура обнаружена (используя viewTreeObserver и addOnGlobalLayoutListener). Это работает в паре с adjustResize, но есть небольшая задержка после того, как всплывает kayboard, где вы можете увидеть BottomNavigationView, заставляя это выглядеть очень "нервным".

Мой вопрос сейчас; Есть ли альтернативные решения для этого?

Редактировать Это мой текущий XML, это очень прямо вперед.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:fitsSystemWindows="false">

<EditText
    android:id="@+id/editText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="textPersonName"
    android:text="Name" />

<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_anchor="@id/navigation"
    android:layout_margin="10dp"
    android:layout_gravity="top|end"
    app:layout_anchorGravity="right"/>

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginEnd="0dp"
    android:layout_marginStart="0dp"
    android:background="?android:attr/windowBackground"
    android:layout_gravity="bottom"
    android:elevation="20dp"
    app:menu="@menu/navigation" />

</android.support.design.widget.CoordinatorLayout>

2 ответа

Единственное, что я всегда использую, чтобы избавиться от этой проблемы.

  1. Оберните свой взгляд в ScrollView, что вы не хотите, чтобы появиться на клавиатуре.
  2. Держите представления вне Scrollview, которые вы хотите плавать на клавиатуре, когда клавиатура открывается.

Разве это не звучит хорошо и довольно легко:)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/button_next"
        android:background="#0ff"
        >
       // these views will not come up.
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >

            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="250dp"
                android:hint="Hint"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="ABC"
                android:textSize="50sp"
                />
        </LinearLayout>
    </ScrollView>
    // this will float on keyboard
    <Button
        android:id="@+id/button_next"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_alignParentBottom="true"
        android:layout_margin="10dp"
        android:text="Button Next"
        />

</RelativeLayout>

в файле manifest.xml

<application
        ...
        >
        <activity android:name=".YourActivity"
            android:windowSoftInputMode="adjustResize"
           >
        </activity>
</application>

Редактировать:

Попробуйте это, он используется для перемещения Fab на клавиатуре.

добавлять android:windowSoftInputMode="adjustResize" Убедитесь, что ваше корневое представление в макете XML имеет android:fitsSystemWindows="true" имущество

Изменить свойство основного родительского макета android:fitsSystemWindows="false" в android:fitsSystemWindows="true" и положи android:windowSoftInputMode="adjustResize" в вашей деятельности в AndroidManifest.xml файл

Другие вопросы по тегам