CollapsingToolbarLayout не рушится, когда EditText фокусируется

Я использую CollapsingToolBar внутри CoordinatorLayout, и у меня есть NestScrollView, содержащий некоторые EditText в качестве дочерних представлений. Я сталкиваюсь с тем, что когда edittext фокусируется, а клавиатура появляется, мой полный вид не прокручивается вверх.

Ниже приведен код и изображение в качестве вывода этого макета.

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/app_bar_height"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:contentScrim="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">


        <ImageView
            android:id="@+id/ivProductImage"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:src="@drawable/stub_image"
            app:layout_collapseParallaxMultiplier="0.7"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

<android.support.v4.widget.NestedScrollView
    android:id="@+id/nested_scroll_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:id="@+id/containerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp">

            <EditText
                android:id="@+id/etProductTitle"
                style="@style/EditTextStyle"
                android:hint="@string/lbl_product_title"
                android:inputType="text"
                android:textSize="24dp" />
        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp">

            <EditText
                android:id="@+id/etProductDescription"
                style="@style/EditTextStyle"
                android:hint="@string/lbl_description"
                android:inputType="text" />
        </android.support.design.widget.TextInputLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <android.support.design.widget.TextInputLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_weight="0.5">

                <EditText
                    android:id="@+id/etDeposit"
                    style="@style/EditTextStyle"
                    android:hint="@string/lbl_deposit"
                    android:inputType="number" />
            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_weight="0.5">

                <EditText
                    android:id="@+id/etPricePerDay"
                    style="@style/EditTextStyle"
                    android:hint="@string/lbl_price_per_day"
                    android:inputType="number" />
            </android.support.design.widget.TextInputLayout>
        </LinearLayout>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp">

            <EditText
                android:id="@+id/etLocation"
                style="@style/EditTextStyle"
                android:hint="@string/lbl_add_location"
                android:inputType="text" />
        </android.support.design.widget.TextInputLayout>

        <TextView
            style="@style/SubHeading"
            android:layout_margin="10dp"
            android:text="@string/lbl_categories"
            android:textColor="@color/color_primary" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="315dp"
            android:layout_marginLeft="10dp"
            android:isScrollContainer="false"
            android:layout_marginRight="10dp"
            android:scrollbars="none" />

    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

введите описание изображения здесь


comment
Привет, у меня такая же проблема, ты решил ее?   -  person streamride    schedule 08.12.2015
comment
Я использовал RecyclerView внутри NestedScrollView, удалив RecyclerView, решил мою проблему.   -  person Nauman Zubair    schedule 09.12.2015


Ответы (3)


Я решил это, добавив OnFocusChangeListener к EditText, и если он имеет фокус, просто сверните вид с помощью метода setExpanded:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(final View v, boolean hasFocus) {
        if (hasFocus) {
           mAppBarLayout.setExpanded(false, true);
        }
    }
});

Если вы хотите, чтобы ваш CollapsingToolbarLayout сворачивался каждый раз, когда ваши другие EditText из вашего макета фокусируются, вам следует установить один и тот же OnFocusChangeListener для каждого из них.

person romtsn    schedule 24.01.2016
comment
Это кажется лучшим решением, но проще свернуть CollapsingToolbarLayout с помощью mAppBarLayout.setExpanded(false). - person TR4Android; 27.01.2016
comment
Причина, по которой я не использовал метод setExpanded, заключается в том, что этот метод появился только в v23 версии библиотеки дизайна, а я реализовал его раньше. - person romtsn; 29.01.2016

RecyclerView — виджет с прокруткой, что означает, что эти виджеты с прокруткой не будут работать друг с другом. (Но, RecyclerView является дочерним элементом NestedScrollingChild)

Проверьте этот вопрос для получения дополнительных объяснений:

Как использовать RecyclerView внутри NestedScrollView?

Но вы можете использовать его с настраиваемыми LinearLayoutManager

https://stackoverflow.com/a/32736113/4409113


Кстати,

Вы можете использовать этот RecyclerView внутри CoordinatorLayout и снаружи NestedScrollView.

Надеюсь, это поможет.

person ʍѳђઽ૯ท    schedule 22.01.2016

Я думаю, что после всех исследований это лучшее решение

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(final View v, boolean hasFocus) {
    if (hasFocus) {
        mAppBarLayout.setExpanded(false, true); // second one for animation
    }
}
});
person Drake    schedule 28.01.2016