Программная клавиатура изменяет размер фонового изображения на Android
Всякий раз, когда появляется программная клавиатура, она изменяет размер фонового изображения. См. Снимок экрана ниже:
Как вы можете видеть, фон как бы сжат. Кто-нибудь может пролить свет на то, почему меняется размер фона?
- Android LinearLayout заполняет-посередине
- Как добавить границу вокруг линейного макета, кроме как внизу?
- Получить все дочерние представления внутри LinearLayout сразу
- возможно равномерно распределять кнопки по ширине андроида linearlayout
- Android Horizontal LinearLayout - Элементы обертки
Мой макет выглядит следующим образом:
Хорошо, я исправил это, используя
android:windowSoftInputMode="stateVisible|adjustPan"
запись внутри
в файле manifest
. Я думаю, что это вызвано тем, что ScrollView находится внутри Activity.
Я столкнулся с такой же проблемой при разработке приложения чата, экрана чата с фоновым изображением. android:windowSoftInputMode="adjustResize"
сжимал мое фоновое изображение, чтобы соответствовать свободному пространству после того, как была отображена мягкая клавиатура, и “adjustPan” сдвинул весь макет до настройки мягкой клавиатуры. Решение этой проблемы заключалось в установке фона фона вместо фона макета внутри XML-операции. Используйте getWindow().setBackgroundDrawable()
в вашей деятельности.
Вот лучшее решение, чтобы избежать такой проблемы.
Шаг 1. Создание стиля
Шаг 2. Установите стиль своей деятельности в файле AndroidManifest
Через android: windowSoftInputMode = “adjustPan”, дающий плохой пользовательский опыт, потому что через весь экран выходит сверху (сдвиг в начало) Итак, следующий – один из лучших ответов.
У меня есть одна и та же проблема, но после этого я нашел Awesome ответы от @Gem
В манифесте
android:windowSoftInputMode="adjustResize|stateAlwaysHidden"
В xml
Не устанавливайте фон здесь и сохраняйте свое представление под ScrollView
В Java
Вам нужно установить фон в окно:
getWindow().setBackgroundDrawableResource(R.drawable.bg_wood) ;
Благодаря @Gem.
просто для добавления …
если у вас есть список в вашей деятельности, вам нужно добавить этот android:isScrollContainer="false"
в свойствах listview …
и не забудьте добавить android:windowSoftInputMode="adjustPan"
в вашем манифесте xml при вашей активности …
если вы, ребята, используете android:windowSoftInputMode="adjustUnspecified"
с прокручиваемым видом на вашем макете, тогда ваш фон будет по-прежнему изменяться с помощью мягкой клавиатуры …
было бы лучше, если бы вы использовали значение «adjustPan», чтобы предотвратить изменение размера фона …
Я столкнулся с основной проблемой при работе над своим приложением. Сначала я использую метод, предоставляемый @parulb для решения проблемы. Большое спасибо ему. Но позже я заметил, что фоновое изображение частично скрыто в панели действий (и в строке состояния я уверен). Этот небольшой вопрос уже предложен @ zgc7009, который прокомментировал ниже ответ @parulb полтора года назад, но никто не ответил.
Я проработал целый день, чтобы узнать дорогу, и, к счастью, я могу, по крайней мере, решить эту проблему на моем мобильном телефоне.
Сначала нам нужен ресурс списка слоев в папке с возможностью рисования, чтобы добавить прописку сверху к фоновому изображению:
-
Во-вторых, мы устанавливаем этот файл как ресурс для фона, как указано выше:
getWindow().setBackgroundDrawableResource(R.drawable.my_background);
Я использую Nexus 5. Я нашел способ получить высоту панели действий в xml, но не в строке состояния, поэтому я должен использовать фиксированную высоту 75dp для верхнего заполнения. Надеюсь, кто-нибудь найдет последнюю часть этой головоломки.
В случае, если кому-то нужно поведение adjustResize
и не хотите, чтобы его ImageView
был изменен, это еще один способ обхода проблемы.
Просто поместите ImageView
внутри ScrollView
=> RelativeLayout
с помощью ScrollView.fillViewport = true
.
Добавьте эту строку в файл AndroidManifest.xml :
android:windowSoftInputMode=adjustUnspecified
обратитесь к этой ссылке для получения дополнительной информации.
У меня были аналогичные проблемы, но похоже, что с помощью adjustPan
с android:isScrollContainer="false"
все еще не android:isScrollContainer="false"
мой макет (который был RecyclerView ниже LinearLayout). RecyclerView был в порядке, но каждый раз, когда появлялась виртуальная клавиатура, LinearLayout снова настраивался.
Чтобы предотвратить это поведение (я просто хотел, чтобы клавиатура переместила мой макет), я пошел со следующим кодом:
Это говорит Android в основном оставить свой макет в одиночку при вызове виртуальной клавиатуры.
Более adjustNothing
возможных вариантов можно найти здесь (хотя, как ни странно, не похоже, что есть запись для adjustNothing
).
Я столкнулся с тем же проблемом, и ни одно решение не удовлетворило меня, потому что я использовал fragment как слой над другим fragmentом, поэтому getActivity().getWindow().setBackgroundDrawable()
не работал для меня. Моим решением было переопределить FrameLayout с логикой для обработки клавиатуры и изменения растрового изображения на ходу. Это мой FrameLayout (kotlin):
`class FlexibleFrameLayout: FrameLayout {
var backgroundImage: Drawable? = null set(bitmap) { field = bitmap invalidate() } private var keyboardHeight: Int = 0 private var isKbOpen = false private var actualHeight = 0 constructor(context: Context) : super(context) { init() } constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) { init() } fun init() { setWillNotDraw(false) } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) val height = MeasureSpec.getSize(heightMeasureSpec) if (actualHeight == 0) { actualHeight = height return } //kb detected if (actualHeight - height > 100 && keyboardHeight == 0) { keyboardHeight = actualHeight - height isKbOpen = true } if (actualHeight - height < 50 && keyboardHeight != 0) { isKbOpen = false } if (height != actualHeight) { invalidate() } } override fun onDraw(canvas: Canvas) { if (backgroundImage != null) { if (backgroundImage is ColorDrawable) { backgroundImage!!.setBounds(0, 0, measuredWidth, measuredHeight) backgroundImage!!.draw(canvas) } else if (backgroundImage is BitmapDrawable) { val scale = measuredWidth.toFloat() / backgroundImage!!.intrinsicWidth.toFloat() val width = Math.ceil((backgroundImage!!.intrinsicWidth * scale).toDouble()).toInt() val height = Math.ceil((backgroundImage!!.intrinsicHeight * scale).toDouble()).toInt() val kb = if (isKbOpen) keyboardHeight else 0 backgroundImage!!.setBounds(0, 0, width, height) backgroundImage!!.draw(canvas) } } else { super.onDraw(canvas) } }
} `
Затем я использовал его, как обычный FrameLayout, и в моем fragmentе называется frameLayout.backgroundImage = Drawable.createFromPath(path)
Надеюсь, поможет
Просто добавьте свою активность
getWindow().setBackgroundDrawable(R.drawable.your_image_name);