Сбой CollapsingToolbarLayout на устройствах 4.4 (java.lang.IllegalArgumentException: радиус должен быть > 0)

Я реализовал новый стиль Складная панель инструментов. Я использую тот же код, что и в примере демо-приложения (Cheesesquare), которое, конечно же, отлично работает на всех устройствах. Мне нужна помощь, чтобы понять, что я делаю иначе, чем образец (чтобы мое приложение не зависло).

Мое приложение отлично работает на устройствах 5.0+, но падает на более старых устройствах (OS 4.4.4) с ошибкой, которую я не могу изолировать в своем коде (нет ссылок на классы моего проекта в стеке). Мне кажется таким странным, что это зависит от конкретного устройства (если бы это была ошибка кода, он бы вылетал везде)

У меня (пробовал, но не помогло):

  • просмотрел все мои XML и Java, чтобы убедиться, что я не устанавливаю 0 как любое измерение в любом представлении
  • Убедитесь, что я нигде не устанавливаю отступы
  • Убраны ВСЕ поля (просто проверить - не помогло, добавил обратно)
  • Удалены все мои методы setBackground() (без помощи)
  • Удалены все атрибуты высоты и радиуса.
  • Установка ВСЕХ CardViews на Visibility.GONE (по-прежнему происходит сбой, даже если все CardViews не рисуются)

Сбой происходит из-за класса в AOSP: 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

Моя деятельность:

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) {

        }
    }

}

Мой макет.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>

Примечание:

Я использую этот же стиль карты повсеместно. В акте № 1 это работает * (большая разница в том, что в акте № 1 НЕТ макета координатора).

XML-код моей карты выглядит примерно так:

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

person Booger    schedule 01.07.2015    source источник
comment
Если вы удалите поля из ваших карточек, вы все равно получите сбой?   -  person Marko    schedule 10.07.2015
comment
Удаление полей не помогло - на самом деле я использую стиль, поэтому его легко добавить/удалить в одном месте. Я обновил свой код (и включил его сюда), чтобы гарантировать универсальное использование CardView. Удаление из него атрибута margin ничего не меняет. Что странно, так это то, что тот же самый стиль карты работает в предыдущем действии. Данг.   -  person Booger    schedule 10.07.2015
comment
Собираюсь снова прочесать код - также странно, что это только на устройствах 4.4 (если бы действительно были плохие поля или отступы - он бы вылетел везде, я думаю) ... спасибо за помощь!   -  person Booger    schedule 10.07.2015
comment
I need help figuring out what I am doing different then the sample (so my app won't crash). Что вы пробовали для отладки? Медленно внедряйте код, пока не найдете фрагмент, который его ломает.   -  person Jared Burrows    schedule 10.07.2015
comment
удалите setCompoundDrawablesWithIntrinsicBounds в вашем текстовом представлении внутри карточного представления и посмотрите, поможет ли это   -  person Elltz    schedule 13.07.2015
comment
Я определил, что это ошибка - я могу добавить ТОЛЬКО CardView к Activitiy, у которой есть складная панель инструментов, и произойдет сбой. Я хорошо задокументирую это и запишу ошибку Android в нужном месте. В моем коде нет ничего конкретного, что я могу изменить, чтобы исправить это (кроме полного удаления файла CardViews.   -  person Booger    schedule 17.07.2015
comment
Бу! Я надеялся, что выпуск 22.2.1 библиотеки поддержки исправит это, но это не так. Я нашел обходной путь и очень хорошо задокументировал эту проблему, так что, надеюсь, это будет исправлено в следующем выпуске.   -  person Booger    schedule 18.07.2015


Ответы (5)


Есть одна вещь, которая выделяется для меня в ваших ошибках стека. Похоже, что в версии 4.4 и ниже ваше приложение пытается отрисовать графический интерфейс, превышающий фактическую ширину телефона. Ошибка 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));
}

Это фрагмент из класса радиального градиента. Чтобы заставить код работать, нужно просто отредактировать класс радиального градиента, если вы можете это сделать (в Android Studio есть способ сделать это).

Мое решение этой проблемы состояло бы в том, чтобы сначала просмотреть ваш XML-файл и начать удалять строки кода, которые не являются общими/не имеют смысла. Нравиться:

android:fitsSystemWindows="true"

множественные вызовы fitSystemWindow

Также вам следует избегать тегов weightsum и weight для Linear Layout. И попробуйте сделать родительский виджет RelativeLayout.

РЕДАКТИРОВАТЬ:

Подумав некоторое время (всего 2 минуты), я понял, что ошибка может быть связана с реализацией styles.xml. Вы уверены, что скопировали все папки, которые видели в репозитории git?

Иногда, когда возникают эти ошибки, обычно это происходит из-за того, что в папку values-v21 не добавлен соответствующий файл styles.xml.

Итак, если у вас нет папки values-v21, сделайте следующее: -Создайте папку values-v21 в папке res. -Затем создайте папку styles.xml в папке values-v21 и добавьте этот код.

<resources>

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

person Tobi Akerele    schedule 14.07.2015
comment
Я удалил все android:fitsSystemWindows=true, но это не дало никакого эффекта - эти атрибуты скопированы из Cheesesquare, поэтому я не думал, что это будет так. Я удалил взвешенную линейную компоновку (видимость = исчезла, возможно, мне действительно нужно ее удалить) - безрезультатно. Я буду продолжать попытки, и большое спасибо за вашу помощь. - person Booger; 15.07.2015
comment
@Booger Эй, проверьте, решило ли мое редактирование вашу проблему, вам может потребоваться создать отдельную систему папок для 4.4.x и ниже или что-то в этом роде. - person Tobi Akerele; 15.07.2015
comment
Я очень ценю ваше дополнительное предложение, но это не помогло (я уже добавил папку V21 для файла themes.xml и добавил новый styles.xml). Я дважды проверю реализацию Cheesesquare, так как я не копировал все эти реализации стилей и тем. Это отличное предложение. - person Booger; 15.07.2015
comment
Спасибо за вашу помощь (наслаждайтесь щедростью ;-)). Я просто начну с нуля с пустой Activity, а затем добавлю обратно все свои представления по одному. Когда я отлаживаю, я вижу, что эта ошибка возникает во время метода doInBackground(String... params) AsyncTask, который получает данные для использования в представлениях (он все еще выдает тот же стек, относящийся к GradientDrawable). Это определенно странно, и я сообщу, когда наконец выясню это. - person Booger; 16.07.2015
comment
@Booger Спасибо за это, я хотел бы помочь больше, надеюсь, вы получите желаемый результат. И спасибо за щедрость - person Tobi Akerele; 17.07.2015

Для будущих людей я обнаружил свою проблему: стиль, который я использовал, имел то же имя, что и другой стиль, используемый фреймворком (CardView).

Я изменил это имя в файле styles.xml на другое (MyCardView), и сбой исчез.

Оглядываясь назад, я вызывал регрессию, используя это распространенное имя.

person Booger    schedule 04.08.2015

Согласно документу CardView:

Перед L CardView добавляет отступы к своему содержимому и рисует тени в этой области. Эта величина отступа равна maxCardElevation + (1 - cos45) * угловой радиус по бокам и maxCardElevation * 1,5 + (1 - cos45) * угловой радиус сверху и снизу.

Поскольку отступы используются для смещения содержимого для теней, вы не можете установить отступы в CardView. Вместо этого вы можете использовать атрибуты заполнения содержимого в XML или setContentPadding(int, int, int, int) в коде, чтобы установить заполнение между краями карты и дочерними элементами CardView.

Проверьте все значения wrap-parent. Я думаю, что где-то в вашем коде меняется это поведение заполнения, которое вызвало mCornerRadius < 0 в методе buildShadowCorners в RoundRectDrawableWithShadow.java.

Эти ссылки могут помочь:

ширина и высота должны быть> 0 ошибка

Отступ Android CardView и minHeight

CardView внутри RecyclerView имеет дополнительные поля

person BzH    schedule 10.07.2015
comment
Большое спасибо, я перепроверил все свои атрибуты макета, и в них нет ничего странного (везде wrap_content). Я не добавляю никаких дополнительных дополнений в XML (теперь дважды проверяйте Java). Большое спасибо за ссылки SO! - person Booger; 10.07.2015

У меня была такая же проблема, и я обнаружил, что у меня есть app:cardCornerRadius="0dp" в атрибутах просмотра карты. Когда я удалил его, моя проблема решилась. Надеюсь это поможет

person Ramin Rabii    schedule 04.03.2017

У меня есть адатер с основным контейнером элемента в виде карточки, и для cardCornerRadius установлено значение 0:

app:cardCornerRadius="0dp"

Я изменил его на:

app:cardCornerRadius="1dp"

Теперь он работал отлично.

Я также тестировал с android:fitsSystemWindows="true" и без него, это НЕ ничего для меня не изменило.

person MBH    schedule 09.05.2017