简体   繁体   English

Android peek backstack 没有弹出

[英]Android peek backstack without popping

For my application, some fragments require the user to enter a pin in a dialog before it is shown.对于我的应用程序,一些片段要求用户在显示之前在对话框中输入一个引脚。 I have a BaseFragment class that all my other fragments extend which stores if the pin is required.我有一个 BaseFragment 类,我的所有其他片段都会扩展它,如果需要引脚,它会存储。 My issue right now is dealing with the back button as if the user tries to go back to a fragment that requires the pin it needs to show a pin dialog first.我现在的问题是处理后退按钮,就好像用户试图返回到需要 pin 的片段,它需要先显示 pin 对话框。

Currently I'm overriding onBackPressed() in which I want to peek the backstack to see what fragment will be resumed if popBackstack() was called so I can check if the pin dialog should be shown.目前我正在覆盖 onBackPressed() ,我想在其中查看 backstack 以查看如果调用 popBackstack() 将恢复哪个片段,以便我可以检查是否应显示 pin 对话框。 Below is my current code which popFragment is coming back null:下面是我当前的代码,其中 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();
    }
}

I've checked if backEntry is null and its not.我已经检查过 backEntry 是否为 null 而不是。 backEntry.getId() also comes back with a value of 1 so I'm not sure why findFragmentById() is then null. backEntry.getId() 的值也为 1,所以我不确定为什么 findFragmentById() 为 null。 I also dont think it has to do with how I'm showing fragments but here is my code for that as well:我也不认为这与我如何显示片段有关,但这里也是我的代码:

FragmentManager fragManager = mActivity.getSupportFragmentManager();
FragmentTransaction transaction = fragManager.beginTransaction();
transaction.replace(R.id.fragment_container, mFragment);
transaction.addToBackStack(null);
transaction.commit();

The BackStackEntry id and Fragment id have nothing to do with each other. BackStackEntry id 和Fragment id 彼此无关。

I have done something similar to what you are doing by using tags.我通过使用标签做了一些类似于你正在做的事情。 Again, the BackStackEntry tag and Fragment tags have nothing to do with each other;同样, BackStackEntry标签和Fragment标签彼此无关; however, by using the same value for both tags you can accomplish your goal.但是,通过对两个标签使用相同的值,您可以实现您的目标。

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

You are gone Frag-A -> Frag-B -> Frag-C.你走了 Frag-A -> Frag-B -> Frag-C。 Now you want to go back to Frag-A without creating a new Fragment view for Frag-A ?现在您想回到 Frag-A 而不为 Frag-A 创建新的 Fragment 视图? Here is the solution:这是解决方案:

Navigation.findNavController(requireView()).popBackStack(R.id.Frag_A, false)

Also delete your nav entry action_Frag_C_to_Frag_A.同时删除您的导航条目 action_Frag_C_to_Frag_A。 If you have accidentely created a navgraph.如果您不小心创建了导航图。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM