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


139

У мене в RelativeView є кілька елементів із набором атрибутів вирівнювання внизу, коли виходить м'яка клавіатура, елементи приховані м'якою клавіатурою.

Я хотів би, щоб вони рухалися вгору, щоб, якщо є достатньо місця на екрані, вони відображалися над клавіатурою, або зробити розділ над клавіатурою прокручуваним, щоб користувач міг бачити елементи.

Будь-які ідеї, як до цього підійти?


Оновлено посилання з блогу розробників андроїдів
Jayabal

@Dinedal Як вам встановити атрибут вирівнювання нижнього рівня до ur RelativeView ???
KJEjava48

Відповіді:


107

Так, ознайомтеся з цією статтею на веб-сайті розробників Android, де описано, як структура обробляє появу м'якої клавіатури.

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


95

Ви також можете використовувати цей код у onCreate()методі:

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

11
Для мене, навіть якщо я встановити налаштування prilagodPan screnn, рухатись лише до редагуючого тексту, на який я натиснув, але не на весь макет
murt


22

Внесіть зміни в активність файлу Manifest, як

windowSoftInputMode="adjustResize"

АБО

Внесіть зміни у своєму onCreate()методі, наприклад, у клас активності

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

11
Чому ви використовуєте різні прапори?
CoolMind

Поточна версія вимагає префікса андроїда: android: windowSoftInputMode = "коригуватиРезмер"
Andrea Leganza

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" 

буде добре


android: layout_gravity = "центр" працював, дякую! :) зараз EditText рухається клавіатурою так, як я хотів
Павло Бірюков

11

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

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

і для фрагментів у його методі onCreate

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

10

Щоб прокрутити екран вгору, слід виконати 3 кроки.

  1. Напишіть у файл маніфесту для своєї діяльності:

android: windowSoftInputMode = "коригуватиРезміри"

  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 = "центр" у батьківському відносному макеті.


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>

6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Додайте NestedScrollView навколо макета, який ви хочете прокрутити, це прекрасно спрацює


3

Я знайшов рішення моїх проблем, що він такий же, як і ваш.

Перш за все, у мене є лише LinearLayout з двома елементами, ImageView та LinearLayout, які містять 2 EditText і одну кнопку, тому мені потрібно було тримати їх окремо в повноекранному режимі без клавіатури, і коли клавіатура з'явиться, вони повинні виглядати ближче.

Тож я доповнив погляд між ними атрибутом висоти в 0dp та вагою 1, що дозволить мені переглядати погляди окремо одна від одної. і коли клавіатура відображається, оскільки вона не має фіксованої висоти, вони просто змінюють розмір і зберігають аспект.

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


6
Чому ви не опублікуєте код для кращого розуміння?
johnkarka

Я опублікував зразковий код вище: 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>

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"

@ yash786, можливо, відображається кнопка під редакційним текстом, яка отримує фокус? Друге питання, чи можете ви поділитися файлом макета або відповісти, як ви додаєте edittext у верхній частині клавіатури?
Heroes84

це працює для мене подія без андроїда: windowSoftInputMode = "stateVisible | prilagodResize"
масштабування

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

Жодна порада не вирішує мою проблему. Налаштувати панораму так само, як і робота Настроїти розмір . Якщо я встановив налаштування Нічого, крім макета, не рухатись вгору, але він приховує мій текст тексту внизу, що я пишу коректно. Тому після 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для правильної роботи, вам необхідно видалити , що від вашої діяльності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.