Перемещать раскладку вверх, когда отображается программная клавиатура?
-
21-09-2019 - |
Вопрос
У меня есть несколько элементов в 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 шага.
- Запишите в файл манифеста для вашей активности:
android:windowSoftInputMode="Настроить размер"
- Добавьте следующую строку в метод oncreate() вашей активности
GetWindow().setSoftInputMode(WindowManager.Параметры компоновки.SOFT_INPUT_STATE_VISIBLE|WindowManager.Параметры компоновки.SOFT_INPUT_ADJUST_RESIZE);
- Затем поместите весь ваш вид в "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**
Это единственное решение, которое сработало для меня.
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"