片段与DrawerLayout/NavigationView重叠

shk*_*der 7 android android-fragments fragmentmanager android-design-library

使用DrawerLayout具有NavigationViewFrameLayout我想改用Fragment秒.这很好用.但是,如果我切换太快,那么Fragments重叠......

这就像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>
Run Code Online (Sandbox Code Playgroud)

如果我Fragment快速切换s(太快)(手动或通过我的Nexus 5延迟750ms的代码),我得到两个Fragments重叠,第二个Fragment启用触摸但是第一个Fragment在顶部...

第一个Fragment包含an ImageViewTextViews.第二个Fragment包含a TabLayout和a ViewPager(如果我的问题可以解决这个问题).是的我正在使用AppCompat 22.2.0和Design 22.2.0库.

如果我为两者设置背景颜色,那么我只能看到第一个颜色Fragment,它永远不会改变.

我试过popBackStackImmediate(),executePendingTransactions(),remove(fragment),android:fitsSystemWindows="true",安卓片段重叠问题,拖延,和其他的东西,但没有成功.

@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);
}
Run Code Online (Sandbox Code Playgroud)

编辑

在我onCreate()这样做:

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

事实证明,拨打电话太快了.删除此代码解决了我的问题(暂时,见下文).

我还是不知道为什么executePendingTransactions()没有阻止这种奇怪的问题......

编辑2

我想保持一个boolean(init为false)来跟踪Fragment事务发生的时间.我将它设置为truenavigationDrawer()和我falseFragment.onResume().仍然没有...

所以:我仍然有问题MainFragment加载图像使用Picasso和切换太快(800毫秒)到另一个Fragment:它们仍然重叠...

shk*_*der 0

在我的onCreate()我正在这样做:

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

事实证明,打电话的速度太快了。删除此代码解决了我的问题。

我还是不知道:

为什么executePendingTransactions()不阻止这种奇怪的问题......

编辑

我的仍然存在问题MainFragment,即使用加载图像Picasso并将其切换得太快(800毫秒)到另一个图像:它们仍然重叠......

编辑2

因此,我现在使用布尔值来标记我是否Activity正在转换 a Fragment,并在切换之间使用 1 秒的最小计时器。

在我FragmentonViewCreated()

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

在我的navigationDrawer()

if (isTransitioning()) {
    // Switching Fragments too fast
    return false;
}
Run Code Online (Sandbox Code Playgroud)