Складная панель инструментов: установите, насколько должна быть свернута панель инструментов в onCreate.

Я создаю приложение ListView и соответствующее ему приложение DetailView. В моем ListView есть элементы, при нажатии на которые пользователь попадает в DetailViewActivity.

На DetailViewActivity я реализовал складную панель инструментов. Теперь каждый раз, когда открывается DetailViewActivity, другое изображение (с разными размерами) устанавливается на ImageView на складной панели инструментов.

Я хочу, чтобы Toolbar по умолчанию был открыт до определенной высоты (скажем, 256dp), но если высота изображения больше этой, пользователь должен иметь возможность потянуть вниз, чтобы просмотреть остальную часть изображения. (точно так же, как WhatsApp)

Мне удалось программно установить высоту Toolbar каждый раз, когда я открываю активность, но проблема в том, что Toolbar всегда полностью расширяется. Поэтому, если изображение больше, панель инструментов по умолчанию очень большая. Я хочу, чтобы он был свернут до 256dp независимо от высоты изображения.


Код для моего макета:

<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">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/rootLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <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/collapsingToolbarLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:contentScrim="?attr/colorPrimary"
                app:expandedTitleMarginStart="@dimen/expanded_toolbar_title_margin_start"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">

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

                <View
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginTop="130dp"
                    android:background="@drawable/gradient_header_background"
                    app:layout_collapseMode="parallax"
                    app:layout_collapseParallaxMultiplier="0.1"/>

                <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"
                    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>


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

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


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

            <FrameLayout
                android:id="@+id/detail_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:ignore="MergeRootFrame"/>

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

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="12dp"
            android:orientation="vertical"
            app:layout_anchor="@+id/appbar"
            app:layout_anchorGravity="bottom">

            <View
                android:id="@+id/toolbar_shadow_transparent"
                android:layout_width="match_parent"
                android:layout_height="@dimen/toolbar_elevation"
                android:background="@color/transparent"/>

            <View
                android:id="@+id/toolbar_shadow"
                android:layout_width="match_parent"
                android:layout_height="@dimen/toolbar_elevation"
                android:background="@drawable/dropshadow"/>
        </LinearLayout>


        <com.github.clans.fab.FloatingActionButton
            android:id="@+id/action_edit"
            style="@style/MenuButtonsStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:src="@drawable/ic_edit"
            app:layout_anchor="@+id/appbar"
            app:layout_anchorGravity="bottom|right|end"/>

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

    <ImageView
        android:id="@+id/detail_back_arrow_land"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"/>

    <TextView
        android:id="@+id/course_name_textview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:visibility="gone"/>

</RelativeLayout>

И в своей деятельности я нашел высоту и установил ее на Toolbar следующим образом:

appBar = (AppBarLayout) findViewById(R.id.appbar);
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams();
lp.height = my_bitmap.getHeight();
DetailActivity.appBar.setLayoutParams(lp);
DetailActivity.mImageView.setImageBitmap(my_bitmap);

Прикрепляю скриншоты, чтобы было понятнее.

Именно такой высоты я хочу, чтобы моя панель инструментов была каждый раз при запуске действия: введите здесь описание изображения

И вот что я получаю из своего кода:

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

Теперь я мог бы жестко задать высоту 256 dp в коде, но тогда пользователь не сможет прокрутить вниз, чтобы увидеть остальную часть изображения. Пожалуйста, предложите.

Благодарю за ваш ответ. Любой ответ может заставить меня начать


person Rachit    schedule 21.09.2015    source источник
comment
красивая клавиатура)   -  person    schedule 07.06.2017


Ответы (1)


Наконец-то придумал решение. Как только я получил новое изображение, я передал свой Bitmap в качестве параметра моему методу expandToolbar(). Параметр heightDp указывает начальный scrolledHeight представления. Я получил идею от https://stackoverflow.com/a/30747281/3286614, благодаря Tuấn Trần Anh

public static void expandToolbar(Bitmap bmp, int heightDp) {
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams();
    AppBarLayout.Behavior behavior = new AppBarLayout.Behavior();
    behavior.setTopAndBottomOffset(0);
    behavior.onNestedPreScroll(rootLayout, appBar, null, 0, bmp.getHeight() - heightDp, new int[2]);
    params.setBehavior(behavior);
    DetailActivity.appBar.setLayoutParams(params);
}

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

person Rachit    schedule 23.09.2015
comment
Большое спасибо, есть ли библиотека, которая делает то же самое? Я бы использовал это. - person Skizo-ozᴉʞS; 23.09.2015
comment
Не нашла, отчаянно искала. - person Rachit; 23.09.2015
comment
О блин :(! ну с вашим кодом попробую разобраться как это сделать - person Skizo-ozᴉʞS; 23.09.2015
comment
Вы говорите 512dp, но 512 в вашем коде относится к pixels, и разница может быть огромной. - person natario; 25.09.2015
comment
Вы правы.. но я создал метод, который преобразует пиксели в dp.. так что разницы нет.. Если вам нужен этот метод, дайте мне знать, я опубликую его здесь - person Rachit; 25.09.2015