【问题标题】:Using Android Material Chip使用安卓材料芯片
【发布时间】:2018-09-26 22:08:45
【问题描述】:

您好,我是 android 新手,正在学习使用材料芯片。我创建了一个测试项目并添加了以下内容

我添加到我的 gradle 文件中

implementation 'com.android.support:design:28.0.0'

在我的片段 xml 中我添加了

<android.support.design.chip.Chip
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="test chip"/>

但我不断收到此错误

 java.lang.RuntimeException: Unable to start activity ComponentInfo{nonso.android.test/nonso.android.test.MainActivity}: android.view.InflateException: Binary XML file line #20: Binary XML file line #20: Error inflating class android.support.design.chip.Chip
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: android.view.InflateException: Binary XML file line #20: Binary XML file line #20: Error inflating class android.support.design.chip.Chip
 Caused by: android.view.InflateException: Binary XML file line #20: Error inflating class android.support.design.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.inflate(LayoutInflater.java:515)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at nonso.android.test.ui.main.MainFragment.onCreateView(MainFragment.java:26)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2439)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
    at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:620)
    at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1334)
    at android.app.Activity.performStart(Activity.java:7029)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2741)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.lang.IllegalArgumentException: This component requires that you specify a valid TextAppearance attribute. Update your app theme to inherit from Theme.MaterialComponents (or a descendant).
    at android.support.design.internal.ThemeEnforcement.checkTextAppearance(ThemeEnforcement.java:170)
    at android.support.design.internal.ThemeEnforcement.obtainStyledAttributes(ThemeEnforcement.java:75)
E/AndroidRuntime:     at android.support.design.chip.ChipDrawable.loadFromAttributes(ChipDrawable.java:343)
        at android.support.design.chip.ChipDrawable.createFromAttributes(ChipDrawable.java:278)
    at android.support.design.chip.Chip.<init>(Chip.java:172)
    at android.support.design.chip.Chip.<init>(Chip.java:165)
        ... 31 more

android.support.design.chip.Chip 似乎有问题,我尝试使用 com.google.android.material.chip.Chip 但这也不起作用,非常感谢任何帮助!谢谢!

【问题讨论】:

    标签: android android-chips


    【解决方案1】:

    我们可以通过MaterialComponent主题使用support.design for Chip。

    在你的活动中使用这种风格

    <style name="ChipStyle" parent="Theme.MaterialComponents.Light.NoActionBar">
         <!-- Your style -->
    </style>
    

    并在您的活动中创建 ChipGroup 组件

     <android.support.design.chip.ChipGroup
         android:id="@+id/cg_filter_items"
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_margin="16dp"
         android:padding="16dp"
         app:chipSpacing="8dp"
         app:layout_constraintBottom_toTopOf="@id/btn_apply_filter"
         app:layout_constraintTop_toBottomOf="@id/tv_filter_heading" />
    

    创建新的xml文件item_filter_chip.xml,即ChipGroup的Item style="@style/TextAppearance.MaterialComponents.Chip"这条线对充气物品很重要

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.chip.Chip 
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/chips_item_filter"
         style="@style/TextAppearance.MaterialComponents.Chip"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:padding="4dp" />
    

    使用此代码动态生成筹码

        ChipGroup chipGroup = findViewById(R.id.cg_filter_items);
        for (int i = 0; i < 10; i++) {
            View view = LayoutInflater.from(this).inflate(R.layout.item_filter_chips, chipGroup, false);
            Chip chip = view.findViewById(R.id.chips_item_filter);
            chip.setText("chip Text " + i);
            chip.setClickable(true);
            chip.setCheckable(true);
            chipGroup.addView(chip);
            chip.setOnClickListener(<Your Listener>);
        }
    

    【讨论】:

    • ChipStyle 似乎不需要。
    【解决方案2】:

    就在你粘贴的错误中:

    原因:java.lang.IllegalArgumentException:此组件要求您指定有效的 TextAppearance 属性。更新您的应用主题以从 Theme.MaterialComponents(或后代)继承。

    所以要么将android:textAppearance="@style/SomeTextAppearance" 添加到您的Chip XML,或者将您的样式更改为具有父Theme.MaterialComponents

    【讨论】:

    • 谢谢,我采纳了你的建议,解决了这个问题。我已经开始尝试动态创建芯片并且遇到了类似的问题,除了我在创建芯片时无法真正设置 TextAppearance,这是我的代码和错误 Chip chip = new Chip(getContext()); chip.setText("一些芯片");芯片.isCheckable();芯片.setElevation(15); chip.setChipBackgroundColorResource(R.color.colorPrimary); chip.setTextAppearance(R.style.ChipStyle); chipGroup.addView(chip);
    • 然后使用主题方法的父类。
    • 创建芯片对象时主题的父级?
    • 在创建芯片对象时,我不太清楚如何使用主题方法的父级。可以举个例子吗。
    【解决方案3】:

    尝试使用:app:chipText

    <android.support.design.chip.Chip
        android:id="@+id/some_chip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:chipText="This is a chip" />
    

    此外,不仅如此,请将其添加到您的 styles.xml

    parent="Theme.MaterialComponents.Light.NoActionBar"
    

    Read this & 之后你可能想做一个干净的重建项目。


    com.google.android.material.chip.Chip 实际上在迁移到 AndroidX 后工作(如果我没记错的话),因为它来自 Material Design。

    例如:

    <com.google.android.material.chip.Chip
          style="@style/TextAppearance.MaterialComponents.Chip"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginStart="5dp"
          android:layout_marginEnd="5dp"
          android:text="Android"
          app:chipIcon="@drawable/androidtag" />
    

    所有这些都应该在 Android Studio 3.2 及更高版本上运行 28.0.0 或在迁移到 AndroidX 之后。

    【讨论】:

      【解决方案4】:

      您必须设置 AppTheme 以便它继承 MaterialComponent 主题之一才能使用 Chips。如果您仍想使用 AppCompat,请尝试 Bridge 主题。

      Getting Started with Material Components 上按照本指南中的步骤进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-01
        • 1970-01-01
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        相关资源
        最近更新 更多