Я хотел бы настроить / изменить размер макета при активации программной клавиатуры, как показано ниже:
До и после:
Нашел пару ресурсов в SO:
- Как сохранить все поля и тексты видимыми, пока отображается программная клавиатура
- Android-клавиатура портит раскладку, когда появляется
- Настройка раскладки при включенной программной клавиатуре
Но вопросы и ответы довольно двусмысленные, вот вопрос с более четкой картиной того, что я хочу.
Требования:
- Он должен работать на телефоне с любым размером экрана.
- Заметил, что поля для заполнения / отступов в «FACEBOOK» и «Зарегистрироваться в Facebook» изменились до и после.
- Нет прокрутки просмотра не участвует.
Theme.AppCompat.Light.NoActionBar.FullScreen
), согласно этому ответу -> stackoverflow.com/a/7509285/1307690Ответы:
Просто добавь
в вашем AndroidManifest.xml, где вы объявляете это конкретное действие, и это настроит параметр изменения размера макета.
некоторый исходный код ниже для макета дизайна
источник
Этот вопрос был задан несколько лет назад, и у «Secret Andro Geni» есть хорошее базовое объяснение, и «tir38» также предпринял хорошую попытку законченного решения, но, увы, здесь нет полного решения. Я потратил пару часов на то, чтобы разобраться, и вот мое полное решение с подробным объяснением внизу:
И в AndroidManifest.xml не забудьте установить:
на
<activity>
теге, который вы хотите такой макет.Мысли:
Я понял, что
RelativeLayout
это макеты, которые занимают все доступное пространство, а затем меняются, когда клавиатура всплывает.И
LinearLayout
макеты, которые не изменяются в процессе изменения размера.Вот почему вам нужно иметь 1
RelativeLayout
сразу после того,ScrollView
чтобы охватить все доступное пространство экрана. И вам нужно иметьLinearLayout
внутри,RelativeLayout
иначе ваши внутренности будут раздавлены, когда произойдет изменение размера. Хорошим примером является "headerLayout". Если быLinearLayout
внутри не было этогоRelativeLayout
текста , «фейсбук» был бы раздавлен и не был бы показан.На фотографиях входа в систему «facebook», размещенных в вопросе, я также заметил, что вся часть входа (mainLayout) отцентрирована по вертикали относительно всего экрана, отсюда и атрибут:
на
LinearLayout
макете. А так как mainLayout находится внутри,LinearLayout
это означает, что эта часть не изменяется в размерах (снова см. Рисунок в вопросе).источник
android:layout_alignParentBottom="true"
. Это заставляет его придерживаться дна.android:layout_marginBottom="15dp"
в footerLayout , а затем RelativeLayout что держит textView2 и helpButton . В обоих случаях helpButton разрушается (даже без атрибута marginBottom). EditText1 или editText2 никоим образом не разрушаются , потому что они находятся внутри LinearLayout . Возможно, вы установили маржу на любом другом Layout (не только на footerLayout )? Попробуйте с нуля, если вам некуда! Вы также можете играть сandroid:windowSoftInputMode
атрибутом в AndroidManifest.Добавьте эту строку в свой манифест, где называется ваша активность
или
Вы можете добавить эту строку в свой
onCreate
источник
adjustPan
иadjustResize
. Это разные режимы. Подробнее о них можно прочитать здесь: stackoverflow.com/a/17410528/1738090 А здесь: developer.android.com/guide/topics/manifest/activity-elementAndroid Developer имеет правильный ответ, но предоставленный исходный код довольно многословен и фактически не реализует шаблон, описанный на диаграмме.
Вот лучший шаблон:
Вам решать, какие представления вы используете для "прокрутки" и "нижнего колонтитула". Также знайте, что вы, вероятно, должны установить
ScrollView
s fillViewPort .источник
LinearLayout
s вместо Frame и Relative, но все виды по-прежнему находятся друг над другом.Это может работать для всех видов макета.
например:
и
например:
источник
Это позволяет отобразить любой требуемый макет, ранее скрытый клавиатурой.
Добавьте это в тег активности в AndroidManifest.xml
Окружите свой корневой вид ScrollView, желательно с полосами прокрутки = нет. ScrollView должным образом не изменит ничего с вашим макетом, кроме как использовать для решения этой проблемы.
А затем установите fitsSystemWindows = "true" в представлении, которое вы хотите сделать полностью показанным над клавиатурой. Это сделает ваш EditText видимым над клавиатурой и позволит прокрутить вниз до частей под EditText, но в представлении с fitsSystemWindows = "true".
Например:
Если вы хотите показать полную часть представления fitsSystemWindows = "true" над клавиатурой в момент появления клавиатуры, вам потребуется код для прокрутки представления вниз:
Пример полной компоновки:
источник
android:fitsSystemWindows="true"
- это то, что дало мне желаемые результаты, которые я хотел ... спасибоДля тех, кто использует ConstraintLayout ,
android:windowSoftInputMode="adjustPan|adjustResize"
не будет работать.Что вы можете сделать, это использовать программный слушатель клавиатуры , установить ограничения представлений снизу вверх верхних видов, а затем установить вертикальное смещение для каждого вида (в виде процентного соотношения между ограничениями) к горизонтальной направляющей (также расположенной в процентах). , но к родителю).
Для каждого представления нам просто нужно переключиться
app:layout_constraintBottom_toBottomOf
на отображение@+id/guideline
клавиатуры , конечно же, программно.Обычно мягкая клавиатура занимает не более 50% высоты экрана. Таким образом, вы можете установить ориентир на 0,5.
Теперь программно, когда клавиатура не показана , мы можем установить все
app:layout_constraintBottom_toBottomOf
обратно в родительский, и наоборот.Вызовите этот метод:
Важно убедиться в том, чтобы установить вертикальное смещение таким образом, чтобы оно правильно масштабировалось, когда клавиатура отображается и не отображается.
источник
Многие ответы верны. В
AndroidManifest
я написал:В моем случае я добавил тему в
styles.xml
, но вы можете использовать свою собственную:Я заметил, что если я использую полноэкранную тему, изменение размера не происходит:
Также в моем случае
adjustResize
работает, ноadjustPan
не работает.Для полноэкранных макетов см. Обходной путь в Android Как настроить макет в полноэкранном режиме, когда программная клавиша видна или в https://gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584 .
Также https://medium.com/@sandeeptengale/problem-solved-3-android-full-screen-view-translucent-scrollview-adjustresize-keyboard-b0547c7ced32 работает, но его StatusBar прозрачен, поэтому батарея, часы, Wi-Fi Иконки Fi видны.
Если вы создаете действие с помощью File> New> Activity> Fullscreen Activity, где в коде используется:
вы также не добьетесь результата. Вы можете использовать
android:fitsSystemWindows="true"
в корневом контейнере, но появляется StatusBar. Так что используйте обходные пути из первой ссылки.источник
В моем случае это помогло.
main_layout.xml
Используйте это в
manifest
файлеТеперь самая важная часть! Используйте тему, как это в теге
Activity
илиApplication
.И тема так выглядит
Так что мне не хватало темы. Что заставило меня разочароваться весь день.
источник
Вы можете просто установить эти параметры в файле AndroidManifest.xml.
Использование
adjustPan
Google не рекомендуется, потому что пользователю может потребоваться закрыть клавиатуру, чтобы увидеть все поля ввода.Больше информации: Android App Manifest
источник
Для меня это работает с этой строкой кода:
Просто поместите его в метод onCreate. Лучший!
источник
Добавьте эту строку в файл Manifyt:
источник
Я использую этот расширенный фрейм класса. И когда мне нужно пересчитать размер высоты onLayout, я переопределяю onmeasure и вычитаю keyboardHeight, используя getKeyboardHeight ()
Мой создать кадр, который нужно изменить размер с Softkeyboard
SizeNotifierFrameLayout
источник
Этот код работает для меня. Когда появляется клавиатура, вы можете прокрутить экран
В AndroidManifest.xml
activity_sign_up.xml
rounded_border_edittext.xml
btn_blue_selector.xml
источник
Зарегистрируйтесь в Xamarin ниже код в вашей деятельности
Я использовал относительный макет, если вы используете макет ограничения, приведенный выше код будет работать код ниже
источник
В Kotlin или ConstraintLayout вы просто добавляете:
android:windowSoftInputMode="stateHidden|adjustResize"
ИЛИ
android:windowSoftInputMode="stateVisible|adjustResize"
Какое состояние вам нужно после запуска действия, вы можете установить из манифеста.
по вашему
AndroidManifest.xml
так:источник