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:
- Scrollable screen on soft keyboard open, using Constraint layout
- Window Soft Input Mode ConstraintLayout
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!