0

I have a problem developing my app on Android. For a long time, the app was intended to run only on tablets of fixed resolution, so we designed the layout using LinearLayouts. Now we need to deploy the app on various Android devices, including smartphones, so following the Android developer guidelines I decided to convert all my layouts to the newer ConstraintLayout; for my splash screen activity everything works well on various devices.

Problems comes with login activity: a simple layout with logo, username and password fields and buttons; using old LinearLayout, when I click on one of the fields the soft input keyboard shows up and let me to scroll to move between fields and buttons, and this is the desidered behaviour. With ConstraintLayout instead when keyboard shows up the layout doesn't scroll anymore and typing the password I can't see the progress until I move the focus away from that field.

This is my actual layout:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/top_constraint_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:contentDescription="@string/empty_row"
            android:scaleType="fitXY"
            android:src="@drawable/logo"
            app:layout_constraintTop_toBottomOf="@+id/guidelineHorizontal15"
            app:layout_constraintBottom_toTopOf="@+id/guidelineHorizontal45"
            app:layout_constraintStart_toEndOf="@+id/guidelineVertical20"
            app:layout_constraintEnd_toStartOf="@id/guidelineVertical80" />

        <EditText
            android:id="@+id/username"
            style="@style/LayoutLoginEditTextStyle"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:autofillHints=""
            android:background="@android:color/transparent"
            android:gravity="center"
            android:hint="@string/prompt_email"
            android:inputType="text"
            android:nextFocusForward="@+id/password"
            android:textColorHint="#78909C"
            android:textSize="@dimen/_12ssp"
            app:layout_constraintTop_toBottomOf="@id/guidelineHorizontal525"
            app:layout_constraintBottom_toBottomOf="@id/guidelineHorizontal60"
            app:layout_constraintStart_toEndOf="@id/guidelineVertical20"
            app:layout_constraintEnd_toStartOf="@id/guidelineVertical80" />

        <View
            android:id="@+id/view"
            android:layout_width="0dp"
            android:layout_height="2dp"
            android:background="#B4B4B4"
            app:layout_constraintTop_toBottomOf="@id/guidelineHorizontal60"
            app:layout_constraintStart_toEndOf="@id/guidelineVertical20"
            app:layout_constraintEnd_toStartOf="@id/guidelineVertical80" />

        <EditText
            android:id="@+id/password"
            style="@style/LayoutLoginEditTextStyle"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:autofillHints=""
            android:background="@android:color/transparent"
            android:gravity="center"
            android:hint="@string/prompt_password"
            android:imeActionLabel="@string/action_sign_in_short"
            android:imeOptions="actionGo"
            android:inputType="textPassword"
            android:textColorHint="#A1887F"
            android:textSize="@dimen/_12ssp"
            app:layout_constraintBottom_toTopOf="@id/guidelineHorizontal675"
            app:layout_constraintEnd_toStartOf="@id/guidelineVertical80"
            app:layout_constraintStart_toEndOf="@id/guidelineVertical20"
            app:layout_constraintTop_toBottomOf="@+id/guidelineHorizontal60" />

        <it.company.etmlib.ui.graphics.EasyButton
            style="@style/EasyButton"
            android:id="@+id/registration_button"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_gravity="center"
            android:padding="0dp"
            android:text="@string/action_sign_in_register"
            android:textColor="@color/black_text"
            android:textSize="@dimen/_11ssp"
            app:layout_constraintTop_toBottomOf="@+id/guidelineHorizontal75"
            app:layout_constraintBottom_toTopOf="@+id/guidelineHorizontal85"
            app:layout_constraintStart_toEndOf="@+id/guidelineVertical30"
            app:layout_constraintEnd_toStartOf="@+id/guidelineVertical45" />

        <it.company.etmlib.ui.graphics.EasyButton
            style="@style/EasyButton"
            android:id="@+id/sign_in_button"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_gravity="center"
            android:padding="0dp"
            android:text="@string/action_sign_in_short"
            android:textColor="@color/black_text"
            android:textSize="@dimen/_11ssp"
            app:layout_constraintTop_toBottomOf="@id/guidelineHorizontal75"
            app:layout_constraintBottom_toTopOf="@+id/guidelineHorizontal85"
            app:layout_constraintStart_toEndOf="@+id/guidelineVertical55"
            app:layout_constraintEnd_toStartOf="@+id/guidelineVertical70" />

                <ImageView
                    android:id="@+id/info_button"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="20dp"
                    android:layout_marginEnd="20dp"
                    android:background="@drawable/logo_info"
                    android:contentDescription="@string/empty_row"
                    android:visibility="visible"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintEnd_toEndOf="parent" />

                <ProgressBar
                    style="@android:style/Widget.DeviceDefault.ProgressBar.Large"
                    android:id="@+id/login_progress_bar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:visibility="gone"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintEnd_toEndOf="parent" />

                <TextView
                    android:id="@+id/login_status_message"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:fontFamily="sans-serif-light"
                    android:text="@string/login_progress_signing_in"
                    android:textSize="@dimen/_10ssp"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:visibility="gone"
                    app:layout_constraintTop_toBottomOf="@id/login_progress_bar"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintEnd_toEndOf="parent" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineHorizontal15"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.15" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineHorizontal45"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.45" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineHorizontal525"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.525" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineHorizontal60"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.6" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineHorizontal675"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.675" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineHorizontal75"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.75" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineHorizontal85"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_percent="0.85" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineVertical20"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.2" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineVertical25"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.25" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineVertical30"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.30" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineVertical45"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.45" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineVertical50"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.5" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineVertical55"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.55" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineVertical70"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.70" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineVertical75"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.75" />

        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guidelineVertical80"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.8" />

        <View
            android:id="@+id/bottomView"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:background="#FFFFFF"
            app:layout_constraintTop_toBottomOf="@+id/top_constraint_layout"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

I already read these two threads and try the proposed solutions, without resolving my problem:

What I wish to achieve is the same behaviour when keyboard shows up that I had with LinearLayout but using ConstraintLayout, otherwise if it not possible, a viable alternative.

Thanks in advance!

Lubron
  • 35
  • 2
  • 15

2 Answers2

0

You could consider using a ScrollView or a NestedScrollView as your root layout. This means your current ConstraintLayout will be within the ScrollView. I believe that should help you achieve your desired result.

MayorJay
  • 89
  • 7
  • Already tried... still doesn't scroll. Tried also the variant ConstraintLayout - (Nested)ScrollView - ConstraintLayout... same result – Lubron Nov 07 '22 at 08:43
0

The activity's main window is always resized to make room for the soft keyboard on screen.

"adjustResize"

  • You only need to add this one line in your required activity tag of AndroidManifest.xml file.

    android:windowSoftInputMode="adjustResize"
    

like this:

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

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

enter image description here

  • After resize of layout

enter image description here

Muhammad Ibrahim
  • 511
  • 1
  • 3
  • 13