7

Mit einer mit einer NavigationView und einer FrameLayout möchte ich Fragment s. Das funktioniert großartig. Allerdings, wenn ich zu schnell wechseln, dann werden die Fragment s überlappt ...Fragmente, die sich mit DrawerLayout/NavigationView überlappen

Es ist wie executePendingTransactions() funktioniert nicht.

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

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

     <include layout="@layout/toolbar" /> 

     <FrameLayout 
      android:id="@+id/frameLayout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    </LinearLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigationView" 
     android:layout_width="@240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@color/transparent" 
     android:dividerHeight="0dp" 
     app:menu="@menu/navigationdrawer" /> 

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

Wenn ich Fragment s (zu) schnell (manuell oder durch Code mit einem 750 ms Verzögerung auf meinem Nexus 5) wechseln, habe ich beide Fragment s zu überlappen, wobei die zweite Fragment aktiviert die Berührung mit BUT die erste Fragment oben zu sein ...

die erste enthält eine FragmentImageView und TextView s. Die zweite Fragment enthält eine TabLayout und eine ViewPager (wenn das mit meinem Problem etwas zu Tage hätte). Ja, ich verwende die Bibliotheken AppCompat 22.2.0 und Design 22.2.0.

Wenn ich eine Hintergrundfarbe für beide festlegen, dann kann ich nur die erste Fragment sehen, und es ändert sich nie.

Ich versuchte popBackStackImmediate(), executePendingTransactions(), remove(fragment), android:fitsSystemWindows="true", Android: fragments overlapping issue, Verzögerungs- und andere Dinge, ohne Erfolg.

@Override 
protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // ... 

    mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(final MenuItem menuItem) { 
      navigationDrawer(menuItem.getItemId()); 
      return true; 
     } 
    }); 

    if (savedInstanceState == null) { 
     final MenuItem menuItem = mNavigationView.getMenu().getItem(0); 
     if (menuItem != null) { 
      navigationDrawer(menuItem.getItemId()); 
     } 
    } 
} 

private void navigationDrawer(final int itemId) { 
    final Fragment fragment = getFragment(itemId); 
    getSupportFragmentManager().beginTrasaction() 
     .replace(R.id.frameLayout, fragment) 
     .addToBackStack(null) 
     .commit(); 
    mNavigationView.getMenu().findItem(itemId).setChecked(true); 
    mDrawerLayout.closeDrawer(mNavigationView); 
    supportInvalidateOptionsMenu(); 
} 

@Override 
public boolean onOptionsItemSelected(final MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu_first: 
     case R.id.menu_second: 
     case R.id.menu_third: 
      navigationDrawer(item.getItemId()); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

EDIT

In meinem onCreate() ich dies tat:

if (savedInstanceState == null) { 
    final MenuItem menuItem = mNavigationView.getMenu().getItem(0); 
    if (menuItem != null) { 
     navigationDrawer(menuItem.getItemId()); 
    } 
} 

Welche stellt sich heraus, um einen Anruf zu tätigen zu schnell. Das Entfernen dieses Codes löste mein Problem (zeitlich, siehe unten).

Ich weiß immer noch nicht, warum executePendingTransactions() nicht so seltsames Problem hinderte ...

EDIT 2

Ich dachte über ein boolean (init false) zu halten, um zu verfolgen, wenn ein Fragment Transaktion findet statt. Ich setze es auf true in meinem navigationDrawer() und false in Fragment.onResume(). Noch nicht gehen ...

Also: immer noch Problem auf meinem MainFragment mit, die ein Bild lädt Picasso verwenden und zu schnell (800ms) zu einem anderen Fragment vermittlungs sie noch überlappen ...

+0

kann ich Ihr noch mehr Code sehen ..so dass ich Ihnen .. – Moinkhan

+0

@Moinkhan Was Teil kann helfen davon? Ich glaube, ich habe den relativen Teil veröffentlicht. Es ist eine grundlegende DrawerLayout/NavigationView-Implementierung. – shkschneider

+0

Der von Ihnen bereitgestellte Code war perfekt. deshalb dachte ich, dass das Problem im Code sein kann, der hier nicht zur Verfügung gestellt wird. – Moinkhan

Antwort

0

In meinem onCreate() ich dies tat:

if (savedInstanceState == null) { 
     final MenuItem menuItem = mNavigationView.getMenu().getItem(0); 
     if (menuItem != null) { 
      navigationDrawer(menuItem.getItemId()); 
     } 
    } 

Was sich als zu schnell herausstellt. Das Entfernen dieses Codes hat mein Problem gelöst.

Ich weiß noch nicht:

warum executePendingTransactions() nicht so seltsames Problem hindert ...

EDIT

Treten immer noch Probleme auf meine MainFragment dass Lasten ein Bild mit Picasso und Umschalten zu schnell (800ms) zu einem anderen: sie überlappen immer noch ...

EDIT 2

So benutze ich jetzt einen boolean zu markieren, wenn meine Activity ein Fragment oder nicht, mit einem minimalen Timer von 1 s Sekunde zwischen Schaltern Übergang.

In meinem Fragment s onViewCreated():

if (view != null) { 
    view.post(new Runnable() { 
     @Override 
     public void run() { 
      // Activity might be null 
      getActivity().setTransitioning(false); 
     } 
    }); 
} 

Und in meinem navigationDrawer():

if (isTransitioning()) { 
    // Switching Fragments too fast 
    return false; 
} 
+0

Alternative Möglichkeit wäre zu überprüfen, ob die 'Activity' am Anfang meiner 'navigationDrawer()' Methode 'onResume()' übergeben hat. Funktioniert jetzt auch mit fehlerhaftem Code. – shkschneider

+0

Und das hat nicht funktioniert: Ich habe einen booleschen Wert für den Zeitpunkt festgelegt, an dem eine Transaktion stattgefunden hat, und habe meinen 'Fragment' in' onResume() 'auf false gesetzt. Funktioniert immer noch nicht... – shkschneider

1

du versuchen können. .. Es wird Ihren häufigen Klick verzögern ...

private final Handler mDrawerActionHandler = new Handler(); 
private static final long DRAWER_CLOSE_DELAY_MS = 250; 

mDrawerActionHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     // your navigation code goes here 
     } 
}, DRAWER_CLOSE_DELAY_MS); 
+0

Dachte daran und tat es schon: hat nicht funktioniert (und das erklärt mein Problem nicht). Danke für die Eingabe trotzdem – shkschneider

Verwandte Themen