Использование Android Material Chip

Здравствуйте, я новичок в 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, но это тоже не работает, любая помощь будет очень признательна! Спасибо!


person user642206    schedule 26.09.2018    source источник


Ответы (4)


Мы можем использовать support.design для темы Chip by MaterialComponent.

Используйте этот стиль в своей деятельности

<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, т. е. Item of ChipGroup 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>);
    }
person Ajay Yadav    schedule 17.04.2019
comment
Кажется, этот ChipStyle не нужен. - person Sudhir Singh Khanger; 05.08.2019

Это прямо в ошибке, которую вы вставили:

Причина: java.lang.IllegalArgumentException: Этот компонент требует, чтобы вы указали действительный атрибут TextAppearance. Обновите тему приложения, чтобы она наследовалась от Theme.MaterialComponents (или потомка).

Поэтому либо добавьте android:textAppearance="@style/SomeTextAppearance" в свой XML-код Chip, либо измените свой стиль, чтобы родитель Theme.MaterialComponents.

person TheWanderer    schedule 26.09.2018
comment
Спасибо, я воспользовался вашим предложением, и это решило проблему. Я начал пробовать динамически создавать чипы и столкнулся с аналогичной проблемой, за исключением того, что я не могу установить TextAppearance при создании чипа, вот мой код и ошибка Chip chip = new Chip(getContext()); chip.setText(какой-то чип); чип.isCheckable(); чип.setElevation(15); chip.setChipBackgroundColorResource (R.color.colorPrimary); chip.setTextAppearance(R.style.ChipStyle); chipGroup.addView(чип); - person user642206; 27.09.2018
comment
Тогда используйте родительский метод темы. - person TheWanderer; 27.09.2018
comment
Родитель темы при создании объекта чипа? - person user642206; 27.09.2018
comment
Я не очень уверен, как использовать родительский метод темы при создании объекта чипа. Можно ли показать мне пример. - person user642206; 27.09.2018

Попробуйте использовать: 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"

Прочитайте это и вы после этого может захотеть сделать проект чистой перестройки.


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.

person ʍѳђઽ૯ท    schedule 26.09.2018

Вы должны настроить AppTheme так, чтобы он наследовал одну из тем MaterialComponent для использования Chips. Попробуйте темы Bridge, если вы все еще хотите использовать AppCompat.

Следуйте инструкциям в этом руководстве по Начало работы с материальными компонентами.

person LittleNobody    schedule 25.12.2018