我正在开发一个支持小部件并显示搜索结果的应用程序,该Fragment
搜索SearchView
结果RecyclerView
将用户发送到 aFragmentActivity
以显示选择的详细信息。所有这一切都很好,但我看到 Nexus 6 模拟器和实际设备之间关于 backstack 的行为不一致。在模拟器中,一切正常,如果在详细信息 FragmentActivity 上按“后退”按钮,用户将返回搜索结果片段。在实际的 Nexus 6 设备上,用户会一直回到AppCompatActivity
包含我的应用程序菜单的位置(此活动使用 support FragmentManager
,它将其管理的片段添加到后台堆栈):
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 的 Fragment 时,我还没有看到任何手动向 backstack 添加内容的内容。
frame_menu_container
编辑1:这是定义的布局XML :
<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 调用以检索和显示数据,要么允许用户发送反馈。所有 extend android.support.v4.app.Fragment
,它们都没有用户可以去的其他片段或活动。
- 首页片段
- 日历片段
- 积分榜片段
- PlayerSearchFragment(见下文)
- 关于片段
- 反馈片段
这些片段功能的唯一例外是PlayerSearchFragment
,它也扩展了android.support.v4.app.Fragment
. RecyclerView
当用户想要搜索玩家时,此片段包含显示 REST 调用的结果。当返回结果并且用户从列表中选择一个项目时,它们会被发送到PlayerDetailsActivity
which extends FragmentActivity
。
使用PlayerDetailsActivity
一个FragmentTabHost
视图,其中包含可以查看的有关播放器的不同类型的信息。这是这条路径的“终点”——用户无法访问其他片段或活动。这就是问题所在。当我在此活动中点击“后退”按钮时,我的意图是让用户返回PlayerSearchFragment
片段(搜索结果),在这种情况下,如果我在 Nexus 6模拟器中,他们会这样做,但他们会全部NavigationMenuActivity
如果我在我的实际 Nexus 6设备上,可以回到活动。
我在PlayerDetailsActivity
按下后退按钮时调用了以下方法,但它始终显示零条目:
@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();
}
我希望所有设备的体验都一样,无论是硬件还是模拟器。