如何在SpaceNavigationView中保存Fragment的状态。

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

我已经搜索过了,但没有找到任何东西,这可以帮助我解决我的问题,我的代码中,我有一个SpaceNavigationView(像BottomNavigationView一样),有五个Fragments。在我的代码中,我有一个SpaceNavigationView(像BottomNavigationView),有五个Fragment。

所以在Fragment A中,我放了一个Recyclerview。如果Recyclerview中的一个项目被点击,它将用一个新的子片段B替换当前片段。

在片段B中,我设置了一个Chronometer,当它被按下时,它应该计算时间。现在,如果我从片段B切换到片段C,再回到片段B,Chronometer以零开始,因为片段被替换了。

我试着使用onSaveInstanceState,以便在重新创建Fragment时调用它,但这对我来说并不奏效。

这是HomeActivity的一部分,其中包括所有的Fragment。

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        init();
        setFragment(fragmentHome);


        navigationView.initWithSaveInstanceState(savedInstanceState);
        navigationView.addSpaceItem(new SpaceItem("", R.drawable.bottom_baby));
        navigationView.addSpaceItem(new SpaceItem("", R.drawable.bottom_advise));
        navigationView.addSpaceItem(new SpaceItem("", R.drawable.ic_favorite_black_24dp));
        navigationView.addSpaceItem(new SpaceItem("", R.drawable.ic_settings));


        navigationView.setSpaceOnClickListener(new SpaceOnClickListener() {
            @Override
            public void onCentreButtonClick() {
                setFragment(fragmentPlayground);
                navigationView.setCentreButtonSelectable(true);
            }

            @Override
            public void onItemClick(int itemIndex, String itemName) {
                switch (itemIndex) {
                    case 0:
                        setFragment(fragmentHome);
                        return;
                    case 1:
                        setFragment(fragmentAdvising);
                        return;
                    case 2:
                        setFragment(fragmentMemories);
                        return;
                    case 3:
                        setFragment(fragmentSettings);
                        return;
                    default:
                        setFragment(fragmentHome);
                        return;

                }
            }

            @Override
            public void onItemReselected(int itemIndex, String itemName) {
                Toast.makeText(HomeActivity.this, itemIndex + " " + itemName, Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void setFragment(Fragment fragment) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.container, fragment);
        fragmentTransaction.commit();
    }

所以,如果我现在导航到FragmentHome,并使用OnClickListener for Reycleritems,我将切换到Fragment_Chronograph。

 @Override
    public void onItemClick(int position) {
        switch (position) {
            case 0:
                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment_chronograph).commit();
        }

所以现在我在Fragment_Chronograph中,想为Chronograph保存基础。我将在onSavedInstanceState中保存变量,当Activity被暂停时,它会被调用。

 @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        startTime = SystemClock.elapsedRealtime() - chronometerLeft.getBase();
        outState.putLong(CHRONOLEFT_TIME_SAVE_ID,startTime);
        super.onSaveInstanceState(outState);

    @Override
    public void onPause() {
        super.onPause();
        onSaveInstanceState(new Bundle());
    }

最后,我把这个代码放在OnCreate方法中进行还原。

if (savedInstanceState != null) {
            startTime = savedInstanceState.getLong(CHRONOLEFT_TIME_SAVE_ID,0);
            chronometerLeft.setBase(startTime - SystemClock.elapsedRealtime());
            chronometerLeft.start();

OnSaveInstanceState被调用, 但在OnCreate方法中它不会被调用. 如果有人能帮我解决这个问题,我将非常感谢。我找了好几天都没有找到解决办法。

android android-fragments bottomnavigationview
1个回答
0
投票

在设置fragment方法中,首先找到有id的fragment,然后检查它是否不是空的,替换掉它。

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_PLACEHOLDER);
    if (fragment == null) {
        fragment = new PlaceholderFragment();
    }
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.container, fragment, TAG_PLACEHOLDER)
            .commit();

注意:您必须在您的片段中添加标签。


0
投票

@Arvin

FragmentHome是在init()方法中启动的。

private void init() {

        navigationView = findViewById(R.id.space);

        fragmentHome = new FragmentHome();
        fragmentAdvising = new FragmentAdvising();
        fragmentMemories = new FragmentMemories();
        fragmentSettings = new FragmentSettings();
        fragmentPlayground = new FragmentPlayground();


============= UPDATE =================


Problem was solved. I didn't have to use OnSavedInstanceState. I used a Helperclass to store the variable of the Chronometerbase. In OnCreate method i check if the variable is not null, then restore the before saved base. 
© www.soinside.com 2019 - 2024. All rights reserved.