Прокрутка всего макета при открытой клавиатуре - PullRequest
1 голос
/ 14 апреля 2020

Я создал простую операцию входа в систему, которая выглядит следующим образом:

enter image description here

Мне хотелось, чтобы весь макет переместился вверх до в нижней части кнопки «Вход», как только выделен текст редактирования электронной почты.

Я написал этот код:

public class SignInActivity extends AppCompatActivity {

    private EditText Et_Email, Et_Password;
    private Button Btn_Login;
    private ScrollView Sv_Layout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_sign_in);
        initUI();
    }

    private void initUI() {

        getSupportActionBar().hide();

        Sv_Layout = findViewById( R.id.sv_SignInLayout );
        Et_Email = findViewById(R.id.et_SignInEmail);
        Et_Password = findViewById(R.id.et_SignInPassword);
        Btn_Login = findViewById(R.id.btn_SignIn );

        Et_Email.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View arg0, boolean hasfocus) {
                if (hasfocus) {
                    focusOnView();
                } else {
                    Log.e("TAG", "e1 not focused");
                }
            }
        });

    }


    private final void focusOnView(){
        Sv_Layout.post(new Runnable() {
            @Override
            public void run() {
                Sv_Layout.scrollTo(0, Btn_Login.getBottom());
            }
        });
    }

}

XML:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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:id="@+id/sv_SignInLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorWhite"
    android:fillViewport="true"
    tools:context=".SignInActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <ImageView
        android:id="@+id/iv_SignIn"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="48dp"
        android:layout_marginEnd="8dp"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:src="@drawable/img_signin"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_percent="0.2"
        app:layout_constraintHorizontal_bias="0.55"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent="0.48" />

    <TextView
        android:id="@+id/tv_SignIn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="40dp"
        android:layout_marginTop="40dp"
        android:text="@string/ActivitySignIn_SignIn"
        android:textColor="@color/colorLightPurple"
        android:textSize="24sp"
        app:layout_constraintHeight_percent="0.05"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/iv_SignIn"
        app:layout_constraintWidth_percent="0.3" />

    <EditText
        android:id="@+id/et_SignInEmail"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginStart="40dp"
        android:layout_marginTop="36dp"
        android:layout_marginEnd="40dp"
        android:background="@drawable/btn_underline"
        android:drawableStart="@drawable/ic_signin_email"
        android:drawablePadding="10dp"
        android:hint="@string/ActivitySignIn_EmailHint"
        android:textColor="@color/colorBlackText"
        android:inputType="textEmailAddress"
        app:layout_constraintHeight_percent="0.06"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_SignIn" />

    <EditText
        android:id="@+id/et_SignInPassword"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginStart="40dp"
        android:layout_marginEnd="40dp"
        android:layout_marginTop="16dp"
        android:background="@drawable/btn_underline"
        android:drawableStart="@drawable/ic_login_lock"
        android:drawablePadding="10dp"
        android:hint="@string/ActivitySignIn_PasswordHint"
        android:inputType="textPassword"
        android:textColor="@color/colorBlackText"
        app:layout_constraintHeight_percent="0.06"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/et_SignInEmail" />

    <Button
        android:id="@+id/btn_SignIn"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="40dp"
        android:layout_marginBottom="80dp"
        android:layout_marginEnd="40dp"
        android:background="@drawable/btn_rounded_purple"
        android:text="@string/ActivitySignIn_SignIn"
        android:textAllCaps="false"
        android:textColor="@color/colorWhite"
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_percent="0.08"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

    </androidx.constraintlayout.widget.ConstraintLayout>

</ScrollView>

Есть ли причина, по которой ничего не происходит? Я отладил приложение, чтобы проверить, ловит ли оно фокус, и оно делает, но по какой-то причине оно не перемещает представление прокрутки.

Мой манифест теперь имеет android:windowSoftInputMode="adjustPan", потому что если я удаляю его весь макет сжимается.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Добавьте ниже атрибут для вашей деятельности, который содержит ваш макет в файле манифеста

android:windowSoftInputMode="adjustResize"

Так, например,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.androidxtest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity
            android:name=".MainActivity"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

Также вам нужно получить Button из ScrollView, я завернул это в RelativeLayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".SignInActivity">

    <ScrollView
        android:id="@+id/sv_SignInLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorWhite"
        android:fillViewport="true">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/iv_SignIn"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:layout_marginTop="48dp"
                android:layout_marginEnd="8dp"
                android:adjustViewBounds="true"
                android:scaleType="fitXY"
                android:src="@drawable/img_signin"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHeight_percent="0.2"
                app:layout_constraintHorizontal_bias="0.55"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintWidth_percent="0.48" />

            <TextView
                android:id="@+id/tv_SignIn"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="40dp"
                android:layout_marginTop="40dp"
                android:text="@string/ActivitySignIn_SignIn"
            android:textColor="@color/colorLightPurple"
                android:textSize="24sp"
                app:layout_constraintHeight_percent="0.05"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/iv_SignIn"
                app:layout_constraintWidth_percent="0.3" />

            <EditText
                android:id="@+id/et_SignInEmail"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="40dp"
                android:layout_marginTop="36dp"
                android:layout_marginEnd="40dp"
            android:background="@drawable/btn_underline"
                android:drawableStart="@drawable/ic_signin_email"
                android:drawablePadding="10dp"
            android:hint="@string/ActivitySignIn_EmailHint"
            android:textColor="@color/colorBlackText"
                android:inputType="textEmailAddress"
                app:layout_constraintHeight_percent="0.06"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tv_SignIn" />

            <EditText
                android:id="@+id/et_SignInPassword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="40dp"
        android:layout_marginEnd="40dp"
                android:layout_marginTop="16dp"
            android:background="@drawable/btn_underline"
            android:drawableStart="@drawable/ic_login_lock"               
                android:drawablePadding="10dp"
                android:hint="@string/ActivitySignIn_PasswordHint"
                android:inputType="textPassword"
        android:textColor="@color/colorBlackText"
                app:layout_constraintHeight_percent="0.06"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/et_SignInEmail" />


        </androidx.constraintlayout.widget.ConstraintLayout>

    </ScrollView>

    <Button
        android:id="@+id/btn_SignIn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginStart="40dp"
    android:layout_marginBottom="80dp"
        android:layout_marginEnd="40dp"
    android:background="@drawable/btn_rounded_purple"
    android:textColor="@color/colorWhite"
        android:text="sign in"
        android:textAllCaps="false"
        android:textSize="20sp" />

</RelativeLayout>
0 голосов
/ 14 апреля 2020

Go с программной установкой softInputLayout в onCreate фрагмента / действия.

ИЛИ

Попробуйте любой из них,

android:windowSoftInputMode=["stateUnspecified",
                                       "stateUnchanged", "stateHidden",
                                       "stateAlwaysHidden", "stateVisible",
                                       "stateAlwaysVisible", "adjustUnspecified",
                                       "adjustResize", "adjustPan"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...