使用DrawerLayout
與NavigationView
和FrameLayout
我想切換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
包含ImageView
和TextView
秒。第二個Fragment
包含TabLayout
和ViewPager
(如果這可能對我的問題有任何的一天)。是的,我正在使用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
的圖像仍然有問題:他們仍然重疊......
我可以看到你更多的代碼..所以,我可以幫助你.. – Moinkhan
@Moinkhan哪一部分它?我相信我發佈了相關部分。這是一個基本的DrawerLayout/NavigationView實現。 – shkschneider
你提供的代碼是完美的。這就是爲什麼我認爲問題可以在代碼中,這是不是在這裏提供... – Moinkhan