CollapsingToolbarLayout崩溃CollapsingToolbarLayout

2023-09-07 00:18:03 作者:我六毛你六毛咱俩一块二

我有触发CollapsingToolbarLayout一个RecyclerView,当我尝试并重新打开4.2.2倒塌的工具栏,我得到下面的崩溃。任何想法?

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)

更新:

它看起来像在使碰撞仅检查是否任一的高度或宽度大于0库中的方法 - 但位图需要同时为> 0

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);
            }

        }
    }
}

下面是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>

我申请了一个错误:崩溃在设计支持库 - CollapsingTextHelper类 - !但如果有人在此期间的修复,我会非常感激。

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!

推荐答案

我发现了原因。在XML的CollapsingToolbarLayout我设置:

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

app:expandedTitleTextAppearance="@style/TransparentText"

和的风格是:

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

因此​​,它只会显示的文本时工具栏是崩溃了。

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

原来,为expandedTitleTextAppearance和collapsedTitleTextAppearance样式需要专门从TextAppearance继承。所以这种风格正常工作:

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

更新(2015年7月20日):此错误似乎固定在设计支持库v22.2.1(https://$c$c.google.com/p/android/issues/detail?id=178674)

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)