2015-07-29 11 views
6

Ich versuche, um ein Menü „Materialdesign“ mit Eclipse basiert auf Google zu schaffen, aber ich habe einen Fehler:Fehler aufblähenden Klasse android.support.design.widget.TabLayout

Error inflating class android.support.design.widget.TabLayout

Log-Datei:

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> 

ich habe versucht, das AppBase Thema AppCompat Einstellung, aber es hilft nicht.

+0

Sie Design Support-Bibliothek importiert haben? Es unterscheidet sich von App compat Bibliothek – Harry

+0

Ja, ich habe es die letzte Version, die es mit SDK-Manager heruntergeladen werden kann. – nabil

+0

Verlängert Ihre Aktivität die AppCompatActivity? –

Antwort

4

Ich sah auch ähnliches Problem. Nach einigen Recherchen finde ich die Lösung. Fügen Sie eine weitere Stilressource für Ihr Tablayout hinzu.

Ich habe es auf meinem Blog auch beschrieben.

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

Fügen Sie diese auf Ihre Werte-v21/styles.xml. Wenn Sie keine Werte haben, erstellen Sie einen Ordner "v21" im Ordner "app/res". Und dann erstellen Sie eine Datei styles.xml in diesem Ordner.

<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> 

Und dann hinzufügen benutzerdefinierte Stil Attribut zu Ihrem tablayout.

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

Ich sah auch das gleiche Problem und das funktioniert wie ein Charme.

Referenz: https://code.google.com/p/android/issues/detail?id=175582

+0

Es funktioniert, danke :) –

+1

Ich versuche @ Redione1 Methode zu verwenden, einen 'ViewPager' zu zeigen Position mit einem 'TabLayout' von hier: https://Stackoverflow.com/questions/38459309/how-do-you-create-an-android-view-pager-with-a-dots-indicator und bekomme den gleichen Fehler . Wieder scheint es zu AppCompat verwandt zu sein, aber die obige Lösung funktioniert nicht - ich bekomme immer noch den gleichen Fehler (plus ein durcheinandergebranntes Layout wegen der Änderungen des Themas) –

1

Ich habe ein bisschen mehr in meinem Logcat. Sie können am Ende sehen, dass es klare Erklärung ist:

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

android.view.InflateException: Binary XML file line #6: Error inflating class android.support.design.widget.TabLayout at android.view.LayoutInflater.createView(LayoutInflater.java:633) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at pl.acme_gliwice.smieciarka.nowe.ekran_glowny.MainTrasyFragment.onCreateView(MainTrasyFragment.java:44) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2337) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1418) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1739) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1808) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2579) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2366) at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2321) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2228) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:699) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5376) at java.lang.reflect.Method.invoke(Native Method) at 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) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:288) at android.view.LayoutInflater.createView(LayoutInflater.java:607) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)  at android.view.LayoutInflater.inflate(LayoutInflater.java:504)  at android.view.LayoutInflater.inflate(LayoutInflater.java:414)  at pl.acme_gliwice.smieciarka.nowe.ekran_glowny.MainTrasyFragment.onCreateView(MainTrasyFragment.java:44)  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2337)  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1418)  at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1739)  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1808)  at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)  at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2579)  at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2366)  at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2321)  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2228)  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:699)  at android.os.Handler.handleCallback(Handler.java:739)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5376)  at java.lang.reflect.Method.invoke(Native Method)  at 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)  Caused by: java.lang.IllegalArgumentException: You need to use a Theme.AppCompat theme (or descendant) with the design library. at android.support.design.widget.ThemeUtils.checkAppCompatTheme(ThemeUtils.java:33) at android.support.design.widget.TabLayout.(TabLayout.java:298) at android.support.design.widget.TabLayout.(TabLayout.java:292)

All dies Stil Trick Beispiele oben sind nicht ganz richtig.

Wir haben 2 Szenarien:

1) Unser TabLayout der Tätigkeit ist. Wenn dies der Fall ist, müssen wir das Thema dieser Aktivität auf AppCompat-Design festlegen. Zuerst müssen wir ein solches Thema in style.xml definieren (es muss nicht die Version 21 sein).

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

Dann können wir das Aktivitätsthema in der Manifestdatei definieren.

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

Wir brauchen nichts mit unserem layout.xml innerhalb des Fragments zu tun

2) Unsere TabLayout ist

ähnliche Situation, aber es ist schwieriger, das Thema zu wechseln.

Zuerst definieren wir Thema wie oben. Dann müssen wir das Thema nur für unser TabFragment ändern. Um dies zu tun, muss unser ActivityThatHoldsTheFragment nicht ein Thema im Manifest haben.Er kann sie vom Anwendungsthema erben, aber nicht direkt einstellen.

Dann müssen wir Fragment Thema in OnCreateView dieses Fragments ändern:

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); 

Ganze Fragment onCreateView kann wie folgt aussieht:

@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; 
}