Переместить макеты, когда отображается мягкая клавиатура?

У меня есть несколько элементов в RelativeView с атрибутом нижнего атрибута align, когда появляется мягкая клавиатура, элементы скрыты с помощью мягкой клавиатуры.

Я бы хотел, чтобы они двигались вверх так, чтобы при достаточном пространстве экрана они были показаны над клавиатурой или чтобы над секцией над клавиатурой прокручивалась прокрутка, чтобы пользователь все еще мог видеть элементы.

Любые идеи о том, как подойти к этому?

Ответ 1

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

Атрибут android:windowSoftInputMode может использоваться для указания того, что происходит на основе активности: изменяется ли макет или прокручивается ли он.

Ответ 2

Вы также можете использовать этот код в методе onCreate():

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

Ответ 3

Добавьте в AndroidManifest.xml для своей деятельности:

android:windowSoftInputMode="adjustPan|adjustResize"

Ответ 4

Вносить изменения в активность вашего файла манифеста, например

windowSoftInputMode="adjustResize"

ИЛИ

Внесите изменения в свой метод onCreate() в класс активности, например

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

Ответ 5

Аналогичная проблема, с которой я столкнулся, с макетом, состоящим из прокрутки внутри. Всякий раз, когда я пытаюсь выбрать текст в EditText, панель действий Copy/Cut/Paste перемещается вверх с помощью кода ниже, так как он не изменяет размер макета

android:windowSoftInputMode="adjustPan"

Изменив его как ниже

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) файл style.xml, в стиле действия

<item name="android:windowActionBarOverlay">true</item>

Это сработало.!!!!!!!!!!!!

Ответ 6

В AndroidManifest.xml не забудьте установить:

 android:windowSoftInputMode="adjustResize"

и для RelativeLayout внутри ScrollView установите:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

все будет хорошо

Ответ 7

для активности в его встроенной методе вставки ниже строки

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

и для фрагментов в методе onCreate

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Ответ 8

Есть 3 шага для прокрутки экрана вверх.

  1. Запишите в файле манифеста для вашей деятельности:

андроид: windowSoftInputMode = "adjustResize"

  1. Добавьте следующую строку в метод oncreate() вашей деятельности

GetWindow() setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE).

  1. Затем поместите весь вид в "Scrollview" в XML файл, например:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS Не забудьте добавить android: layout_gravity = "center" в родительский относительный макет.

Ответ 9

Я попробовал метод Диего Рамиреза, он работает. В AndroidManifest:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

В activity_main.xml:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>

Ответ 10

Я нашел решение своих проблем, что он очень похож на ваш.

Прежде всего, у меня есть только LinearLayout с двумя элементами, ImageView и LinearLayout, в которых есть 2 EditText и одна кнопка, поэтому мне нужно было держать их отдельно в полноэкранном режиме без клавиатуры, и когда клавиатура появляется, они должны смотреть ближе.

Итак, я добавил представление между ними с атрибутом height в 0dp и весом 1, что позволило мне сохранить отдельные представления друг от друга. и когда клавиатура появляется, так как у них нет высоты исправления, они просто изменяют размер и сохраняют аспект.

Voila! Размер макета изменяется, а расстояние между моими представлениями одинаково, когда клавиатура присутствует или отсутствует.

Ответ 11

Вот полный код манифеста

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Ответ 12

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Ответ 13

В вашем файле манифеста добавьте строку ниже. Это будет работать

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>

Ответ 14

Хорошо, это очень поздно, однако я обнаружил, что если вы добавите представление списка под вашим текстом редактирования, то клавиатура будет перемещать все макеты под этим текстом редактирования, не перемещая ListView.

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

Это единственное решение, которое сработало для меня.

Ответ 15

enter image description here

Here is the solution for this fix
- android:windowSoftInputMode="adjustResize" in Manifest File
- Make a class "CommentKeyBoardFix.Java" and copy and paste the below code.

public class CommentKeyBoardFix
{
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private Rect contentAreaOfWindowBounds = new Rect();

public CommentKeyBoardFix(Activity activity)
{
    FrameLayout content = activity.findViewById(android.R.id.content);
    mChildOfContent = content.getChildAt(0);
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this::possiblyResizeChildOfContent);
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent()
{
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious)
    {
        int heightDifference = 0;
        if (heightDifference > (usableHeightNow /4))
        {
            // keyboard probably just became visible
            frameLayoutParams.height = usableHeightNow - heightDifference;
        }
        else
        {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightNow;
        }
        mChildOfContent.layout(contentAreaOfWindowBounds.left, contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom);
        mChildOfContent.requestLayout();
        usableHeightPrevious = usableHeightNow;
    }
}

private int computeUsableHeight()
{
    mChildOfContent.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);
    return contentAreaOfWindowBounds.height();
}
}

And then call this class in your Activity or Fragment
setContentView(R.layout.your_comments_layout)
CommentKeyBoardFix(this) ---> For Kotlin
or
new CommentKeyBoardFix(this) ---> For Java

Ответ 16

Я просто добавил следующую строку в макет верхнего уровня, и все заработало:

android:fitsSystemWindows="true"