【问题标题】:material android Chip is crashing when inflated in xml layout材料android芯片在xml布局中膨胀时崩溃
【发布时间】:2018-11-11 09:02:14
【问题描述】:

即使我没有在代码中做任何事情......看起来视图类中的某个地方drawable以某种方式创建并且这会使Chip崩溃,因为这是不允许的......欢迎任何帮助。

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'

【问题讨论】:

  • 你为这个Chip 的活动使用什么主题?这个主题是否定义了android:background
  • @BenP。我添加了我的主题文件,没有什么特别的......
  • 芯片在哪里?它在操作栏中吗?

标签: android androidx material-components-android


【解决方案1】:

经过一天的战斗后我的小解决方法:/

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

好吧,我可以清楚地看到,即使我在所有地方都禁用了所有自定义,我也可以从主题到我的芯片以某种方式应用可绘制对象。我不知道,但必须继续前进……

【讨论】:

    【解决方案2】:

    您使用的是哪个版本的库?抛出异常是因为芯片管理自己的背景并且不支持 View#setBackground。您的芯片实例的父级是否可能正在尝试设置芯片的背景?

    【讨论】:

    • 嗨,你的意思是像编程一样?或者我如何从父母那里设置背景?
    • 好吧,我知道是什么导致了崩溃......虽然不知道如何应用彩色背景......这里有一些背景魔法......
    • 能否在不使用任何自定义视图的情况下验证崩溃是否可以在一个非常简单的示例应用中重现?
    • 您查看我找到的解决方案了吗?非常清楚地解释了这是如何发生的 stackoverflow.com/a/53287528/925135 ,它肯定不是材质库中的错误,而是使用 ContextThemeWrapper 的结果。它肯定很容易重现。但可以肯定的是,Chip 不应该像这样抛出异常,它应该警告并忽略背景表单主题或其他东西......这就是我的看法。
    • 嗨 Renetik,感谢您的解释和建议。我提交了一张票进行更改,您可以通过以下方式跟踪进度:b.corp.google.com/issues/119564663
    【解决方案3】:

    好的,我找到了,我正在使用此代码创建顶级布局:

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

    在这个布局中,我设置了白色背景,应该没问题,但是...... 现在我看到了这个 ContextThemeWrapper 实际做了什么:

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

    因此,我的上下文主题被修改为包含白色背景,并且不知何故进入了稍后使用此上下文创建的其他视图,这导致 Chip 崩溃,因为它不允许背景。

    所以我不得不停止使用 ContextThemeWrapper ,也许我误解了真正的目的,我想以编程方式将样式应用到我的视图中,实际上什么有效,但它修改了整个主题。

    所以我找到了库 paris 用于以编程方式应用样式并将该代码更改为:

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

    现在它可以使用相同的样式。

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      相关资源
      最近更新 更多