2016-06-10 19 views
4

Ich versuche ein Experiment, zum ersten Mal nicht AppCompatActivity verwenden und die neuen Material Themen. Ich habe keine Notwendigkeit oder Wunsch nach Abwärtskompatibilität in dieser bestimmten App, so bin für Marshmallow bauen.DrawerLayout, NavigationView und Android: Theme.Material.Light nicht kompatibel?

Die Absicht ist, dass die ursprüngliche Aktivität eine actionbar mit dem Navigationsmenü auf der linken Seite hat, wie in AppCompat funktioniert. Nachdem Sie jedoch grundlegende Themen eingerichtet haben, die AppCompat Themen nicht mehr verwenden, Layouts ändern und versuchen, die Hauptaktivität anzukurbeln, tritt ein IndexOutOfBoundsException auf, nachdem die onCreate() Methode der Aktivität beendet wurde. Die Ausnahme tritt während der Initialisierung einer internen Klasse android.support.design.internal.NavigationMenuItemView auf.

Die gleiche Ausnahme tritt auf, wenn das NavigationView und verwandte Menü in XML definiert oder programmgesteuert hinzugefügt werden. Ich bin mir ziemlich sicher, was auch immer falsch ist, hängt mit dem neuen Material-Thema zusammen und verwendet keine AppCompat Sachen.

Hat jemand anderes in das hineingeraten? Sollte das funktionieren, oder bin ich nur dumm?

Hier sind einige Auszüge: App Stil mit fast allen entfernt Anpassungen:

<style name="AppTheme" parent="android:Theme.Material.Light"> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
     <item name="colorAccent">@color/colorAccent</item> 
    </style> 

activity_main Layout-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <include layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <!-- comment Nav view out and activity starts fine, with no menu of course --> 
    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:menu="@menu/activity_main_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

Beispielhauptaktivität Code:

public class MainActivity extends Activity 
    implements NavigationView.OnNavigationItemSelectedListener { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    toggle.syncState(); 

    /* uncomment this if XML has its view def removed, same exception results either way 
    NavigationView navigationView = new NavigationView(this); 
    navigationView.setNavigationItemSelectedListener(this); 
    navigationView.setLayoutParams(new DrawerLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.START)); 
    navigationView.setFitsSystemWindows(true); 
    navigationView.inflateMenu(R.menu.activity_main_drawer); 
    drawer.addView(navigationView); 
    */ 
} 
... 

I debuggt in den View.java Code und verwandte TypedArray Code und kann sehen, wo es versagt, Attribute beim Erstellen der internen Menüelementklasse zu verarbeiten. Es riecht nach einem Fehler, aber dies ist das erste Mal, dass ich versucht habe, AppCompat Themes und AppCompatActivity nicht zu verwenden. Ich habe auch versucht, die NoActionBar Variante dieses Themas zu verwenden und meine eigene Symbolleiste hinzuzufügen, aber das macht keinen Unterschied, der gleiche Fehler.

Irgendwelche Ideen/Gedanken? Danke im Voraus. Lemmy weiß, wenn ich nützliche Informationen weggelassen habe, bin ich ein SO-Neuling

endlich, hier ist der riesige Call-Stack. Die Ursache ist die dritte Ausnahme in dem Stapel:

06-10 14:49:53.763 30675-30675/test E/Cause: Binary XML file line #17: Error inflating class android.support.design.internal.NavigationMenuItemView 
android.view.InflateException: Binary XML file line #17: Error inflating class android.support.design.internal.NavigationMenuItemView 
    at android.view.LayoutInflater.createView(LayoutInflater.java:645) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.support.design.internal.NavigationMenuPresenter$NormalViewHolder.<init>(NavigationMenuPresenter.java:278) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:379) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:328) 
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5482) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4707) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) 
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) 
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) 
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) 
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) 
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2625) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.support.design.widget.NavigationView.onMeasure(NavigationView.java:223) 
    at android.view.View.measure(View.java:18794) 
    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1104) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:446) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
    at android.view.Choreographer.doFrame(Choreographer.java:606) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
06-10 14:49:55.023 30675-30675/test E/Cause: null 
java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Constructor.newInstance(Native Method) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:619) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.support.design.internal.NavigationMenuPresenter$NormalViewHolder.<init>(NavigationMenuPresenter.java:278) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:379) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:328) 
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5482) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4707) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) 
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) 
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) 
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) 
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) 
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2625) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.support.design.widget.NavigationView.onMeasure(NavigationView.java:223) 
    at android.view.View.measure(View.java:18794) 
    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1104) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:446) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
    at android.view.Choreographer.doFrame(Choreographer.java:606) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
06-10 14:49:56.083 30675-30675/test E/Cause: length=522; index=540 
java.lang.ArrayIndexOutOfBoundsException: length=522; index=540 
    at android.content.res.TypedArray.getValueAt(TypedArray.java:1132) 
    at android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:661) 
    at android.view.View.<init>(View.java:3964) 
    at android.view.ViewGroup.<init>(ViewGroup.java:573) 
    at android.view.ViewGroup.<init>(ViewGroup.java:569) 
    at android.support.v7.widget.LinearLayoutCompat.<init>(LinearLayoutCompat.java:148) 
    at android.support.design.internal.ForegroundLinearLayout.<init>(ForegroundLinearLayout.java:56) 
    at android.support.design.internal.NavigationMenuItemView.<init>(NavigationMenuItemView.java:64) 
    at android.support.design.internal.NavigationMenuItemView.<init>(NavigationMenuItemView.java:60) 
    at java.lang.reflect.Constructor.newInstance(Native Method) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:619) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.support.design.internal.NavigationMenuPresenter$NormalViewHolder.<init>(NavigationMenuPresenter.java:278) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:379) 
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.onCreateViewHolder(NavigationMenuPresenter.java:328) 
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5482) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4707) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) 
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) 
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) 
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) 
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) 
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2625) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.support.design.widget.NavigationView.onMeasure(NavigationView.java:223) 
    at android.view.View.measure(View.java:18794) 
    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1104) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:446) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
    at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
    at android.view.View.measure(View.java:18794) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
    at android.view.Choreographer.doFrame(Choreographer.java:606) 

Antwort

1

Wenn Sie AppCompat Komponenten (wie DrawerLayout) verwenden, dann müssen Sie das AppCompat Thema als Basis Thema verwenden, und AppCompatActivity als Basis Aktivität. Der Grund dafür ist, dass diese Komponenten viele Verweise auf die Unterstützung von Bibliotheksmethoden und -stilen haben, so dass deren Ausschluss keine Option ist.

Wenn Sie sich Sorgen darüber machen, dass Ihre App nach Material sucht, dann sind diese Supportbibliotheken so konzipiert, dass Ihre App auf allen Geräten gleich aussieht.

+0

Danke für die Info.Ich frage mich, was die Strategie hinter der Einführung neuer Themen bedeutet, die nicht für appcompat gedacht sind, wenn sie weniger verfügbare Funktionen haben als die Unterstützung, die AppCompat benötigt. Scheint so, als ob die Teile der Support-Bibliothek, die nicht explizit aus Gründen der Abwärtskompatibilität gedacht sind (wie RecyclerView, DrawerLayout, etc.), mit neuen Designs verwendet werden können. Wie auch immer, Ende von Mini-Rant, nochmals vielen Dank für deine Hilfe – SKOlson

1

Die meisten der Design Support Library, einschließlich NavigationView, erfordern die Verwendung von AppCompat. Sie müssen zur Verwendung von AppCompatActivity und eines AppCompat-Designs zurückkehren, wenn Sie die Design Library-Komponenten verwenden möchten.

Verwandte Themen