Ошибка раздувания класса 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" />