2017-01-02 72 views
1

对于我的应用程序,某些片段需要用户在显示对话框之前在对话框中输入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(); 

回答

0

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() 
     } 
    } 
} 
+0

你碰上,你有多个片段,在返回堆栈相同标签的问题?如果为标签生成随机名称,我很好奇。 –

+0

我只是设置了一个创建标签的约定,以确保它们在任何可能的背堆栈排列中都是唯一的。在我的情况下,由于应用程序的设计,只使用片段的类名就足够了。生成一个随机标签应该可以工作,只要你可以保证标签永远不会在后退堆栈中被复制。 –

+0

同样在我的情况下,我只需要知道是否有四种片段类型当前处于活动状态,因为像您的应用程序一样,他们需要知道后退按钮是否已被按下。所以我的大部分片段交易甚至都没有指定标签。 –