Intereting Posts

Как сохранить размер фонового изображения при показе программной клавиатуры

Когда отображается программная клавиатура, она меняет размер моего макета и, таким образом, сжимает фоновое изображение вместе. Мой вопрос в основном является дубликатом этого вопроса, который объясняется очень хорошим образом:

Программная клавиатура изменяет размер фонового изображения на Android

Однако этот вопрос был закрыт, когда они нашли взломать его решение. Я не могу использовать этот хак. Весь мой макет находится внутри ScrollView, и мне нужно иметь возможность использовать этот режим прокрутки правильно в любое время. Используя android: windowSoftInputMode = «stateVisible | adjustPan», пользователь не сможет прокручивать вниз и видеть нижнюю часть экрана во время показа клавиатуры, поскольку макет будет частично существовать за клавиатурой. Таким образом, решение для меня неприемлемо. Есть ли там лучшие решения?

Ура,

Я на самом деле столкнулся с подобной проблемой не так давно. Однако я наткнулся на правильный ответ с небольшой работой.

В вашем манифесте для Android для этого проекта, привязанного к определенному действию, которое вы используете, используйте строку android:windowSoftInputMode="adjustPan|stateVisible" в теге активности.

adjustPan основном означает, что ваша активность не будет изменяться сама по себе, чтобы соответствовать мягкой клавиатуре, а stateVisible означает, что мягкая клавиатура будет отображаться по запросу (это может быть stateAlwaysVisible и т. Д., Если это необходимо)

Источник: Android Dev для тегов активности

После нескольких дней хардкорного взлома мне наконец удалось создать такое усовершенствованное решение, что, возможно, было бы больно его прочитать. Я размещаю ImageView с фоном позади scrollview и устанавливаю scaleType = "matrix", чтобы он не уменьшался при отображении клавиатуры.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/black" > <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/mah_kewl_background" android:scaleType="matrix" /> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" > <RelativeLayout android:id="@+id/smsLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="PLUNX" /> </RelativeLayout> </ScrollView> </RelativeLayout> 

Вы можете использовать свойство windowBackground, что делает пригодным для рисования весь экран. Для этого вам необходимо:

1- Создать стиль:

 <style name="Background" parent="@android:style/Theme.NoTitleBar"> <item name="android:windowBackground">@drawable/you_bg_drawable</item> </style> 

2- Установите стиль своей деятельности в AndroidManifest.xml

 <activity android:name=".ui.your_activity" android:theme="@style/Background"/> 

Я искал решение этой проблемы, когда столкнулся с этим, и после нескольких исследований я нашел решение, которое, я думаю, немного лучше. Вместо взлома с помощью ImageView вы можете использовать это из своей деятельности:

  getWindow().setBackgroundDrawableResource(R.drawable.bg_my_background); 

Надеюсь, что это поможет кому-либо еще найти решение для этого.

В Androidmanifest в использовании тега активности:

 <activity ... android:windowSoftInputMode="adjustPan" ></activity> 

Проверить ссылку разработчика Android

Я не могу прокомментировать ваш ответ, но я хотел бы что-то добавить.

Я понимаю вашу дилемму и почему решение, с которым вы связаны, не является полным решением для вашей ситуации (поскольку вы не можете прокручивать нижнюю часть представления). У меня аналогичная ситуация с большим прокручиваемым полем EditText. Когда появляется мягкая клавиатура, мне не нравится, как мой фон сжимается.

Я попробовал ваше решение, и, хотя на первый взгляд он работает, есть ситуации, когда это может быть не идеальным:

  1. Если вы позволяете вашему приложению иметь ландшафтный режим, фон не будет изменять размер / растягивать
  2. Если вы запустите приложение на устройстве с большим экраном или dpi, ваш фон может не заполнить экран

В принципе, кажется, что когда вы устанавливаете scaleType в matrix вы говорите Android, чтобы рисовать фон 1: 1, а не масштабировать. Итак, что происходит, когда вы открываете мягкую клавиатуру с помощью своего решения, ваши scrollView и imageView все scrollView как обычно, но изображение src, которое вы установили, остается 1: 1, таким образом, продолжает показывать ту же область.

Так, если, например, ваше фоновое изображение было настроено на определенный размер (например, 480 x 800), и он отлично заполняет ваш Nexus One, как только вы вращаетесь в альбом, у вас будет черная область справа.

Это спорный вопрос, конечно, если ваш фон просто повторяющийся узор, в этом случае вы можете сделать это очень большой, и мы надеемся компенсировать различные экраны (может быть, даже таблетки).

Или вы также можете предоставить разные фоны для разных размеров экрана / плотности / ориентации, но это все еще не учитывает масштабирование.

В тщетной попытке решить эту проблему я наткнулся на атрибут View называемый android:isScrollContainer . Этот атрибут сообщает определенным представлениям, разрешено ли им изменять размер при отображении мягкой клавиатуры. Это также упоминается кем-то в вашем связанном решении. Я попытался установить это (на false) в ViewGroup содержащем мой фон, но любой дочерний элемент, который прокручивается, кажется, переопределяет его, что снова вызывает скрежет.

На данный момент я не думаю, что есть полное решение для нашей ситуации. В некоторых случаях вы определенно работаете, и я благодарю вас за эти усилия. Надеюсь, Google предложит решение в будущем, но я не думаю, что они считают это проблемой / приоритетом.

Возможно, есть другое (очень простое!) Решение: В styles.xml: создайте новый стиль следующим образом: <style name="Yourstyle" parent="AppBaseTheme"> <item name="android:windowBackground">@drawable/mybackground</item> </style>
AppBaseTheme – это обычно используемая тема для вашего приложения. Затем вы добавляете в Manifest.xml: <activity android:name="com.your.app.name.Activity" android:theme="@style/Yourstyle"> </activity> Таким образом, у вас есть тот же стиль, но с фоном , Важно: не устанавливайте фоны в вашем обычном XML-файле! Это мой первый пост, и я надеюсь, что это поможет и извините за мой английский.

Как насчет решения, где «фон» – это макет. Можем ли мы раздуть макет, сделать его размером всего окна, а затем вставить его в качестве фона окна?

После долгих поисков …

Поместите android:windowSoftInputMode="adjustPan|stateVisible" в каждой Деятельности