7

使用DrawerLayoutNavigationViewFrameLayout我想切換Fragment s。這很好。 但是,如果我切換太快,那麼Fragment s重疊...與DrawerLayout/NavigationView重疊的片段

這就像executePendingTransactions()不起作用。

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

如果我切換Fragment S(太)快速(手動地或通過與750ms之間的延遲上我的Nexus 5代碼),I得到兩Fragment s至重疊,與具有使能觸摸BUT第二Fragment第一Fragment是在上面...

第一Fragment包含ImageViewTextView秒。第二個Fragment包含TabLayoutViewPager(如果這可能對我的問題有任何的一天)。是的,我正在使用AppCompat 22.2.0和Design 22.2.0庫。

如果我將背景顏色設置爲兩種顏色,那麼我只能看到第一個Fragment,它永遠不會改變。

我試過popBackStackImmediate()executePendingTransactions()remove(fragment)android:fitsSystemWindows="true"Android: fragments overlapping issue,延遲,和其他的東西,但沒有成功。

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

編輯

在我onCreate()我這樣做:

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

果然撥打電話過快。刪除這段代碼解決了我的問題(暫時,見下文)。

我仍然不知道爲什麼executePendingTransactions()並沒有阻止這樣奇怪的問題......

EDIT 2

我想過保持boolean(INIT爲false)跟蹤時, Fragment交易發生。我在navigationDrawer()中將其設置爲true,在Fragment.onResume()中將其設置爲false。仍然沒有去...

所以:我MainFragment加載使用Picasso和切換太快(800毫秒)到另一個Fragment的圖像仍然有問題:他們仍然重疊......

+0

我可以看到你更多的代碼..所以,我可以幫助你.. – Moinkhan

+0

@Moinkhan哪一部分它?我相信我發佈了相關部分。這是一個基本的DrawerLayout/NavigationView實現。 – shkschneider

+0

你提供的代碼是完美的。這就是爲什麼我認爲問題可以在代碼中,這是不是在這裏提供... – Moinkhan

回答

0

在我onCreate()我這樣做:

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

原來撥打電話的速度太快了。 刪除這段代碼解決了我的問題。

我仍然不知道:

爲什麼executePendingTransactions()並沒有阻止這樣奇怪的問題......

編輯

仍然有問題,在我的MainFragment加載使用Picasso並且切換太快(800ms)到另一個的圖像:它們仍然重疊...

EDIT 2

所以我現在用一個布爾值,如果我的Activity正在轉換一個Fragment與否,與第二開關之間1秒的最小計時標記。

在我Fragment小號onViewCreated()

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

在我navigationDrawer()

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

另一種方法是檢查'Activity'是否在我的'navigationDrawer()'方法的頂部傳遞onResume()'。即使錯誤的代碼現在工作。 – shkschneider

+0

而這並沒有奏效:我設置了一個'boolean'來表示事務何時到位,並在'onResume()'中將我的'Fragment'設置爲false。還是行不通... – shkschneider

1

你可以試試這個。 .. 會耽誤你的頻繁點擊...

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

想到這一點,並已做到這一點:沒有工作(加上這並不能解釋我的問題)。感謝輸入 – shkschneider