Android peek backstack without popping
问题描述:
对于我的应用程序,某些片段需要用户在显示对话框之前在对话框中输入pin。我有一个BaseFragment类,所有其他片段扩展哪些商店,如果需要引脚。我现在的问题是处理后退按钮,就好像用户试图返回一个片段,它需要首先显示引脚对话所需的引脚。Android peek backstack without popping
当前我重写了onBackPressed(),在这个函数中,如果popBackstack()被调用,所以我可以检查是否应该显示pin对话框,以查看哪个片段将被恢复。下面是我当前的代码popFragment回来null:
@Override
public void onBackPressed() {
if(getSupportFragmentManager().findFragmentById(R.id.fragment_container) instanceof BaseFragment) {
BaseFragment frag = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
int index = getSupportFragmentManager().getBackStackEntryCount() - 1;
Log.e("Back stack", Integer.toString(index));
FragmentManager.BackStackEntry backEntry = (FragmentManager.BackStackEntry) getSupportFragmentManager().getBackStackEntryAt(index);
BaseFragment popFragment = (BaseFragment) getSupportFragmentManager().findFragmentById(backEntry.getId());
BaseFragment.checkAuth(this, frag, popFragment, new NavigationCallback((AppCompatActivity) this));
} else {
super.onBackPressed();
}
} else {
super.onBackPressed();
}
}
我检查过,如果backEntry为空,它不是。 backEntry.getId()也返回值为1,所以我不知道为什么findFragmentById()然后为空。我也并不认为它与我如何展示片段做的,但这里是我的代码,以及:
FragmentManager fragManager = mActivity.getSupportFragmentManager();
FragmentTransaction transaction = fragManager.beginTransaction();
transaction.replace(R.id.fragment_container, mFragment);
transaction.addToBackStack(null);
transaction.commit();
答
的BackStackEntry
ID和Fragment
ID无关彼此。
我已经做了类似于你在做什么的使用标签。再次,BackStackEntry
标签和Fragment
标签与对方无关;不过,通过对两个标签使用相同的值,您可以完成您的目标。
String tag = ...
FragmentManager fragManager = mActivity.getSupportFragmentManager();
FragmentTransaction transaction = fragManager.beginTransaction();
// tag is associated with fragment
transaction.replace(R.id.fragment_container, mFragment, tag);
// same tag is associated with back stack entry
transaction.addToBackStack(tag);
transaction.commit();
...
int count = fragmentManager.getBackStackEntryCount();
if (count > 0) {
FragmentManager.BackStackEntry topBackStackEntry =
fragmentManager.getBackStackEntryAt(count - 1);
String tag = topBackStackEntry.getName();
if (tag != null) {
Fragment fragment = fragmentManager.findFragmentByTag(tag);
if (fragment != null) {
// we found the fragment
// you can also sanity-check here with fragment.isResumed()
}
}
}
你碰上,你有多个片段,在返回堆栈相同标签的问题?如果为标签生成随机名称,我很好奇。 –
我只是设置了一个创建标签的约定,以确保它们在任何可能的背堆栈排列中都是唯一的。在我的情况下,由于应用程序的设计,只使用片段的类名就足够了。生成一个随机标签应该可以工作,只要你可以保证标签永远不会在后退堆栈中被复制。 –
同样在我的情况下,我只需要知道是否有四种片段类型当前处于活动状态,因为像您的应用程序一样,他们需要知道后退按钮是否已被按下。所以我的大部分片段交易甚至都没有指定标签。 –