2015-08-10 6 views
16

Ich verwende View Pager mit Tablayout in meinem Projekt. Ich bekomme ständig einen Absturzbericht über Crashlytics. Unten ist die Stapelverfolgung.java.lang.IllegalStateException: commit bereits im View Pager mit Tablayout

java.lang.IllegalStateException: commit already called 
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:624) 
    at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:620) 
    at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:161) 
    at android.support.v4.view.ViewPager.d(ViewPager.java:1105) 
    at android.support.v4.view.ViewPager.d(ViewPager.java:951) 
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1473) 
    at android.view.View.measure(View.java:15635) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.view.View.measure(View.java:15635) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1411) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:698) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
    at android.view.View.measure(View.java:15635) 
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:681) 
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 
    at android.view.View.measure(View.java:15635) 
    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:868) 
    at android.view.View.measure(View.java:15635) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124) 
    at android.view.View.measure(View.java:15635) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1411) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:698) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
    at android.view.View.measure(View.java:15635) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.view.View.measure(View.java:15635) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1411) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:698) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
    at android.view.View.measure(View.java:15635) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4919) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2200) 
    at android.view.View.measure(View.java:15635) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2165) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1249) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1443) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4872) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:579) 
    at android.view.Choreographer.doFrame(Choreographer.java:548) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762) 
    at android.os.Handler.handleCallback(Handler.java:800) 
    at android.os.Handler.dispatchMessage(Handler.java:100) 
    at android.os.Looper.loop(Looper.java:194) 
    at android.app.ActivityThread.main(ActivityThread.java:5371) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:525) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
    at dalvik.system.NativeStart.main(NativeStart.java) 

Hier ist meine XML-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" 
    android:id="@+id/drawerLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/frame_container" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="vertical"> 

      <include 
       android:id="@+id/toolbar" 
       layout="@layout/toolbar" /> 

      <android.support.design.widget.TabLayout 
       android:id="@+id/tabs" 
       android:layout_width="match_parent" 
       android:background="@color/spice_laddooblue" 
       app:tabMode="scrollable" 
       android:layout_height="wrap_content" /> 

      <FrameLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"> 

       <android.support.v4.view.ViewPager 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/pager" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
       </android.support.v4.view.ViewPager> 

      <android.support.design.widget.FloatingActionButton 
       android:id="@+id/fab" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:src="@drawable/ic_share_white_24dp" 
       android:layout_gravity="bottom|end" 
       app:elevation="6dp" 
       style="@style/floating_action_button" 
       app:backgroundTint="@color/spice_laddooblue" 
       app:pressedTranslationZ="12dp"/> 
      </FrameLayout> 


     </LinearLayout> 

     <!-- 
       <View 
      android:id="@+id/upper_view" 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:visibility="visible" 
      android:layout_below = "@+id/pager" 
      android:layout_above = "@+id/bannerView"/> 
     --> 

     <RelativeLayout 
      android:id="@+id/bannerView" 
      android:layout_width="match_parent" 
      android:layout_height="58dp" 
      android:layout_alignParentBottom="true" 
      android:background="@drawable/curved_white_with_blue_border" 
      android:visibility="gone"> 

      <TextView 
       android:id="@+id/bannerText" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerHorizontal="true" 
       android:layout_centerInParent="true" 
       android:layout_centerVertical="true" 
       android:gravity="center" 
       android:padding="3dp" 
       android:text="Banner" 
       android:visibility="gone" /> 

      <ImageView 
       android:id="@+id/bannerImage" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_alignParentLeft="true" 
       android:layout_centerHorizontal="true" 
       android:layout_centerVertical="true" 
       android:gravity="center" 
       android:padding="3dp" 
       android:scaleType="fitXY" 
       android:visibility="gone" /> 

      <ImageView 
       android:id="@+id/bannerClose" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentRight="true" 
       android:layout_alignParentTop="true" 
       android:layout_centerVertical="true" 
       android:src="@drawable/cross_icon" /> 
     </RelativeLayout> 
    </RelativeLayout> 

    <ExpandableListView 
     android:id="@+id/left_drawer" 
     android:layout_width="265dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="#fff" 
     android:choiceMode="singleChoice" 
     android:divider="@null" 
     android:dividerHeight="0dp" 
     android:drawSelectorOnTop="true" 
     android:groupIndicator="@null" 
     android:scrollbars="@null" /> 

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

Adapter Code

public class TabsPagerAdapter extends FragmentStatePagerAdapter { 

    Context context; 
    ViewPager pager; 
    int count; 

    public TabsPagerAdapter(FragmentManager fm, Context context, ViewPager pager) { 
     super(fm); 
     this.context = context; 
     this.pager = pager; 

    } 
    @Override 
    public CharSequence getPageTitle(int position) { 
     return ActivityMain.setdynamicTabsNames.get(position); 
    } 

    @Override 
    public Fragment getItem(int index) { 

     if (ActivityMain.setdynamicTabs.get(index).equalsIgnoreCase("HOME")) { 
      return new FragmentIndex(); 
     else { 
      return new FragmentDynamicTab(index); 
     } 
    } 

     @Override 
public int getCount() { 
    return ActivityMain.setdynamicTabs.size(); 
} 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     // supertabLayout.destroyItemsetupWithViewPager(container, position, objectviewPager); 
    } 

    public void setCount(int count) { 
     this.count = count; 
    } 
} 

ich wie dieser Code in Java

if (viewPager != null) { 
    viewPager.setAdapter(tabAdapter); 
    tabLayout.setupWithViewPager(viewPager); 
    } 

Ich habe mich Einstellung tablayout durch alle möglichen gegangen dafür verfügbare Lösungen Fehler..Aber keiner von ihnen funktioniert. Ich kann nicht nachvollziehen, was diese Ausnahme verursacht. Jede Hilfe wird geschätzt.

+0

einige Code Geben Sie, wie wollen Sie Setup Ihre TabLayout, zu welcher Zeile macht es zum Absturz? Das ist nicht wirklich hilfreich. – Marko

+0

Bitte sehen Sie meine bearbeitete Frage .. Ich kann nicht sehen, wo es abstürzt, da ich nicht auf meinen Geräten stürze, aber auf crashlytics bekomme ich diesen Absturz .. –

+0

Kannst du den Code für Adapter auch hinzufügen, fügst du wahrscheinlich dort Fragmente hinzu. – Marko

Antwort

3

Scheinbar commit() oder commitAllowingStateLoss() passiert zweimal innerhalb FragmentStatePagerAdapter. Hier, was ich von Android-Quellen gefunden habe:

Der einzige Ort, von dem die Transaktion dieses Adapters begangen wird, ist FragmentStatePagerAdapter.finishUpdate() und es ist commitAllowingStateLoss() Version von commit(). Daher wird finishUpdate() zweimal aufgerufen. Diese Methode wird von drei Orten mit dem Namen:

  • ViewPager.setAdapter();
  • ViewPager.dataSetChanged();
  • ViewPager.populate().

Nun wird finishUpdate() geschützt durch if (mCurTransaction != null) Prüfung und innerhalb dieser Prüfung mCurTransaction wird auf Null gesetzt. Daher können wir die gleiche Transaktion nicht zweimal durchführen. Es sei denn, wir haben mehrere Threads, die daran arbeiten. mCurTransaction Feld ist nicht flüchtig, was mich zu der Idee führt, dass Sie wahrscheinlich (direkt oder indirekt) eine der oben genannten Methoden aus dem Arbeiter Thread aufrufen und manchmal führt es zu einem Race-Zustand um mCurTransaction Feld, was zu einem zweiten commitAllowingStateLoss() führt Anruf.

Stellen Sie sicher, dass Sie nur über den Hauptthread (UI) auf Ihren Adapter und verwandte Objekte verweisen.

+0

Es hat nicht funktioniert .. !! –

-1

Dieser Code ist sehr vertraut.

Es sieht aus wie mein Projekt MaterialAppBase in GitHub, aber das ist nicht mein Code.

Ich habe Ihren Code gelesen, wenn ich nicht falsch liege, Sie haben eine Aktivität, die eine Navigationsleiste gleichzeitig implementiert, ein Tablayout ist implementiert.

Das ist sowieso keine gute Idee. Ich sehe, Sie haben es mit einer App zu tun, die vielleicht ein sehr kompliziertes Layout hat.

Was Sie tun, ist gegen die Android-Design-Richtlinie, natürlich gegen das normale UX-Design. Sie sollten niemals zwei verschiebbare Ansichten als Navigation innerhalb einer Aktivität haben. Und die Wischgeste zwischen NavigationDrawer und ViewPager kann zu Konflikten führen. Denk darüber nach, niemand macht das.

Allerdings haben Sie viele Gründe, dies zu tun.Wenn Sie dazu bestehen, sehe ich etwas falsch in Ihrem Code, aber ich bin mir nicht sicher, ob Ihr Problem durch diesen Fehler verursacht wird.

Problem ist, dass Sie nicht jedes Mal ein neues Fragment erstellen sollten, wenn das Seitenelement gerendert wird.

Was sollten Sie tun, ist:

  • Sie Ihre Fragmente im Voraus erstellt haben sollte.
  • Fügen Sie Ihre Fragmente in eine ArrayList oder so ähnlich hinzu.
  • Übergeben Sie diese Liste an den Adapter, damit die Fragmente wiederverwendbar gemacht werden können.

Blick auf mein Code the adapter code

+0

Der Beispielcode von [Verwendung des Adapters] (https://github.com/DanielShum/MaterialAppBase/blob/master/app/src/main/java/com/daililol/material/appbase/example/ExampleTabbarActivity.java) –

Verwandte Themen