Search code examples
androidandroid-layoutandroid-fragmentsandroid-softkeyboard

Scroll view when soft keyboard is up in fragment with Toolbar and windowTranslucentStatus set to true


Fragment is not scrolling when keyboard is up, meanwhile similar setup has work for activities. I added android:windowSoftInputMode="adjustResize|stateAlwaysHidden in the activity that is hosting the fragment, and added android:fitsSystemWindows="true" to the root layout of the fragment. I'm using Butterknife tho. Here are the code:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="@drawable/bg_create_account">

<View
    android:id="@+id/vail"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black_two" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_gravity="center"
        android:background="@color/black"
        android:gravity="center_horizontal"
        android:paddingTop="@dimen/status_bar_height">

        <TextView
            style="@style/ProximaNova18PtWhite"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:lineSpacingExtra="4sp"
            android:text="@string/create_account"
            android:textAllCaps="true"
            android:textColor="@color/white"
            android:textSize="16sp" />


    </androidx.appcompat.widget.Toolbar>

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <LinearLayout
            android:id="@+id/inner_root"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <View
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1" />

            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/username_layout"
                style="@style/LoginTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/content_margin"
                android:layout_marginEnd="@dimen/content_margin"
                android:hint="@string/username"
                app:hintAnimationEnabled="true"
                app:hintTextAppearance="@style/ProximaNova14Pt"
                app:hintTextColor="@color/white">

                <androidx.appcompat.widget.AppCompatEditText
                    android:id="@+id/username_edit"
                    style="@style/LoginEdittextStyle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:importantForAutofill="noExcludeDescendants"
                    android:inputType="textEmailAddress"
                    android:textColorHint="@color/white"
                    tools:text="dewe" />

            </com.google.android.material.textfield.TextInputLayout>

            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/email_layout"
                style="@style/LoginTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/content_margin"
                android:layout_marginTop="20dp"
                android:layout_marginEnd="@dimen/content_margin"
                android:hint="@string/email"
                app:hintAnimationEnabled="true"
                app:hintTextAppearance="@style/ProximaNova14Pt"
                app:hintTextColor="@color/white">

                <androidx.appcompat.widget.AppCompatEditText
                    android:id="@+id/email_edit"
                    style="@style/LoginEdittextStyle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:importantForAutofill="noExcludeDescendants"
                    android:inputType="textEmailAddress"
                    android:textColorHint="@color/white"
                    tools:text="dewe" />

            </com.google.android.material.textfield.TextInputLayout>

            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/password_layout"
                style="@style/LoginTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/content_margin"
                android:layout_marginTop="20dp"
                android:layout_marginEnd="@dimen/content_margin"
                android:hint="@string/password"
                app:hintAnimationEnabled="true"
                app:hintTextAppearance="@style/ProximaNova14Pt"
                app:hintTextColor="@color/white">

                <androidx.appcompat.widget.AppCompatEditText
                    android:id="@+id/password_edit"
                    style="@style/LoginEdittextStyle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:importantForAutofill="noExcludeDescendants"
                    android:inputType="textPassword"
                    android:textColorHint="@color/white"
                    tools:text="dewe" />

            </com.google.android.material.textfield.TextInputLayout>

            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/confirm_password_layout"
                style="@style/LoginTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/content_margin"
                android:layout_marginTop="20dp"
                android:layout_marginEnd="@dimen/content_margin"
                android:hint="@string/confirm_password"
                app:hintAnimationEnabled="true"
                app:hintTextAppearance="@style/ProximaNova14Pt"
                app:hintTextColor="@color/white">

                <androidx.appcompat.widget.AppCompatEditText
                    android:id="@+id/confirm_password_edit"
                    style="@style/LoginEdittextStyle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:importantForAutofill="noExcludeDescendants"
                    android:inputType="textPassword"
                    android:textColorHint="@color/white"
                    tools:text="dewe" />

            </com.google.android.material.textfield.TextInputLayout>

            <androidx.appcompat.widget.AppCompatCheckBox
                android:id="@+id/checkbox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginStart="@dimen/content_margin"
                android:layout_marginTop="40dp"
                android:layout_marginEnd="@dimen/content_margin"
                android:checked="true"
                android:hint="@string/i_agree_to_all_the_terms_and_conditions"
                android:padding="0dp"
                android:textAppearance="@style/ProximaNova14Pt"
                android:textColorHint="@color/white"
                app:buttonTint="@color/white" />


            <androidx.appcompat.widget.AppCompatButton
                android:id="@+id/create_account_button"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginStart="@dimen/content_margin"
                android:layout_marginTop="40dp"
                android:layout_marginEnd="@dimen/content_margin"
                android:background="@drawable/bg_login_button"
                android:fontFamily="@font/proxima_nova_regular"
                android:lineSpacingExtra="4sp"
                android:text="@string/create_account_button"
                android:textAllCaps="true"
                android:textColor="@color/white"
                android:textSize="18sp" />

            <View
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1" />

            <FrameLayout
                android:id="@+id/terms"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:background="@drawable/text_view_button_selector"
                android:layout_marginBottom="@dimen/default_margin"
                android:padding="@dimen/default_margin_half">

                <TextView
                    style="@style/ProximaNova14Pt"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/view_terms_and_conditions" />

            </FrameLayout>

            <View
                android:id="@+id/stub"
                android:layout_width="match_parent"
                android:layout_height="56dp"
                android:visibility="gone" />

        </LinearLayout>

    </androidx.core.widget.NestedScrollView>

</LinearLayout>

</FrameLayout>

Here's an except from the manifest:

<activity
        android:name=".view.EntranceActivity"
        android:configChanges="orientation"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.Launcher"
        android:windowSoftInputMode="adjustResize|stateAlwaysHidden" />

And the Activity that host the fragment:

@Layout(R.layout.activity_entrance)

public class EntranceActivity extends BaseActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    router.newRootScreen(new Screens.LoginScreen());
}

@Override
protected void callInjections() {
    injection().inject(this);
}

Solution

  • After I removed this line from the activity that host the fragment, it works:

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    

    This was setting the fullscreen mode, and thus prevent adjustResize from working