it-swarm.com.ru

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

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

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

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

107
Dinedal

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

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

83
Christopher Orr

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

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

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

Android:windowSoftInputMode="adjustPan|adjustResize"
30
Serhii Bohutskyi

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

windowSoftInputMode="adjustResize"

ИЛИ ЖЕ

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
20
Jose Kurian

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

Android:windowSoftInputMode="adjustPan"

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

1) AndroidManifest.xml 

Android:windowSoftInputMode="stateVisible|adjustResize"

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

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

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

14
Ronak Poriya

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

 Android:windowSoftInputMode="adjustResize"

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

 Android:layout_gravity="center" or Android:layout_gravity="bottom" 

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

9
Zahra.HY

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

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

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

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

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

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

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

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

5
Heena Arora

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

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

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

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

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

3
Diego Ramírez Vásquez

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

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

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
1
Pratik Mohanrao Gondil

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

<activity name="MainActivity"
    Android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
0
Shivam Garg

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

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