Материал Android Chip падает при накачке в макете XML - PullRequest
0 голосов
/ 11 ноября 2018

Даже если я ничего не делаю в коде ... похоже, что где-то в представлении класс каким-то образом создается, и это вызывает сбой Чипа, поскольку это не разрешено ... Любая помощь приветствуется.

android.view.InflateException: Binary XML file line #22: Binary XML file line #22: Error inflating class com.google.android.material.chip.Chip
    Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class com.google.android.material.chip.Chip
    Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at android.view.LayoutInflater.createView(LayoutInflater.java:647)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at renetik.android.viewbase.CSView.inflate(CSView.java:104)
        at renetik.android.viewbase.CSView.getView(CSView.java:119)
        at renetik.android.viewbase.CSViewController.getView(CSViewController.java:405)
        at renetik.android.viewbase.CSViewController.getView(CSViewController.java:408)
        at renetik.android.viewbase.CSView.findView(CSView.java:108)
        at renetik.android.extensions.view.CSViewKt.editText(CSView.kt:22)
        at com.tanya.renetik.redriver.view.route.EditHouseFieldsController.<init>(EditHouseFieldsController.kt:15)
        at com.tanya.renetik.redriver.view.route.started.StartedAddHouseController.<init>(StartedAddHouseController.kt:31)
        at com.tanya.renetik.redriver.view.route.started.StartedRouteMapController$onCreate$2.invoke(StartedRouteMapController.kt:37)
        at com.tanya.renetik.redriver.view.route.started.StartedRouteMapController$onCreate$2.invoke(StartedRouteMapController.kt:17)
        at renetik.android.extensions.view.ViewKt$onClick$$inlined$apply$lambda$1.onClick(View.kt:51)
        at android.view.View.performClick(View.java:6256)
        at android.view.View$PerformClick.run(View.java:24697)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.UnsupportedOperationException: Do not set the background; Chip manages its own background drawable.
        at com.google.android.material.chip.Chip.setBackground(Chip.java:397)
        at android.view.View.<init>(View.java:5200)
        at android.widget.TextView.<init>(TextView.java:824)
        at android.widget.Button.<init>(Button.java:172)
        at android.widget.CompoundButton.<init>(CompoundButton.java:94)
        at android.widget.CheckBox.<init>(CheckBox.java:69)
        at android.widget.CheckBox.<init>(CheckBox.java:65)
        at androidx.appcompat.widget.AppCompatCheckBox.<init>(AppCompatCheckBox.java:64)
        at com.google.android.material.chip.Chip.<init>(Chip.java:169)

В макете просто что-то вроде этого ...

  <com.google.android.material.chip.Chip
            android:id="@+id/EditHouse_Category_Vacant"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/Category_Vacant" />

Мой файл темы прост:

    <style name="DriverTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <item name="colorPrimary">@color/driver_primary</item>
        <item name="colorPrimaryDark">@color/driver_primary_dark</item>
        <item name="colorSecondary">@color/driver_secondary</item>
    </style>

</resources>

ext.kotlin_version = '1.3.0' ext.material_version = '1.0.0' ext.appcompat_version = '1.0.0' ext.play_version = '16 .0.0 '

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Какую версию библиотеки вы используете? Исключение выдается, потому что чип управляет своим собственным фоном и не поддерживает View # setBackground. Возможно ли, что родитель вашего экземпляра чипа пытается установить фон чипа?

0 голосов
/ 13 ноября 2018

Хорошо, я нашел это, я использовал этот код для создания макета верхнего уровня:

view = FrameLayout(ContextThemeWrapper(this.context(), R.style.CSNavigationContainer))

И внутри этого макета я установил белый фон, что должно быть хорошо, но ... Теперь я вижу, что на самом деле делает этот ContextThemeWrapper:

The specified theme will be applied on top of the base context's theme.

Таким образом, моя контекстная тема была изменена, чтобы она содержала фон с белым цветом, и это каким-то образом перешло к другим представлениям, созданным позже с этим контекстом, и к этому разбитому чипу, так как он не допускает фон.

Так что я должен прекратить использовать ContextThemeWrapper, возможно, я неправильно понял реальную цель, я хотел применить стиль к моему представлению программно, что на самом деле работает, но это изменило всю тему.

Итак, я нашел библиотеку Париж для программного применения стилей и изменил код на:

  view = FrameLayout(context()).apply { style(R.style.CSNavigationContainer) }

теперь он работает в том же стиле.

0 голосов
/ 11 ноября 2018

Просто мой маленький обходной путь после одного дня борьбы: /

class ChipCrashWorkaround(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
    : Chip(context, attrs, defStyleAttr) {

    constructor (context: Context, attrs: AttributeSet?)
            : this(context, attrs, R.attr.chipStyle)

    constructor (context: Context) : this(context, null)

    override fun setBackground(background: Drawable) = try {
        super.setBackground(background)
    } catch (ex: UnsupportedOperationException) {
        warn(ex)
    }

    override fun setBackgroundDrawable(background: Drawable) = try {
        super.setBackgroundDrawable(background)
    } catch (ex: UnsupportedOperationException) {
        warn(ex)
    }
}

Ну, я ясно вижу, что каким-то образом рисование применяется, вероятно, из темы к моей микросхеме, даже если я везде отключаю все настройки ... Wtf, я не знаю, но должен двигаться вперед ...

...