CollapsingToolbarLayout 在 4.4 设备上崩溃(java.lang.IllegalArgumentException:半径必须 > 0)

CollapsingToolbarLayout crash on 4.4 devices (java.lang.IllegalArgumentException: radius must be > 0)

我已经实现了新样式的可折叠工具栏。我使用与示例 (Cheesesquare) 演示应用程序相同的代码——当然它在所有设备上都可以正常工作。我需要帮助弄清楚我所做的与示例不同的地方(这样我的应用程序就不会崩溃)。

我的应用程序在 5.0+ 设备上运行良好,但在旧设备 (OS 4.4.4) 上崩溃并出现我无法隔离到我的代码的错误(没有引用我的项目的 classes 在堆栈中)。 我觉得很奇怪,这是设备特定的(如果这是一个代码错误,它会到处崩溃)

我有(尝试过,但没有帮助):

崩溃来自 AOSP 中的 class:https://android.googlesource.com/platform/frameworks/support/+/master/v7/cardview/eclair-mr1/android/support/v7/widget/RoundRectDrawableWithShadow.java

我看到一个相关的错误已打开(但未分配):https://code.google.com/p/android/issues/detail?id=157919 有趣的是,这个错误指出 不会 在 4.3 上崩溃,但我手边没有那个设备。

有关如何调试此崩溃原因的建议?:

E/AndroidRuntime(  708): java.lang.IllegalArgumentException: radius must be > 0
E/AndroidRuntime(  708):    at android.graphics.RadialGradient.<init>(RadialGradient.java:53)
E/AndroidRuntime(  708):    at android.support.v7.widget.RoundRectDrawableWithShadow.buildShadowCorners(RoundRectDrawableWithShadow.java:285)
E/AndroidRuntime(  708):    at android.support.v7.widget.RoundRectDrawableWithShadow.buildComponents(RoundRectDrawableWithShadow.java:307)
E/AndroidRuntime(  708):    at android.support.v7.widget.RoundRectDrawableWithShadow.draw(RoundRectDrawableWithShadow.java:209)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15493)
E/AndroidRuntime(  708):    at android.widget.FrameLayout.draw(FrameLayout.java:472)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14402)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15222)
E/AndroidRuntime(  708):    at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime(  708):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15222)
E/AndroidRuntime(  708):    at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime(  708):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15511)
E/AndroidRuntime(  708):    at android.widget.FrameLayout.draw(FrameLayout.java:472)
E/AndroidRuntime(  708):    at android.support.v4.widget.NestedScrollView.draw(NestedScrollView.java:1679)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14402)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15222)
E/AndroidRuntime(  708):    at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime(  708):    at android.support.design.widget.CoordinatorLayout.drawChild(CoordinatorLayout.java:1040)
E/AndroidRuntime(  708):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15222)
E/AndroidRuntime(  708):    at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime(  708):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15511)
E/AndroidRuntime(  708):    at android.widget.FrameLayout.draw(FrameLayout.java:472)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14402)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15222)
E/AndroidRuntime(  708):    at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime(  708):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15222)
E/AndroidRuntime(  708):    at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime(  708):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15222)
E/AndroidRuntime(  708):    at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime(  708):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14397)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15222)
E/AndroidRuntime(  708):    at android.view.ViewGroup.drawChild(ViewGroup.java:3340)
E/AndroidRuntime(  708):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3176)
E/AndroidRuntime(  708):    at android.view.View.draw(View.java:15511)
E/AndroidRuntime(  708):    at android.widget.FrameLayout.draw(FrameLayout.java:472)
E/AndroidRuntime(  708):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2623)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14402)
E/AndroidRuntime(  708):    at android.view.View.getDisplayList(View.java:14444)
E/AndroidRuntime(  708):    at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1597)
E/AndroidRuntime(  708):    at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1469)
E/AndroidRuntime(  708):    at android.view.ViewRootImpl.draw(ViewRootImpl.java:2800)
E/AndroidRuntime(  708):    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2666)
E/AndroidRuntime(  708):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2234)
E/AndroidRuntime(  708):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1267)
E/AndroidRuntime(  708):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6638)
E/AndroidRuntime(  708):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813)
E/AndroidRuntime(  708):    at android.view.Choreogra

我的activity:

public class PaymentActivity extends AppCompatActivity {
    public static final String XTRA_DEVICENAME = "";
    private static String deviceName;
    private ItemDto deviceDto;
    private Activity mActivity;

    private OkHttpClient okclient;

    //Views
    private RelativeLayout infoLayout;
    private TextView deviceOwner;
    private TextView devicePrice;
    private TextView deviceInfo;
    private TextView payDurationTitle;
    private TextView payPriceTitle;
    private TextView payDurationText;
    private TextView payPriceText;
    private Button upBtn;
    private Button downBtn;
    private TextView incText;
    private View incrDivider;
    private FloatingActionButton fab;
    private ProgressBar devInfoProgress;
    private LinearLayout incrBtnView;

    private int mIterVal = 1;

    private Constants.ColorInfo colorTheme = Constants.ColorInfo.GREY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity = this;

        Intent intent = getIntent();
        deviceName = intent.getStringExtra(XTRA_DEVICENAME);

        setTheme(ColorUtil.getThemeForDevice(deviceName));
        colorTheme = ColorUtil.getColorTheme(deviceName);
        setContentView(R.layout.act_payment);

        final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });

        okclient = new OkHttpClient();

        CollapsingToolbarLayout collapsingToolbar =
                (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
        collapsingToolbar.setTitle(deviceName.toUpperCase());

        okclient = new OkHttpClient();

        final ImageView imageView = (ImageView) findViewById(R.id.backdrop);
        // todo get better default image
        final String paymentIconUrl = "http://xxx/" + deviceName + "_lg.png";

        Glide.with(mActivity)
                .load(paymentIconUrl)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .placeholder(R.drawable.ic_logo_allwhite)
                .error(R.drawable.ic_logo_allwhite)
                .into(imageView);

        setupViews();
        new GetItemInfoTask().execute(deviceName);
    }

    private void setupViews() {
        infoLayout = (RelativeLayout) findViewById(R.id.device_info_layout);
        infoLayout.setBackgroundColor(getResources().getColor(ColorUtil.getDeviceColor(deviceName, ColorUtil.COLOR_SECONDARY)));

        incrBtnView = (LinearLayout) findViewById(R.id.incr_btn_view);
        deviceOwner = (TextView) findViewById(R.id.info_owner);
        devicePrice = (TextView) findViewById(R.id.info_price);
        deviceInfo = (TextView) findViewById(R.id.info_max_amount);
        payDurationTitle = (TextView) findViewById(R.id.paidDurationTitle);
        payPriceTitle = (TextView) findViewById(R.id.paidAmountTitle);
        payDurationText = (TextView) findViewById(R.id.paidDurationText);
        payPriceText = (TextView) findViewById(R.id.paidAmountText);

        devInfoProgress = (ProgressBar) findViewById(R.id.devinfo_progress);
        devInfoProgress.getIndeterminateDrawable().setColorFilter(getResources().getColor(R.color.card_white), android.graphics.PorterDuff.Mode.MULTIPLY);

        Drawable tmpDrawable = ColorUtil.getTintedDrawable(mActivity, R.drawable.ic_attach_money, colorTheme.getSecondary());
        payPriceTitle.setCompoundDrawablesWithIntrinsicBounds(tmpDrawable, null, null, null);

        Drawable tmpDrawable2 = ColorUtil.getTintedDrawable(mActivity, R.drawable.ic_clock, colorTheme.getSecondary());
        payDurationTitle.setCompoundDrawablesWithIntrinsicBounds(tmpDrawable2, null, null, null);

        upBtn = (Button) findViewById(R.id.pay_inc_up_btn);
        downBtn = (Button) findViewById(R.id.pay_inc_down_btn);
        incText = (TextView) findViewById(R.id.pay_inc_text);
        incrDivider = (View) findViewById(R.id.iter_divider);

        upBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                ...
            }
        });
        downBtn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                ...
            }
        });

        upBtn.setBackground(mActivity.getResources().getDrawable(colorTheme.getSelectorId()));
        downBtn.setBackground(mActivity.getResources().getDrawable(colorTheme.getSelectorId()));

        fab = (FloatingActionButton) findViewById((R.id.pay_fab_btn));
        //TODO - manually coloring FAB, should do with color state list
        fab.setEnabled(false);
        fab.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.grey_300)));

        fab.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                fab.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.card_white)));
                ...

            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_payment, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    private class GetItemInfoTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            ...

            return null;
        }

        @Override
        protected void onPostExecute(String result) {
        ...

        }

        @Override
        protected void onPreExecute() {
            devInfoProgress.setVisibility(View.VISIBLE);
        }

        @Override
        protected void onProgressUpdate(Void... values) {

        }
    }

}

我的Layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/tools"
    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/payments_backdrop_height"
        android:fitsSystemWindows="true"
        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"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                android:scaleType="centerCrop"
                android:transitionName="device_img"
                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:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/grey_200"
            android:orientation="vertical">

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

                <TextView
                    android:id="@+id/info_owner"
                    style="@style/DeviceInfo" />

                <TextView
                    android:id="@+id/info_price"
                    style="@style/DeviceInfo"
                    android:layout_below="@+id/info_owner"/>

                <TextView
                    android:id="@+id/info_max_amount"
                    style="@style/DeviceInfo"
                    android:layout_below="@+id/info_price"
                    android:layout_marginBottom="@dimen/grid1" />

                <ProgressBar
                    android:id="@+id/devinfo_progress"
                    style="?android:attr/progressBarStyleLarge"
                    android:layout_width="@dimen/rythm48"
                    android:layout_height="@dimen/rythm48"
                    android:layout_toRightOf="@+id/info_price"
                    android:layout_marginRight="@dimen/grid5"
                    android:layout_marginTop="@dimen/grid1"
                    android:visibility="gone" />

           </RelativeLayout>

            <android.support.v7.widget.CardView
                android:id="@+id/device_info_card"
                style="@style/CardView"
                card_view:cardCornerRadius="4dp"
                card_view:cardElevation="6dp">

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

                    <TextView
                        android:id="@+id/launch_title"
                        style="@style/CardTitle"
                        android:text="Current Amounts" />

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_below="@+id/confirm_text"
                        android:layout_marginBottom="@dimen/grid5"
                        android:orientation="horizontal"
                        android:weightSum="2">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_weight="1"
                            android:gravity="center"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/paidAmountTitle"
                                style="@style/TextAppearance.AppCompat.Medium"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:drawableLeft="@drawable/ic_dollar"
                                android:gravity="center"
                                android:text="@string/paid_amount_title" />

                            <TextView
                                android:id="@+id/paidAmountText"
                                style="@style/TextAppearance.AppCompat.Headline"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_weight="1"
                            android:gravity="center"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/paidDurationTitle"
                                style="@style/TextAppearance.AppCompat.Medium"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:drawableLeft="@drawable/ic_clock"
                                android:gravity="center"
                                android:text="@string/paid_duration_title" />

                            <TextView
                                android:id="@+id/paidDurationText"
                                style="@style/TextAppearance.AppCompat.Headline"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content" />

                        </LinearLayout>
                    </LinearLayout>

                    <View
                        android:id="@+id/iter_divider"
                        android:layout_width="wrap_content"
                        android:layout_height="1dp"
                        android:layout_marginBottom="@dimen/grid2"
                        android:layout_marginTop="@dimen/grid_5"
                        android:background="@color/grey_400"
                        android:visibility="gone"/>

                    <LinearLayout
                        android:id="@+id/incr_btn_view"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="@dimen/grid5"
                        android:layout_marginLeft="@dimen/grid4"
                        android:layout_marginRight="@dimen/grid4"
                        android:orientation="horizontal"
                        android:gravity="center"
                        android:weightSum="3"
                        android:visibility="gone">

                        <Button
                            android:id="@+id/pay_inc_down_btn"
                            style="@style/InfoButton"
                            android:layout_width="@dimen/rythm48"
                            android:layout_height="@dimen/rythm48"
                            android:text="-"
                            android:textSize="32sp"
                            android:layout_weight="1"/>

                        <TextView
                            android:id="@+id/pay_inc_text"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="1"
                            android:gravity="center"
                            android:layout_marginRight="@dimen/grid2"
                            android:layout_marginLeft="@dimen/grid2"
                            android:textSize="24sp"
                            android:layout_weight="1"/>

                        <Button
                            android:id="@+id/pay_inc_up_btn"
                            style="@style/InfoButton"
                            android:layout_width="@dimen/rythm48"
                            android:layout_height="@dimen/rythm48"
                            android:text="+"
                            android:textSize="32sp"
                            android:layout_weight="1"/>

                    </LinearLayout>
                </LinearLayout>

            </android.support.v7.widget.CardView>

            <android.support.v7.widget.CardView
                android:id="@+id/provider_card_view"
                style="@style/CardView"
                card_view:cardCornerRadius="4dp"
                card_view:cardElevation="6dp">

                <fragment
                    android:id="@+id/provider_fragment"
                    android:name="com.cleartoken.pay.ui.frag.ProviderFragment"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />

            </android.support.v7.widget.CardView>

            <android.support.v7.widget.CardView
                style="@style/CardView"
                card_view:cardCornerRadius="4dp"
                card_view:cardElevation="6dp">

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

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Info"
                        android:textAppearance="@style/TextAppearance.AppCompat.Title" />

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="@string/long_text" />
                </LinearLayout>
            </android.support.v7.widget.CardView>
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/pay_fab_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/grid2"
        android:clickable="true"
        android:src="@drawable/ic_fab_enabled"
        app:borderWidth="0dp"
        app:layout_anchor="@id/device_info_card"
        app:layout_anchorGravity="bottom|right|end" />

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

CardView style.xml 片段:

<style name="CardView">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_gravity">center</item>
    <item name="android:layout_margin">@dimen/grid1</item>
</style>

注:

我普遍使用相同的卡片样式。在 Act#1 这有效*(最大的不同在于 Act#1 没有协调器布局)。

我的名片XML普遍是这样的:

 <android.support.v7.widget.CardView
            android:id="@+id/device_info_card"
            style="@style/CardView"
            card_view:cardCornerRadius="4dp"
            card_view:cardElevation="6dp">

根据CardView's Doc

Before L, CardView adds padding to its content and draws shadows to that area. This padding amount is equal to maxCardElevation + (1 - cos45) * cornerRadius on the sides and maxCardElevation * 1.5 + (1 - cos45) * cornerRadius on top and bottom.

Since padding is used to offset content for shadows, you cannot set padding on CardView. Instead, you can use content padding attributes in XML or setContentPadding(int, int, int, int) in code to set the padding between the edges of the Card and children of CardView.

检查所有 wrap-parent 值。我认为您代码中的某些地方正在改变这种填充行为,这导致 mCornerRadius < 0 in buildShadowCorners 方法 in RoundRectDrawableWithShadow.java.

这些链接可能有帮助:

width and height must be > 0 error

Android CardView padding and minHeight

CardView inside RecyclerView has extra margins

在您的堆栈错误中,有一件事让我印象深刻。似乎在 4.4 及以下版本中,您的应用正在尝试绘制大于实际 phone 宽度的图形用户界面。 RadialGradient 错误对我来说没有意义,因为它应该大于屏幕尺寸而不是小于零。

/** Create a shader that draws a radial gradient given the center and radius.
    @param centerX  The x-coordinate of the center of the radius
    @param centerY  The y-coordinate of the center of the radius
    @param radius   Must be positive. The radius of the circle for this gradient.
    @param colors   The colors to be distributed between the center and edge of the circle
    @param stops    May be <code>null</code>. Valid values are between <code>0.0f</code> and
                    <code>1.0f</code>. The relative position of each corresponding color in
                    the colors array. If <code>null</code>, colors are distributed evenly
                    between the center and edge of the circle.
    @param tileMode The Shader tiling mode
*/
public RadialGradient(float centerX, float centerY, float radius,
           @NonNull int colors[], @Nullable float stops[], @NonNull TileMode tileMode) {
    if (radius <= 0) {
        throw new IllegalArgumentException("radius must be > 0");
    }
    if (colors.length < 2) {
        throw new IllegalArgumentException("needs >= 2 number of colors");
    }
    if (stops != null && colors.length != stops.length) {
        throw new IllegalArgumentException("color and position arrays must be of equal length");
    }
    mType = TYPE_COLORS_AND_POSITIONS;
    mX = centerX;
    mY = centerY;
    mRadius = radius;
    mColors = colors;
    mPositions = stops;
    mTileMode = tileMode;
    init(nativeCreate1(centerX, centerY, radius, colors, stops, tileMode.nativeInt));
}

这是径向渐变 class 的片段。将代码强制为 运行 的一种方法是简单地编辑径向梯度 class 如果可以的话(Android Studio 有办法做到这一点)。

我对这个问题的解决方案是首先检查您的 xml 文件并开始删除没有意义的代码行 common/doesn。喜欢:

android:fitsSystemWindows="true"

您还应该避免的另一件事是线性布局的 weightsum 和 weight 标签。并尝试将您的父小部件设为 RelativeLayout。

编辑:

思考了一会儿(仅 2 分钟)后,我意识到错误可能只是由于 styles.xml 实施造成的。您确定复制了在 git 存储库中看到的所有文件夹吗?

有时出现此错误,通常是因为 values-v21 文件夹未添加适当的 styles.xml。

因此,如果您没有 values-v21 文件夹,请执行以下操作: - 在res文件夹下创建一个values-v21文件夹。 -然后在values-v21文件夹下新建一个styles.xml文件夹,添加这段代码

<resources>

<style name="Theme.DesignDemo" parent="Base.Theme.DesignDemo">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

对于未来的人,我发现了我的问题 - 我使用的样式与框架使用的另一个样式同名 (CardView)。

我在 styles.xml 文件中将其名称更改为其他名称 (MyCardView),然后崩溃消失了。

事后看来,我使用那个通用名称导致了回归。

我有同样的问题,我发现我在 cardview 属性上有 app:cardCornerRadius="0dp"。当我删除它时,我的问题就解决了。希望这有帮助

我有一个带有项目主容器作为 cardview 的适配器,我将 cardCornerRadius 设置为 0 :

app:cardCornerRadius="0dp"

我将其更改为:

app:cardCornerRadius="1dp"

现在效果很好。

我也测试了使用和不使用 android:fitsSystemWindows="true" ,它 NOT 对我没有任何改变。