Программная клавиатура изменяет размер фонового изображения на Android - PullRequest
122 голосов
/ 26 ноября 2010

Всякий раз, когда появляется программная клавиатура, она изменяет размер фонового изображения. Смотрите на скриншот ниже:

Как видите, фон как бы сжат. Кто-нибудь может пролить свет на то, почему размер фона изменяется?

Мой макет выглядит следующим образом:

<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>

Ответы [ 16 ]

181 голосов
/ 27 ноября 2010

Хорошо. Я исправил это, используя

android:windowSoftInputMode="stateVisible|adjustPan"

запись внутри <Activity > тега в manifest файле.Я думаю, что это было вызвано наличием ScrollView внутри Activity.

102 голосов
/ 04 июня 2013

Я столкнулся с той же проблемой при разработке приложения чата, экрана чата с фоновым изображением. android:windowSoftInputMode="adjustResize" сжал мое фоновое изображение, чтобы оно заняло доступное пространство после отображения программной клавиатуры, и «AdjustPan» сдвинул весь макет вверх, чтобы настроить программную клавиатуру. Решением этой проблемы была установка фона окна вместо фона макета в XML-файле действия. Используйте getWindow().setBackgroundDrawable() в своей деятельности.

33 голосов
/ 20 апреля 2015

Вот лучшее решение, чтобы избежать подобных проблем.

Шаг 1: Создание стиля

<style name="ChatBackground" parent="AppBaseTheme">
    <item name="android:windowBackground">@drawable/bg_chat</item>
</style>

Шаг 2: Установите свой стиль деятельности в AndroidManifest файле

<activity
    android:name=".Chat"
    android:screenOrientation="portrait"
    android:theme="@style/ChatBackground" >
26 голосов
/ 09 июля 2015

Через android: windowSoftInputMode = "AdjustPan", давая плохой пользовательский опыт, потому что через весь этот экран идет сверху (переход наверх) Итак, вот один из лучших ответов.

У меня та же проблема, но послечто, я нашел удивительные ответы из @ Gem

в манифесте

android:windowSoftInputMode="adjustResize|stateAlwaysHidden"

в xml

фон и сохраняйте вид в ScrollView

В Java

Вам необходимо установить фон окна:

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

Благодаря @Gem.

14 голосов
/ 02 мая 2011

просто для добавления ...

если у вас есть просмотр списка ваших действий, вам нужно добавить это android:isScrollContainer="false" в свойствах просмотра списка ...

и не забудьтедобавьте android:windowSoftInputMode="adjustPan" в ваш XML-код манифеста на вашей активности ...

если вы, ребята, используете android:windowSoftInputMode="adjustUnspecified" с прокручиваемым видом на макете, то ваш фон все равно будет изменен с помощью программной клавиатуры ...

было бы лучше, если бы вы использовали значение «AdjustPan», чтобы предотвратить изменение размера фона ...

7 голосов
/ 12 ноября 2014

В случае, если кому-то нужно поведение adjustResize и он не хочет, чтобы его ImageView был изменен, вот еще один обходной путь.

Просто поместите ImageView внутрь ScrollView => RelativeLayoutс ScrollView.fillViewport = true.

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <FrameLayout
            android:layout_width="100dp"
            android:layout_height="100dp">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="fitXY"
                android:src="@drawable/gift_checked" />

        </FrameLayout>
    </RelativeLayout>
</ScrollView>
4 голосов
/ 18 января 2016

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

Я работал целый день, чтобы найти способ, и, к счастью, я могу по крайней меререшить эту проблему отлично на моем мобильном телефоне сейчас.

Во-первых, нам нужен ресурс списка слоев в папке для рисования, чтобы добавить отступы сверху к фоновому изображению:

<!-- my_background.xml -->
<?xml version="1.0" encoding="utf-8"?>

<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:top="75dp">
        <bitmap android:src="@drawable/bg" />
    </item>
</layer-list>

Во-вторых, мы устанавливаем этот файл как ресурс для фона, как упомянуто выше:

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

Я использую Nexus 5. Я нашел способ получить высоту actionbar в xml, но не статусбар, поэтому я должен использовать фиксированную высоту 75dp для верхнего заполнения.Надеюсь, что кто-нибудь найдет последний кусочек этой головоломки.

2 голосов
/ 26 ноября 2010

Добавьте эту строку в AndroidManifest.xml файл:

android:windowSoftInputMode=adjustUnspecified

см. эту ссылку для получения дополнительной информации.

1 голос
/ 15 февраля 2019

Я столкнулся с этой проблемой, когда мое фоновое изображение было просто ImageView внутри Fragment, и оно было изменено с клавиатуры.

Мое решение было следующим: использование пользовательского ImageView из этого SO ответа , отредактированного для совместимости с androidx.

import android.content.Context;
import android.graphics.Matrix;
import android.util.AttributeSet;
import androidx.appcompat.widget.AppCompatImageView;

/**
 * Created by chris on 7/27/16.
 */
public class TopCropImageView extends AppCompatImageView {

    public TopCropImageView(Context context) {
        super(context);
        setScaleType(ScaleType.MATRIX);
    }

    public TopCropImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setScaleType(ScaleType.MATRIX);
    }

    public TopCropImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setScaleType(ScaleType.MATRIX);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        recomputeImgMatrix();
    }

    @Override
    protected boolean setFrame(int l, int t, int r, int b) {
        recomputeImgMatrix();
        return super.setFrame(l, t, r, b);
    }

    private void recomputeImgMatrix() {
        if (getDrawable() == null) return;

        final Matrix matrix = getImageMatrix();

        float scale;
        final int viewWidth = getWidth() - getPaddingLeft() - getPaddingRight();
        final int viewHeight = getHeight() - getPaddingTop() - getPaddingBottom();
        final int drawableWidth = getDrawable().getIntrinsicWidth();
        final int drawableHeight = getDrawable().getIntrinsicHeight();

        if (drawableWidth * viewHeight > drawableHeight * viewWidth) {
            scale = (float) viewHeight / (float) drawableHeight;
        } else {
            scale = (float) viewWidth / (float) drawableWidth;
        }

        matrix.setScale(scale, scale);
        setImageMatrix(matrix);
    }

}
1 голос
/ 01 января 2019

Просто используйте в вашем onCreate() этот код:

protected void onCreate(Bundle savedInstanceState) {
...   
 getWindow().setBackgroundDrawableResource(R.drawable.your_image_resource);
...
}

и исключите эту строку в вашем xml:

android:background="@drawable/background"

Подробнее на:

http://developer.android.com/reference/android/view/Window.html

спасибо за: Адриан Сид Альмагуер

...