其他分享
首页 > 其他分享> > android – Nexus 6设备和模拟器之间的不同backstack行为

android – Nexus 6设备和模拟器之间的不同backstack行为

作者:互联网

我正在开发一个应用程序,它有一个支持片段,带有SearchView小部件和RecyclerView,用于显示搜索结果,将用户发送到FragmentActivity以显示选择的详细信息.所有这一切都很好,但我看到Nexus 6仿真器和实际设备之间在后台堆栈方面的行为不一致.在模拟器中,一切都按照我的预期工作,如果在细节FragmentActivity上按下Back按钮,用户将被带回搜索结果片段.在实际的Nexus 6设备上,用户一直被带回AppCompatActivity,其中包含我的应用程序菜单(此活动使用支持FragmentManager,它将它管理的片段添加到backstack):

private void replaceFragment(Fragment supportFragment) {
    String fragmentName = supportFragment.getClass().getSimpleName();
    supportFragmentManager.beginTransaction()
            .addToBackStack(fragmentName)
            .replace(R.id.frame_menu_container, supportFragment, fragmentName)
            .commit();
}

将用户从Fragment发送到FragmentActivity的代码只是一个额外的意图:

Intent intent = new Intent(getActivity(), PlayerDetailsActivity.class);
intent.putExtra(TransientPlayer.BUNDLE_KEY, transientPlayer);
startActivity(intent);

我对backstack没做任何特别的事情(还) – 这是默认行为.

这可能是什么问题?我已经在backstack上做了一些阅读,当你从FragmentActivy返回到你没有使用FragmentManager的片段时,我还没有看到任何关于向backstack手动添加内容的东西.

编辑1:这是布局XML,其中定义了frame_menu_container:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

    <FrameLayout
        android:id="@+id/frame_menu_container"
        android:layout_below="@id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout="@layout/fragment_home">
    </FrameLayout>

</RelativeLayout>

编辑2:好的,这是我的高级活动和片段的文字描述:

NavigationMenuActivity,它扩展了AppCompatActivity.这是根据需要交换所有片段的地方,并且使用SupportFragmentManager并且我有replaceFragment()方法.

我有以下片段,所有片段都显示静态信息,进行REST调用以检索和显示数据,或允许用户发送反馈.全部扩展android.support.v4.app.Fragment,并且它们都没有其他用户可以访问的片段或活动.

> HomeFragment
> CalendarFragment
> StandingsFragment
> PlayerSearchFragment(见下文)
> AboutFragment
> FeedbackFragment

这些片段功能的唯一例外是PlayerSearchFragment,它还扩展了android.support.v4.app.Fragment.此片段包含RecyclerView,当用户想要搜索播放器时,它会显示REST调用的结果.返回结果并且用户从列表中选择一个项目时,它们将被发送到PlayerDetailsActivity,从而扩展FragmentActivity.

PlayerDetailsActivity使用FragmentTabHost视图,该视图包含有关可以查看的播放器的不同类型的信息.这是该路径的“行尾” – 用户无法访问其他片段或活动.这就是问题所在.当我在这个活动中点击Back按钮时,我的目的是让用户返回到PlayerSearchFragment片段(搜索结果),在这种情况下,如果我在Nexus 6模拟器中,他们就会这样做,但是他们都去了如果我在我的实际Nexus 6设备上,那么返回NavigationMenuActivity活动的方式.

我在PlayerDetailsActivity中有以下方法,当按下Back按钮时调用它,但它总是显示零条目:

@Override
public void onBackPressed() {

    FragmentManager fragmentManager = getSupportFragmentManager();
    int count = fragmentManager.getBackStackEntryCount();
    Log.i(TAG, "Backstack : There are " + count + " entries");
    for (int i = 0; i > count; i++) {
        FragmentManager.BackStackEntry backStackEntry = fragmentManager.getBackStackEntryAt(i);
        Log.i(TAG, String.format("Backstack : id=%d, name=%s, shortTitle=%s, breadcrumbTitle=%s",
                backStackEntry.getId(),
                backStackEntry.getName(),
                backStackEntry.getBreadCrumbShortTitle(),
                backStackEntry.getBreadCrumbTitle()));
    }

    super.onBackPressed();
}

我希望所有设备的体验都是相同的,无论是硬件还是模拟器.

解决方法:

我想你想要在替换后调用addToBackStack(fragmentName)(R.id.frame_menu_container,supportFragment,fragmentName).

告诉我发生了什么.

标签:android,android-fragments,fragment-backstack
来源: https://codeday.me/bug/20190623/1273684.html