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