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

StackOverflow https://stackoverflow.com/questions/1964789

Вопрос

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

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

Есть какие-нибудь идеи о том, как подойти к этому?

Это было полезно?

Решение

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

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

Другие советы

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

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

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

android:windowSoftInputMode="adjustPan|adjustResize"

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

windowSoftInputMode="adjustResize"

или

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

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

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

android:windowSoftInputMode="adjustPan"

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

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) style.xml файл в стиле activity

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

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

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

 android:windowSoftInputMode="adjustResize"

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

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

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

для Activity в его методе oncreate вставьте строку ниже

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

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

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

Для прокрутки экрана вверх необходимо выполнить 3 шага.

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

android:windowSoftInputMode="Настроить размер"

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

GetWindow().setSoftInputMode(WindowManager.Параметры компоновки.SOFT_INPUT_STATE_VISIBLE|WindowManager.Параметры компоновки.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>

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

Я попробовал метод Диего Рамиреса, он работает.В 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>

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

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

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

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

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

<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>

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

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

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

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

Хорошо, это очень поздно, однако я обнаружил, что если вы добавите представление списка под своим редактируемым текстом, клавиатура переместит все макеты под этим редактируемым текстом без перемещения 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**

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

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

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

android:fitsSystemWindows="true"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top