Ошибка раздувания класса android.support.design.widget.TabLayout

Я пытаюсь создать вкладку меню на основе "материального дизайна" Google с помощью Eclipse, но я получил сообщение об ошибке:

Ошибка раздувания класса android.support.design.widget.TabLayout

Файл журнала:

07-30 00:52:40.588: E/Trace(31652): error opening trace file: No such file or directory (2)
07-30 00:52:40.672: E/AndroidRuntime(31652): FATAL EXCEPTION: main
07-30 00:52:40.672: E/AndroidRuntime(31652): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.mykitchen/com.app.mykitchen.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class android.support.design.widget.TabLayout
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.app.ActivityThread.access$600(ActivityThread.java:149)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.os.Looper.loop(Looper.java:153)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.app.ActivityThread.main(ActivityThread.java:4987)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at java.lang.reflect.Method.invokeNative(Native Method)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at java.lang.reflect.Method.invoke(Method.java:511)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at dalvik.system.NativeStart.main(Native Method)
07-30 00:52:40.672: E/AndroidRuntime(31652): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class android.support.design.widget.TabLayout
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.view.LayoutInflater.createView(LayoutInflater.java:613)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:258)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.app.Activity.setContentView(Activity.java:1867)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at com.app.mykitchen.MainActivity.onCreate(MainActivity.java:30)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.app.Activity.performCreate(Activity.java:5020)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
07-30 00:52:40.672: E/AndroidRuntime(31652):    ... 11 more
07-30 00:52:40.672: E/AndroidRuntime(31652): Caused by: java.lang.reflect.InvocationTargetException
07-30 00:52:40.672: E/AndroidRuntime(31652):    at java.lang.reflect.Constructor.constructNative(Native Method)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.view.LayoutInflater.createView(LayoutInflater.java:587)
07-30 00:52:40.672: E/AndroidRuntime(31652):    ... 22 more
07-30 00:52:40.672: E/AndroidRuntime(31652): Caused by: java.lang.NoClassDefFoundError: android.support.design.R$styleable
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.support.design.widget.TabLayout.<init>(TabLayout.java:236)
07-30 00:52:40.672: E/AndroidRuntime(31652):    at android.support.design.widget.TabLayout.<init>(TabLayout.java:221)
07-30 00:52:40.672: E/AndroidRuntime(31652):    ... 25 more

MainActivity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

<android.support.design.widget.TabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
/>
<android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:background="@color/white" />

</LinearLayout>

Я попытался настроить тему AppBase на AppCompat, но это не помогает.

Ответ 1

У меня есть немного больше в моем Logcat. В конце вы можете видеть, что есть четкое объяснение:

You need to use a Theme.AppCompat theme (or descendant) with the design library.

android.view.InflateException: двоичная строка XML файла # 6: ошибка раздувания класса android.support.design.widget.TabLayout                                                                       на android.view.LayoutInflater.createView(LayoutInflater.java:633)                                                                       на android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)                                                                       на android.view.LayoutInflater.rInflate(LayoutInflater.java:806)                                                                       на android.view.LayoutInflater.inflate(LayoutInflater.java:504)                                                                       на android.view.LayoutInflater.inflate(LayoutInflater.java:414)                                                                       на pl.acme_gliwice.smieciarka.nowe.ekran_glowny.MainTrasyFragment.onCreateView(MainTrasyFragment.java:44)                                                                       в файле android.support.v4.app.Fragment.performCreateView(Fragment.java:2337)                                                                       в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1418)                                                                       в android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1739)                                                                       в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1808)                                                                       на android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)                                                                       в android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2579)                                                                       в android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2366)                                                                       в android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2321)                                                                       в android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2228)                                                                       at android.support.v4.app.FragmentManagerImpl $1.run(FragmentManager.java:699)                                                                       на android.os.Handler.handleCallback(Handler.java:739)                                                                       на android.os.Handler.dispatchMessage(Handler.java:95)                                                                       на android.os.Looper.loop(Looper.java:135)                                                                       в android.app.ActivityThread.main(ActivityThread.java:5376)                                                                       в java.lang.reflect.Method.invoke(собственный метод)                                                                       в java.lang.reflect.Method.invoke(Method.java:372)                                                                       at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:908)                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)                                                                    Вызывается: java.lang.reflect.InvocationTargetException                                                                       в java.lang.reflect.Constructor.newInstance(собственный метод)                                                                       в java.lang.reflect.Constructor.newInstance(Constructor.java:288)                                                                       на android.view.LayoutInflater.createView(LayoutInflater.java:607)                                                                       на android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)                                                                       на android.view.LayoutInflater.rInflate(LayoutInflater.Java: 806)                                                                       на android.view.LayoutInflater.inflate(LayoutInflater.java:504)                                                                       на android.view.LayoutInflater.inflate(LayoutInflater.java:414)                                                                       на pl.acme_gliwice.smieciarka.nowe.ekran_glowny.MainTrasyFragment.onCreateView(MainTrasyFragment.java:44)                                                                       в файле android.support.v4.app.Fragment.performCreateView(Fragment.java:2337)                                                                       в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1418)                                                                       в android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1739)                                                                       в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1808)                                                                       на android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)                                                                       в android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2579)                                                                       в android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2366)                                                                       в android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2321)                                                                       в android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2228)                                                                       at android.support.v4.app.FragmentManagerImpl $1.run(FragmentManager.java:699)                                                                       на android.os.Handler.handleCallback(Handler.java:739)                                                                       на android.os.Handler.dispatchMessage(Handler.java:95)                                                                       на android.os.Looper.loop(Looper.java:135)                                                                       в android.app.ActivityThread.main(ActivityThread.java:5376)                                                                       в java.lang.reflect.Method.invoke(собственный метод)                                                                       в java.lang.reflect.Method.invoke(Method.java:372)                                                                       at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:908)                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)                                                                    Вызывается: java.lang.IllegalArgumentException: вам необходимо использовать тему Theme.AppCompat(или потомка) с библиотекой дизайна.                                                                       на странице android.support.design.widget.ThemeUtils.checkAppCompatTheme(ThemeUtils.java:33)                                                                       в android.support.design.widget.TabLayout. (TabLayout.java:298)                                                                       в android.support.design.widget.TabLayout. (TabLayout.java:292)

Все приведенные выше примеры трюков в стиле не совсем верны.

У нас есть 2 сценария:

1) Наше TabLayout находится в действии. Если это так, нам нужно задать тему этого действия для темы AppCompat. Сначала нам нужно определить такую ​​тему в style.xml(она не должна быть 21 версией).

<style name="TabAppTheme" parent="Theme.AppCompat.Light.DarkActionBar">        
</style>

Затем мы можем определить тему активности в файле манифеста.

<activity
    android:name=".MyTabActivity"
    android:theme="TabAppTheme"
/>

Нам не нужно ничего делать с нашим layout.xml

2) Наш TabLayout находится внутри фрагмента

Аналогичная ситуация, но сложнее изменить тему.

Сначала мы определяем тему, как указано выше. Затем нам нужно изменить тему только для нашего TabFragment. Для этого наша ActivityThatHoldsTheFragment должна не задавать тему в манифесте. Он может наследовать его из темы приложения, но не может установить его напрямую.

Затем мы должны изменить тему фрагмента в OnCreateView этого фрагмента:

final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.TabAppTheme);
LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);
View view = localInflater.inflate(R.layout.fragment_main_trasy, container, false);

Весь фрагмент onCreateView может выглядеть так:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // create ContextThemeWrapper from the original Activity Context with the custom theme
    final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.TabAppTheme);
    // clone the inflater using the ContextThemeWrapper
    LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);

    View view = localInflater.inflate(R.layout.fragment_main_trasy, container, false);
    tabLayout = (TabLayout) view.findViewById(R.id.tabs);
    viewPager = (ViewPager) view.findViewById(R.id.pager);
    mAdapter = new TabFragment.MyAdapter(getChildFragmentManager());
    viewPager.setAdapter(mAdapter);
    tabLayout.setupWithViewPager(viewPager);

    return view;
}

Ответ 2

Я также столкнулся с подобной проблемой. После некоторых исследований по проблеме я нахожу решение. Добавьте еще один ресурс стиля для своей вкладки.

Я также описал это в своем блоге.

http://www.geeksmember.blogspot.in/2015/10/errorerror-inflating-class.html

Добавьте это к своим значениям-v21/styles.xml. Если у вас нет папки значений-v21, создайте ее в папке app/res. А затем создайте файл styles.xml в этой папке.

    <resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="AppTheme.Base"/>
    <!-- inherit from the material theme -->
    <style name="AppTheme.Base" parent="android:Theme.Material">
        <!-- colorPrimary is used for the default action bar background -->
        <item name="android:colorPrimary">#3F51B5</item>

        <!-- colorPrimaryDark is used for the status bar -->
        <item name="android:colorPrimaryDark">#303F9F</item>

        <!-- colorAccent is used as the default value for colorControlActivated
             which is used to tint widgets -->
        <item name="android:colorAccent">#FF4081</item>
    </style>

    <style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
        <item name="tabIndicatorColor">#FF4081</item>
    </style>
</resources>

Затем добавьте атрибут пользовательского стиля в ваш вкладку.

<android.support.design.widget.TabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/MyCustomTabLayout"
/>

Я также столкнулся с той же проблемой, и это работает как прелесть.

Ссылка: https://code.google.com/p/android/issues/detail?id=175582

Ответ 3

Не знаю, относится ли это к вашей проблеме. Я изменил теги TabLayout и ViewPager на те, которые соответствуют тегам на этой странице: https://material.io/develop/android/components/tab-layout/

Вот мой код из моего приложения, из-за которого исчезли ошибки:

<com.google.android.material.tabs.TabLayout
    android:id="@+id/sliding_tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabMode="fixed"/>

<androidx.viewpager.widget.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="1"
    android:background="@android:color/white" />