Переместить макеты, когда отображается мягкая клавиатура?
У меня есть несколько элементов в RelativeView с атрибутом нижнего атрибута align, когда появляется мягкая клавиатура, элементы скрыты с помощью мягкой клавиатуры.
Я бы хотел, чтобы они двигались вверх так, чтобы при достаточном пространстве экрана они были показаны над клавиатурой или чтобы над секцией над клавиатурой прокручивалась прокрутка, чтобы пользователь все еще мог видеть элементы.
Любые идеи о том, как подойти к этому?
Ответы
Ответ 1
Да, посмотрите эту статью на сайте разработчиков Android, в которой описывается, как фреймворк обрабатывает появление мягкой клавиатуры.
Атрибут android:windowSoftInputMode
может использоваться для указания того, что происходит на основе активности: изменяется ли макет или прокручивается ли он.
Ответ 2
Вы также можете использовать этот код в методе onCreate()
:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Ответ 3
Добавьте в AndroidManifest.xml для своей деятельности:
android:windowSoftInputMode="adjustPan|adjustResize"
Ответ 4
Вносить изменения в активность вашего файла манифеста, например
windowSoftInputMode="adjustResize"
ИЛИ
Внесите изменения в свой метод onCreate()
в класс активности, например
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Ответ 5
Аналогичная проблема, с которой я столкнулся, с макетом, состоящим из прокрутки внутри.
Всякий раз, когда я пытаюсь выбрать текст в EditText, панель действий Copy/Cut/Paste перемещается вверх с помощью кода ниже, так как он не изменяет размер макета
android:windowSoftInputMode="adjustPan"
Изменив его как ниже
1) AndroidManifest.xml
android:windowSoftInputMode="stateVisible|adjustResize"
2) файл style.xml, в стиле действия
<item name="android:windowActionBarOverlay">true</item>
Это сработало.!!!!!!!!!!!!
Ответ 6
В AndroidManifest.xml не забудьте установить:
android:windowSoftInputMode="adjustResize"
и для RelativeLayout внутри ScrollView установите:
android:layout_gravity="center" or android:layout_gravity="bottom"
все будет хорошо
Ответ 7
для активности в его встроенной методе вставки ниже строки
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
и для фрагментов в методе onCreate
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Ответ 8
Есть 3 шага для прокрутки экрана вверх.
- Запишите в файле манифеста для вашей деятельности:
андроид: windowSoftInputMode = "adjustResize"
- Добавьте следующую строку в метод oncreate() вашей деятельности
GetWindow() setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.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>
PS Не забудьте добавить android: layout_gravity = "center" в родительский относительный макет.
Ответ 9
Я попробовал метод Диего Рамиреза, он работает.
В 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>
Ответ 10
Я нашел решение своих проблем, что он очень похож на ваш.
Прежде всего, у меня есть только LinearLayout с двумя элементами, ImageView и LinearLayout, в которых есть 2 EditText и одна кнопка, поэтому мне нужно было держать их отдельно в полноэкранном режиме без клавиатуры, и когда клавиатура появляется, они должны смотреть ближе.
Итак, я добавил представление между ними с атрибутом height в 0dp и весом 1, что позволило мне сохранить отдельные представления друг от друга. и когда клавиатура появляется, так как у них нет высоты исправления, они просто изменяют размер и сохраняют аспект.
Voila! Размер макета изменяется, а расстояние между моими представлениями одинаково, когда клавиатура присутствует или отсутствует.
Ответ 11
Вот полный код манифеста
<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>
Ответ 12
если вы находитесь в фрагментах, тогда вы должны добавить приведенный ниже код к своему onCreate в своей деятельности, он решает проблему для меня
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Ответ 13
В вашем файле манифеста добавьте строку ниже. Это будет работать
<activity name="MainActivity"
android:windowSoftInputMode="stateVisible|adjustResize">
...
</activity>
Ответ 14
Хорошо, это очень поздно, однако я обнаружил, что если вы добавите представление списка под вашим текстом редактирования, то клавиатура будет перемещать все макеты под этим текстом редактирования, не перемещая 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**
Это единственное решение, которое сработало для меня.
Ответ 15
![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
Ответ 16
Я просто добавил следующую строку в макет верхнего уровня, и все заработало:
android:fitsSystemWindows="true"