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

139

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

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

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

Dinedal
источник
Обновленная ссылка с блога разработчиков Android
Jayabal
@Dinedal Как вы устанавливаете выравнивание нижнего атрибута для вашего RelativeView ???
KJEjava48

Ответы:

107

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

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

Кристофер Орр
источник
95

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Bobs
источник
11
Для меня, даже если я установил AdjustPan Screnn двигаться только до текста редактирования, который я нажал, но не весь макет
Murt
33

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

android:windowSoftInputMode="adjustPan|adjustResize"
Сергей Богуцкий
источник
22
Согласно документации поведение не определено, если вы используете здесь два флага «настроить ...». См developer.android.com/guide/topics/manifest/...
user1806772
22

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

windowSoftInputMode="adjustResize"

ИЛИ

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Хосе Курьян
источник
11
Почему вы используете разные флаги?
CoolMind
Текущая версия требует префикс Android: android: windowSoftInputMode = "AdjustResize"
Андреа
21

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

android:windowSoftInputMode="adjustPan"

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

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

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

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

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

Ронак Пория
источник
18

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

 android:windowSoftInputMode="adjustResize"

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

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

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

Zahra.HY
источник
Android: layout_gravity = "центр" работал, спасибо! :) Теперь EditText перемещается по клавиатуре так, как я хотел
Павел Бирюков
11

Активность в своем методе вставки ниже линии

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

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

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Rahul_Pawar
источник
10

Есть 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" в родительский относительный макет.

Хина Арора
источник
6

Я попробовал метод Диего Рамиреса, он работает. В 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>
CoolMind
источник
6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Добавьте NestedScrollView вокруг макета, который вы хотите прокрутить, это будет отлично работать

Пракаш Редди
источник
3

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

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

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

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

Диего Рамирес Васкес
источник
6
Почему бы вам не опубликовать код для лучшего понимания?
Джонкарка
Я разместил пример кода выше: stackoverflow.com/a/31994697/2914140 .
CoolMind
Вы можете достичь этого менее хакерским способом, используя ConstraintLayoutи закрепляя верхнюю часть сверху и нижнюю часть снизу. Когда клавиатура открывается, она естественным образом изменит размеры, сжимая пространство посередине (если вы используете adjustResize)
hmac
2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
сафал бхатия
источник
Привет и добро пожаловать в stackoverflow, и спасибо за ваш ответ. Вместо того, чтобы просто публиковать блок кода, не могли бы вы дать краткое объяснение, что за проблема вы решили и как вы ее решили? Это поможет людям, которые найдут этот вопрос в будущем, лучше понять проблему и как с ней бороться.
Плутян
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>
Dantalian
источник
1

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Пратик Моханрао Гондиль
источник
1

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

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
Шивам Гарг
источник
1

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

android:fitsSystemWindows="true"
Darush
источник
@ yash786 есть кнопка показа под текстом редактирования, которая получает фокус? Второй вопрос, можете ли вы поделиться своим файлом макета или ответить мне, как вы добавляете текст редактирования в начало клавиатуры?
Heroes84
у меня работает событие без андроида: windowSoftInputMode = "stateVisible | AdjustResize"
масштабирование
0

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

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

Омар Бошра
источник
0

Ни один совет не решит мою проблему. Настроить панорамирование почти так же, как работа Настроить изменение размера . Если я установил Adjust Nothing, то макет не двигается вверх, но он скрывает мой текст редактирования нижней части, который я пишу правильно. Поэтому после 24 часов непрерывного поиска я нашел этот источник, и он решил мою проблему.

Махбубур Рахман Хан
источник
0

Это может быть поздно, но я хочу добавить несколько вещей. В Android Studio версии 4.0.1 и Gradle версии 6.1.1 windowSoftInputMode они не будут работать должным образом, если вы добавите следующие флаги в свое действие:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

Потратив много времени, я нашел этот взломать. Для того, чтобы adjustResizeили AdjustPanили какой-либо атрибут windowSoftInputModeработал должным образом, вы должны удалить его из своей деятельности.

Шехряр Аɱɩŋ
источник