Как остановить Scrollview от перемещения фонового изображения вверх при нажатии EditText? - PullRequest
7 голосов
/ 16 января 2020

У меня есть одно фоновое изображение, которое имеет RelativeLayout в качестве родителя и одноуровневое, так как ScrollView и ScrollView имеют один EditText. Я сталкиваюсь с проблемой, когда фоновое изображение движется верхней стороной, когда мы нажимаем Edittext. Ниже приведен фрагмент кода и прикрепленные скриншоты. Как мы можем ограничить скроллвью от этого?

Код:

<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:src="@drawable/dog"
        android:scaleType="centerCrop"/>

<ScrollView
        android:id="@+id/layout_scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:visibility="visible">

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


        <EditText
                android:id="@+id/postal_code"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Postcode"
        />


    </RelativeLayout>
</ScrollView>

До:

enter image description here

После:

enter image description here

Ответы [ 6 ]

4 голосов
/ 23 января 2020

Добавьте это в манифесте деятельности

android:windowSoftInputMode="adjustNothing"
4 голосов
/ 22 января 2020

Измените ScrollView на androidx.core.widget.NestedScrollView, если вы используете androidx или NestedScrollView из пакета поддержки. Если вы ничего не скрывали в верхней части xml, это сработает (только что проверил это в тестовом проекте).

0 голосов
/ 25 января 2020

Итак, ваша проблема на самом деле вызвана изменением размера макета при появлении клавиатуры.

Чтобы избежать этого, вы можете добавить следующую строку в манифест (в теге активности)

android:windowSoftInputMode="adjustNothing"

Что-то как показано ниже

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.....">
<uses-permission ....
....
    <application
        android:allowBackup="true"
        ...>

         <activity android:name=".YourActivity" 
             ...
             android:windowSoftInputMode="adjustNothing">
             ....
         </activity>
    </application>

Вы также можете обратиться к этому вопросу и этому ответу

0 голосов
/ 25 января 2020

Добавить тег активности в файле манифеста

android:windowSoftInputMode="stateVisible|adjustPan"
0 голосов
/ 23 января 2020
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.unicode.attax.Activity.LoginActivity">

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:src="@drawable/background_login_3x"
        android:scaleType="centerCrop"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </ImageView>
</android.support.constraint.ConstraintLayout>

Я использую этот код для использования фонового изображения в Scrollview. Вы можете управлять соотношением и типом шкалы.

0 голосов
/ 19 января 2020

Когда открывается программная клавиатура, высота действия изменяется, и ImageView снова обрезает изображение. Это проблема. Вот идея для решения этой проблемы: если ImageView обрезает исходное изображение снизу, а не сверху и снизу, то верхняя часть изображения будет всегда фиксированной, и вы больше не увидите эту проблему. Итак, вам нужен собственный ImageView, который обрезает изображения только снизу. Благодаря @Dori и его великому ответу , чтобы предоставить ImageViewTopCrop.

/**
 * @author doriancussen
 */
public class ImageViewTopCrop extends ImageView
{
    public ImageViewTopCrop(Context context)
    {
        super(context);
        setScaleType(ScaleType.MATRIX);
    }

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

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

    @Override
    protected boolean setFrame(int l, int t, int r, int b)
    {
        Matrix matrix = getImageMatrix();
        float scaleFactor = getWidth()/(float)getDrawable().getIntrinsicWidth();
        matrix.setScale(scaleFactor, scaleFactor, 0, 0);
        setImageMatrix(matrix);
        return super.setFrame(l, t, r, b);
    }
}

Измените ваш xml макет, как показано ниже:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.doridori.lib.view.ImageViewTopCrop
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/dog" />

    <ScrollView
        android:id="@+id/layout_scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:visibility="visible">

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

            <EditText
                android:id="@+id/postal_code"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Postcode" />

        </RelativeLayout>
    </ScrollView>
</RelativeLayout>

Важно: Будьте осторожны с dog форматом изображения. Его высота должна быть достаточно большой, чтобы заполнить экран после удаления изображения в зависимости от ширины экрана. PS: Если этот ответ полезен, не забудьте поднять голос @dori answer .

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