[ActivBackStackEntryCount重新创建活动时返回0

问题描述 投票:0回答:1

我知道这必须很简单,我可能看不到解决方案。这是我所拥有的简短描述:SignInActivity(AppCompatActivity)-处理Firebase身份验证,成功调用该方法:

private void onAuthSuccess(FirebaseUser user) {
    // Go to MainActivity
    startActivity(new Intent(SignInActivity.this, MainActivity.class));
    finish();
}

MainActivity(AppCompatActivity)-处理应用程序的菜单,尤其是带有按钮的片段。单击一个按钮后,我将更改包含其他按钮的片段。像这样的东西:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager()
                .beginTransaction()
                .setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_left)
                .replace(R.id.fragmentContent, MainMenuFragment.newInstance())
                .commitNow();
    }

    getSupportFragmentManager().addOnBackStackChangedListener(new 
        FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                int stackHeight = getSupportFragmentManager().getBackStackEntryCount();
                getSupportActionBar().setHomeButtonEnabled(stackHeight > 0);
                getSupportActionBar().setDisplayHomeAsUpEnabled(stackHeight > 0);
            }
        });
}

public void replaceFragments(Class fragmentClass, boolean isBack) {
    Fragment fragment = null;
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    if (isBack) {
        ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
    } else {
        ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
    }

    try {
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (Exception e) {
        fragment = null;
        e.printStackTrace();
    }

    if (fragment != null) {
        ft.replace(R.id.fragmentContent, fragment);
        ft.addToBackStack(fragmentClass.getName());
        ft.commit();
    }
}

MainMenuFragment(Fragment)-第一组选项,彼此顶部的几个按钮。根据所单击的按钮,将调用MainActivity.replaceFragment传递下一个片段。

public class MainMenuFragment extends Fragment {
    private static final String TAG = "MainMenuFragment";

    public static MainMenuFragment newInstance() {
        return new MainMenuFragment();
    }

    public MainMenuFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_main_menu, container, false);

        final Button btnAssets = view.findViewById(R.id.btnAssets);
        final Button btnAudit = view.findViewById(R.id.btnAudit);

        btnAssets.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i(TAG, "BtnAssets_onClick");
                ((MainActivity)getActivity()).replaceFragments(AssetMenuFragment.class);
            }
        });

        btnAudit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i(TAG, "BtnAudit_onClick");
                ((MainActivity)getActivity()).replaceFragments(AuditMenuFragment.class);
            }
        });
        return view;
    }
}

[AssetMenuFragment和AuditMenuFragment与MainMenu几乎相同,只是按钮的文本和某些布局详细信息发生了变化。

[当我使用该应用程序时,我首先登录,这使我进入MainActivity,后者在onCreate上加载MainMenuFragment。在这里,我看到了两个按钮,一个进入资产菜单片段,另一个进入AuditMenuFragment,它们用相应的布局替换该片段。如果单击“资产”按钮,则替换片段后,原因如下:

getSupportActionBar().setHomeButtonEnabled(stackHeight > 0);
getSupportActionBar().setDisplayHomeAsUpEnabled(stackHeight > 0);

向我显示后退箭头以返回MainMenuFragment。一切正常。

现在是问题!如果我在此AssetMenuFragment中,则在操作栏上显示了美丽的后退箭头,并决定单击设备上的“ Square”按钮,这可能会运行onPause和onStop,然后他们再次单击该应用程序,该应用程序将运行再次onCreate和onStart时,我的后退箭头消失了,因为现在int stackHeight = getSupportFragmentManager().getBackStackEntryCount();为零。

我如何保存我的堆栈并在以后还原它,以便可以在AssetMenuFragment上按一下并返回MainMenuFragment。

阅读很多,但是我会很感谢您的帮助,谢谢!

android android-fragments
1个回答
0
投票

最后,我知道它必须很简单。

两项检查均正确。

getSupportActionBar().setHomeButtonEnabled(stackHeight > 0);
getSupportActionBar().setDisplayHomeAsUpEnabled(stackHeight > 0);

问题是我没有在onCreate上检查它们,仅在getSupportFragmentManager().addOnBackStackChangedListener事件上检查了它们。

这里是MainActivity:

private ActionBar actionBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager()
                .beginTransaction()
                .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)
                .replace(R.id.fragmentContent, MainMenuFragment.newInstance())
                .commitNow();
    }

    actionBar = getSupportActionBar();
    updateActionBarBackButton();

    getSupportFragmentManager().addOnBackStackChangedListener(new 
        FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                updateActionBarBackButton();
            }
        });
}

private void updateActionBarBackButton() {
    int stackHeight = getSupportFragmentManager().getBackStackEntryCount();
    getSupportActionBar().setHomeButtonEnabled(stackHeight > 0);
    getSupportActionBar().setDisplayHomeAsUpEnabled(stackHeight > 0);
}

© www.soinside.com 2019 - 2024. All rights reserved.