bkurzius
bkurzius

Reputation: 4068

CollapsingToolbarLayout crash

I have a RecyclerView that triggers a CollapsingToolbarLayout and when I try and reopen the collapsed toolbar on 4.2.2 I get the crash below. Any ideas?

java.lang.IllegalArgumentException: width and height must be > 0
        at android.graphics.Bitmap.createBitmap(Bitmap.java:638)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:620)
        at android.support.design.widget.CollapsingTextHelper.ensureExpandedTexture(CollapsingTextHelper.java:405)
        at android.support.design.widget.CollapsingTextHelper.setInterpolatedTextSize(CollapsingTextHelper.java:382)
        at android.support.design.widget.CollapsingTextHelper.calculateOffsets(CollapsingTextHelper.java:227)
        at android.support.design.widget.CollapsingTextHelper.setExpansionFraction(CollapsingTextHelper.java:203)
        at android.support.design.widget.CollapsingToolbarLayout$OffsetUpdateListener.onOffsetChanged(CollapsingToolbarLayout.java:754)
        at android.support.design.widget.AppBarLayout$Behavior.dispatchOffsetUpdates(AppBarLayout.java:851)
        at android.support.design.widget.AppBarLayout$Behavior.setAppBarTopBottomOffset(AppBarLayout.java:834)
        at android.support.design.widget.AppBarLayout$Behavior.scroll(AppBarLayout.java:793)
        at android.support.design.widget.AppBarLayout$Behavior.onNestedScroll(AppBarLayout.java:644)
        at android.support.design.widget.AppBarLayout$Behavior.onNestedScroll(AppBarLayout.java:583)
        at android.support.design.widget.CoordinatorLayout.onNestedScroll(CoordinatorLayout.java:1428)
        at android.support.v4.view.ViewParentCompat$ViewParentCompatStubImpl.onNestedScroll(ViewParentCompat.java:97)
        at android.support.v4.view.ViewParentCompat.onNestedScroll(ViewParentCompat.java:330)
        at android.support.v4.view.NestedScrollingChildHelper.dispatchNestedScroll(NestedScrollingChildHelper.java:162)
        at android.support.v7.widget.RecyclerView.dispatchNestedScroll(RecyclerView.java:8306)
        at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1387)
        at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2209)
        at android.view.View.dispatchTouchEvent(View.java:7127)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2170)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1905)

Update:

It looks like the method in the library that causes the crash is only checking if either the height or width is greater than 0 -- but a Bitmap requires both to be > 0:

private void ensureExpandedTexture() {
    if(this.mExpandedTitleTexture == null && !this.mExpandedBounds.isEmpty() && !TextUtils.isEmpty(this.mTextToDraw)) {
        this.mTextPaint.setTextSize(this.mExpandedTextSize);
        this.mTextPaint.setColor(this.mExpandedTextColor);
        int w = Math.round(this.mTextPaint.measureText(this.mTextToDraw, 0, this.mTextToDraw.length()));
        int h = Math.round(this.mTextPaint.descent() - this.mTextPaint.ascent());
        this.mTextWidth = (float)w;
        if(w > 0 || h > 0) {
            this.mExpandedTitleTexture = Bitmap.createBitmap(w, h, Config.ARGB_8888);
            Canvas c = new Canvas(this.mExpandedTitleTexture);
            c.drawText(this.mTextToDraw, 0, this.mTextToDraw.length(), 0.0F, (float)h - this.mTextPaint.descent(), this.mTextPaint);
            if(this.mTexturePaint == null) {
                this.mTexturePaint = new Paint();
                this.mTexturePaint.setAntiAlias(true);
                this.mTexturePaint.setFilterBitmap(true);
            }

        }
    }
}

Here is the xml:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                             xmlns:app="http://schemas.android.com/apk/res-auto"
                                             android:id="@+id/main_content"
                                             android:layout_width="match_parent"
                                             android:layout_height="match_parent"
                                             android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/series_detail_header_image_height"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:layout_scrollFlags="scroll|exitUntilCollapsed"
    android:fitsSystemWindows="true">

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

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:layout_collapseMode="parallax"
            >
            <ImageView
                android:id="@+id/image_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:background="?attr/colorPrimary"
                android:paddingLeft="20dp"
                android:paddingTop="10dp"
                android:paddingRight="10dp"
                android:layout_gravity="bottom"
                >
                <TextView
                    android:id="@+id/seriesDetailTitle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="American Pickers"
                    android:textColor="@android:color/white"
                    android:textSize="20sp"/>
                <TextView
                    android:id="@+id/seriesDetailTunein"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Tune in tuesdays at 8pm"
                    android:textColor="@android:color/white"
                    android:textSize="18sp"/>
                <LinearLayout
                    android:id="@+id/adFrame"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:paddingRight="@dimen/padding_small"
                    android:visibility="gone">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        android:layout_marginRight="@dimen/margin_minimal"
                        android:text="@string/show_detail_presented_by"
                        android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
                        android:textColor="@android:color/white"
                        android:textSize="10sp"
                        android:visibility="visible"/>

                    <FrameLayout
                        android:id="@+id/adView"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:visibility="visible"/>
                </LinearLayout>
            </LinearLayout>
        </FrameLayout>
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_collapseMode="pin"
            />
    </android.support.design.widget.CollapsingToolbarLayout>

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


<android.support.v4.view.ViewPager
    android:id="@+id/show_view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:paddingTop="@dimen/toolbar_height"
    />
<RelativeLayout android:id="@+id/controls"
                android:layout_width="match_parent"
                android:layout_height="@dimen/toolbar_height"
                android:background="@color/app_primary"
                app:layout_collapseMode="pin"
                android:layout_gravity="bottom"
                app:layout_anchor="@id/show_view_pager"
                app:layout_anchorGravity="top"
    >

    <Spinner
        android:id="@+id/season_spinner"
        android:layout_width="124dp"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="@dimen/series_detail_spinner_left_margin"
        android:prompt="@string/seasons"
        android:spinnerMode="dropdown"
        android:dropDownVerticalOffset="-48dp"
        android:dropDownWidth="124dp"
        android:background="@drawable/selector_spinner_selector_list"
        />

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:clipToPadding="false"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:tabMode="scrollable" />

</RelativeLayout>

I filed a bug: Crash in Design support library - CollapsingTextHelper class -- but if anyone has a fix in the meantime I'd be very grateful!

Upvotes: 2

Views: 1733

Answers (1)

bkurzius
bkurzius

Reputation: 4068

I've discovered the cause. In the xml for the CollapsingToolbarLayout I set:

app:expandedTitleTextAppearance="@style/TransparentText"

And the style was:

<style name="TransparentText">
    <item name="android:textColor">#00666666</item>
</style>

So that it would only show the text when the toolbar was collapsed.

Turns out that the styles for expandedTitleTextAppearance and collapsedTitleTextAppearance need to specifically inherit from TextAppearance. So this style works properly:

<style name="TransparentText" parent="@android:style/TextAppearance">
    <item name="android:textColor">#00666666</item>
</style>

Just a heads up for anyone else who makes the same mistake...

Update (7/20/2015): This bug appears to be fixed in v22.2.1 of the Design Support Library (https://code.google.com/p/android/issues/detail?id=178674)

Upvotes: 9

Related Questions