Всякий раз, когда появляется программная клавиатура, она изменяет размер фонового изображения. См. Снимок экрана ниже:
Как видите, фон вроде как сдавлен. Кто-нибудь может пролить свет на то, почему изменяется размер фона?
Мой макет выглядит следующим образом:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/page_bg"
android:isScrollContainer="false"
>
<LinearLayout android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_width="fill_parent"
>
<EditText android:id="@+id/CatName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="textCapSentences"
android:lines="1"
/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save"
android:onClick="saveCat"
/>
</LinearLayout>
<ImageButton
android:id="@+id/add_totalk"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@null"
android:src="@drawable/add_small"
android:scaleType="center"
android:onClick="createToTalk"
android:layout_marginTop="5dp"
/>
</LinearLayout>
android
view
android-linearlayout
Андреас Вонг
источник
источник
Я столкнулся с той же проблемой при разработке приложения для чата, экрана чата с фоновым изображением.
android:windowSoftInputMode="adjustResize"
сжал мое фоновое изображение, чтобы оно уместилось в доступном пространстве после отображения виртуальной клавиатуры, а «adjustPan» сместил всю раскладку вверх, чтобы настроить мягкую клавиатуру. Решением этой проблемы была установка фона окна вместо фона макета внутри XML-активности. ИспользуйтеgetWindow().setBackgroundDrawable()
в своей деятельности.источник
Вот лучшее решение, чтобы избежать подобных проблем.
Шаг 1. Создайте стиль
Шаг 2. Задайте стиль занятия в
AndroidManifest
файлеисточник
Через android: windowSoftInputMode = "adjustPan" доставляет неудобства пользователю, потому что весь экран идет вверху (переход наверх) Итак, следующий - один из лучших ответов.
У меня такая же проблема, но после этого я нашел потрясающие ответы от @Gem
В манифесте
В xml
Не устанавливайте здесь какой-либо фон и держите вид под ScrollView
В Java
Вам нужно установить фон в окно:
Спасибо @Gem.
источник
просто для дополнения ...
если у вас есть список ваших действий, вам нужно добавить это
android:isScrollContainer="false"
в свои свойства списка ...и не забудьте добавить
android:windowSoftInputMode="adjustPan"
в свой манифест xml в своей деятельности ...если вы, ребята, используете
android:windowSoftInputMode="adjustUnspecified"
прокручиваемый вид на макете, тогда размер вашего фона все равно будет изменяться с помощью мягкой клавиатуры ...было бы лучше, если бы вы использовали значение "adjustPan", чтобы предотвратить изменение размера фона ...
источник
В случае, если кому-то нужно
adjustResize
поведение и он не хочет, чтобы егоImageView
размер изменялся, есть еще один обходной путь.Просто вставьте
ImageView
внутрьScrollView
=>RelativeLayout
сScrollView.fillViewport = true
.источник
Я столкнулся с основной проблемой при работе над своим приложением. Сначала я использую метод, предоставленный @parulb, для решения проблемы. Большое ему спасибо. Но позже я заметил, что фоновое изображение частично скрыто панелью действий (и строкой состояния, я уверен). Этот небольшой вопрос уже предложен @ zgc7009, который прокомментировал ниже ответ @parulb полтора года назад, но никто не ответил.
Я работал целый день, чтобы найти способ, и, к счастью, теперь я могу, по крайней мере, идеально решить эту проблему на своем мобильном телефоне.
Сначала нам нужен ресурс списка слоев в папке с возможностью переноса, чтобы добавить отступ сверху к фоновому изображению:
Во-вторых, мы устанавливаем этот файл как ресурс для фона, как указано выше:
Я использую Nexus 5. Я нашел способ получить высоту панели действий в xml, но не строку состояния, поэтому я должен использовать фиксированную высоту 75dp для верхнего отступа. Надеюсь, кто-нибудь сможет найти последний кусочек этой головоломки.
источник
У меня были аналогичные проблемы, но похоже, что использование
adjustPan
withandroid:isScrollContainer="false"
все еще не исправило мой макет (который был RecyclerView ниже LinearLayout). RecyclerView был в порядке, но каждый раз, когда появлялась виртуальная клавиатура, LinearLayout изменялся.Чтобы предотвратить такое поведение (я просто хотел, чтобы клавиатура перемещалась по макету), я использовал следующий код:
Это говорит Android, что нужно оставить макет в покое при вызове виртуальной клавиатуры.
Больше информации о возможных вариантах можно найти здесь (хотя, как ни странно, не похоже, что там есть запись
adjustNothing
).источник
После изучения и реализации всех доступных ответов я добавляю решение.
Этот ответ представляет собой комбинацию кода из:
https://stackoverflow.com/a/45620231/1164529
https://stackoverflow.com/a/27702210/1164529
Вот настраиваемый
AppCompatImageView
класс, который не показывал растягивания или прокрутки мягкой клавиатуры: -Чтобы использовать его в качестве фона для моего
Fragment
класса, я установил его в качестве первого элементаFrameLayout
.источник
Добавьте эту строку в файл AndroidManifest.xml :
обратитесь к этой ссылке для получения дополнительной информации.
источник
Просто используйте в своем
onCreate()
коде:и удалите эту строку в своем xml:
Подробнее на:
http://developer.android.com/reference/android/view/Window.html
спасибо: Адриан Сид Альмагер
источник
Я столкнулся с этой проблемой, когда мое фоновое изображение было просто
ImageView
внутриFragment
, а его размер был изменен с помощью клавиатуры.Мое решение было: использовать обычай
ImageView
из этого ответа SO , отредактированный для совместимости сandroidx
.источник
Просто добавьте свою активность
источник
Я сталкивался с этой же проблемой раньше, но никакое решение не работало для меня так долго, потому что я использовал
Fragment
, а такжеgetActivity().getWindow().setBackgroundDrawable()
не было решением для меня.Решение, которое сработало для меня, - переопределить
FrameLayout
логику для обработки клавиатуры, которая должна появиться, и изменить растровое изображение на ходу.Вот мой код FrameLayout (Kotlin):
И я использовал его как обычный фон FrameLayout.
frameLayout.backgroundImage = Drawable.createFromPath(path)
Надеюсь, поможет.
источник
Вы можете обернуть свой LinearLayout FrameLayout и добавить ImageView с фоном:
И вы можете установить его высоту при создании активности / фрагмента (чтобы предотвратить масштабирование при открытой клавиатуре). Некоторый код в Котлине из фрагмента:
источник
если вы установили изображение в качестве фона окна, и пользовательский интерфейс застревает. тогда может быть возможность, что вы используете drawable, который находится в одной папке с возможностью рисования, если да, вам нужно вставить его в drawable-nodpi или drawable-xxxhdpi.
источник
Мое решение - заменить фон окна на один из макета, а затем установить для фона макета значение null. Таким образом я сохраняю изображение в окне предварительного просмотра XML:
Так что оставьте фон в макете и добавьте для него идентификатор. Затем в Activity onCreate () поместите этот код:
источник