CollapsingToolbarLayout在4.4设备上崩溃(java.lang.IllegalArgumentException: radius must be > 0)

14
我已经实现了新样式的可折叠工具栏。我正在使用与示例(Cheesesquare)演示应用程序相同的代码-当然,在所有设备上都可以正常工作。我需要帮助弄清楚我与示例有什么不同(所以我的应用程序不会崩溃)。
我的应用程序在5.0+设备上运行良好,但在旧设备(OS 4.4.4)上崩溃,并显示一个错误,我无法将其隔离到我的代码中(堆栈中没有对我的项目类的引用)。对我来说似乎很奇怪,这是设备特定的(如果这是代码错误,它将在任何地方崩溃)
我已经尝试过以下操作,但没有帮助: - 查看我所有的XML和Java,确保我没有将0设置为任何视图的任何维度 - 确保我没有在任何地方设置填充 - 删除了所有边距(只是为了检查-没有帮助,添加回来) - 删除所有的setBackground()方法(没有帮助) - 删除所有高程和半径属性 - 将所有CardView设置为Visibility.GONE(即使所有CardView都没有被绘制,仍会崩溃)
这个崩溃来自AOSP中的一个类:https://android.googlesource.com/platform/frameworks/support/+/master/v7/cardview/eclair-mr1/android/support/v7/widget/RoundRectDrawableWithShadow.java 我看到了一个相关的已打开的Bug(但未被分配):https://code.google.com/p/android/issues/detail?id=157919有趣的是,这个bug说明这在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

我的活动:

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的样式.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">

如果您从CardViews中删除边距,是否仍会出现崩溃? - Marko
去掉边距并没有帮助 - 实际上我使用了样式,所以很容易在一个地方添加/删除它。 我更新了我的代码(并在此处包含了它),以确保我普遍地使用CardView。 从中删除margin属性没有任何区别。 奇怪的是,这个相同的卡片样式在之前的活动中有效。 真可惜。 - Booger
我将再次仔细检查代码 - 另外,奇怪的是这只发生在4.4设备上(如果真的有错误的边距或填充 - 我认为它会在任何地方崩溃)...感谢您的帮助! - Booger
我需要帮助弄清楚我和示例的不同之处(以便我的应用程序不会崩溃)。你尝试过什么调试方法?逐步实现代码,直到找到导致错误的那一部分。 - Jared Burrows
啊!我本来希望支持库的22.2.1版本能够解决这个问题,但它并没有。不过我已经找到了一个解决方法,并详细记录了这个问题,希望下一个版本能够修复它。 - Booger
显示剩余2条评论
5个回答

5

在你的堆栈错误中,有一件事引起了我的注意。似乎在4.4及以下版本中,你的应用程序试图绘制一个大于实际手机宽度的GUI。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));
}

这是radialgradient类的一部分。如果您可以这样做,一种强制运行代码的方法是简单地编辑radialgradient类(Android Studio有一种方法可以这样做)。
我对这个问题的解决方案是首先浏览您的xml文件并开始删除不常见/没有意义的代码行。例如:
android:fitsSystemWindows="true"

fitSystemWindow 多次调用

还有一个需要避免的事情是,在线性布局中使用 weightsum 和 weight 标签。尝试将父部件改为 RelativeLayout。

编辑:

经过一段时间的思考(只需2分钟),我意识到错误可能仅仅是由 styles.xml 实现引起的。你确定你复制了 git 存储库中看到的所有文件夹吗?

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

所以,如果您没有 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>


我已经删除了所有的“android:fitsSystemWindows =”true“,但是这没有任何效果 - 这些属性是从“Cheesesquare”复制过来的,所以我认为那不是问题所在。我删除了加权线性布局(visibility =“gone”,也许我需要真正地将其删除)- 但没有效果。我会继续尝试,非常感谢您的帮助。 - Booger
@Booger你好,请检查一下我的修改是否解决了你的问题,你可能需要为4.4.x及以下版本创建一个单独的文件夹系统。 - Tobi Akerele
非常感谢您的额外建议,但那并没有帮助到我(我已经添加了一个themes.xml文件的V21文件夹,并添加了新的styles.xml)。我会再次检查Cheesesquare实现,因为我没有复制所有这些样式和主题的实现。这是一个很好的建议。 - Booger
感谢您的帮助(享受您的奖励;-))。我将从头开始使用空Activity,然后逐个添加所有视图。当我调试时,我发现在AsyncTask的doInBackground(String... params)方法中抛出了此错误,该方法获取要在视图上使用的数据(它仍然抛出与GradientDrawable相关的相同堆栈)。这肯定是一个奇怪的问题,当我最终弄清楚时,我会回报的。 - Booger
@Booger 谢谢你,我希望我能提供更多帮助,希望你能得到你想要的结果。还有,感谢你的赏金。 - Tobi Akerele

3

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

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

事后看来,我通过使用常见名称导致了退化现象。


1
我遇到了同样的问题,发现我的cardview属性中有app:cardCornerRadius="0dp"。当我将其删除后,问题得到解决。希望这能帮到你。

1
根据CardView的文档
在L版本之前,CardView会向其内容添加填充并在该区域绘制阴影。此填充量等于侧面上的maxCardElevation + (1 - cos45) * cornerRadius,以及顶部和底部上的maxCardElevation * 1.5 + (1 - cos45) * cornerRadius。
由于填充用于抵消阴影的内容,因此无法在CardView上设置填充。而是可以在XML中使用内容填充属性或在代码中使用setContentPadding(int, int, int, int)来设置Card的边缘与CardView的子元素之间的填充。
检查所有wrap-parent值。我认为您的代码中某处更改了此填充行为,导致RoundRectDrawableWithShadow.java中的buildShadowCorners方法中出现mCornerRadius <0。
这些链接可能有所帮助:

宽度和高度必须大于0的错误

Android CardView的填充和最小高度

RecyclerView中的CardView具有额外的边距


非常感谢,我已经仔细检查了所有的布局属性,并没有发现任何奇怪的问题(每个地方都是wrap_content)。XML 中我没有添加任何额外的 padding(现在正在检查 Java 代码)。非常感谢 SO 的链接! - Booger

1
我有一个适配器,其中的主容器是卡片视图,并且我将 cardCornerRadius 设置为 0:
app:cardCornerRadius="0dp"

我把它改成了:

app:cardCornerRadius="1dp"

现在它完美地工作了。

我也测试了使用和不使用android:fitsSystemWindows="true",对我来说没有任何变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接