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

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

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

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

Приветствия

Ответы [ 9 ]

31 голосов
/ 04 октября 2011

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

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

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

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

27 голосов
/ 20 мая 2011

После нескольких дней хардкорного хакерства мне наконец-то удалось создать такое продвинутое решение, что его чтение могло бы на самом деле повредить.Я помещаю ImageView с фоном позади вида прокрутки и устанавливаю 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>
21 голосов
/ 12 августа 2013

Вы можете использовать свойство 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"/>
8 голосов
/ 27 марта 2014

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

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

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

7 голосов
/ 03 мая 2014

Может быть, есть другое (действительно простое!) Решение: В 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-файле!

Это мой первый пост, и я надеюсь, что это поможет и извините за мой английский.

7 голосов
/ 24 июня 2011

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

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

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

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

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

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

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

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

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

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

6 голосов
/ 17 декабря 2011

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

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

check Справочник разработчика Android

1 голос
/ 31 марта 2014

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

0 голосов
/ 17 декабря 2014

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

Поместите android:windowSoftInputMode="adjustPan|stateVisible" в каждую активность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...