Ошибка надувания класса 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, но это не помогает.
5 ответов
Не знаю, относится ли это к вашей проблеме. Я изменил теги 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" />
У меня есть немного больше в моем 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.createViewFromterg(LayoutInflater.createViewFromTag.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.ager.ramprav..moveToState(FragmentManager.java:1418) в android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1739) в android.support.v4.app.FragmentManagerImpl.moveToS8 и atavaManager1 support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799) на android.support. v4.app. 2321) в android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2228) в android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:699) в android.os.Handler.handleCall 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) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java):908) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703), вызванный: java.lang.reflect.InvocationTargetException в java.lang.reflect.Constructor.newInstance(Native Method) в java.lang.reflect.Constructor.newInstance(Constructor.java:288) в android.view.LayoutInflater.createView(LayoutInflater.java:607) в android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:7 на android.view.LayoutInflater.rInflate(LayoutInflater.java:806) на android.view.LayoutInflater.inflate(LayoutInflater.java:504) на android.view.LayoutInflater.inflate(LayoutInflater.java:414) на pl.acme_liw smieciarka.nowe.ekran_glowny.MainTrasyFragment.onCreateView (MainTrasyFragment.java:44) в android.support.v4.app.Fragment.performCreateView(Fragment.java:2337) в android.support.v4.app.FragmentMoveTanagerManager Java: 1418) в android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1739) в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:180pp) в android.su.su.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.removeRedundantOperationsAndExecuan.ppava. And. v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:2228) в 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) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908) в 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;
}
Я также столкнулся с подобной проблемой. После некоторого исследования проблемы я нахожу решение. Добавьте другой ресурс стиля для вашей вкладки.
Я также описал это в своем блоге.
http://www.geeksmember.blogspot.in/2015/10/errorerror-inflating-class.html
Добавьте это в ваши values-v21/styles.xml. Если у вас нет папки values-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
Я также получал ту же ошибку. Решаю проблему заменой
Ошибка в этом коде
<android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="0dp" android:layout_height="wrap_content" android:background="?attr/colorPrimary" app:layout_constraintEnd_toEndOf="parent" app:tabMode="scrollable" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/viewpager" /> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
Используйте этот код для решения упомянутой выше проблемы
<com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:background="?attr/colorPrimary" app:layout_constraintBottom_toTopOf="@+id/viewpager" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.viewpager.widget.ViewPager android:id="@+id/viewpager" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_marginEnd="5dp" android:layout_marginBottom="3dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/tab_layout" />
** Если вы используете androidx, вам нужно изменить android.support.design.widget.TabLayout на com.google.android.material.tabs.TabLayout **
Я также получал ту же ошибку. Я решаю проблему путем обновления android.support
com.android.support:design:24.1.0
к
com.android.support:design:28.0.0