Сохранение Состояния Во Фрагменте С Помощью ViewPager Android Studio

#java #android-studio #android-viewpager #savestate #onsaveinstancestate

Вопрос:

Нужна небольшая помощь в том, как подойти к сохранению состояния в моем приложении с одним действием. Я просмотрел несколько ресурсов, но не смог найти тот, который соответствует сборке. По сути, у меня есть одно действие с представлением контейнера фрагментов, которое я использую для замены фрагментов по мере необходимости. Моя проблема заключается в том, что, поскольку моя активность уничтожается при возникновении события жизненного цикла, фрагмент с моим пейджером просмотра восстанавливается, но отдельные фрагменты на вкладках не загружаются. Я не могу понять, как правильно сохранить государство. Ниже приведен мой код:

 Activity:
 
 public class StartActivity extends AppCompatActivity {

   FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        mAuth = FirebaseAuth.getInstance();

        if (savedInstanceState == null) {
            LoginFragment fragment = new LoginFragment();
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(R.id.frameLayout, fragment)
                    .commit();
        }
    }


    @Override
    public void onStart() {
        super.onStart();
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            MainActivity mainActivityFrag = new MainActivity();
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(R.id.frameLayout, mainActivityFrag)
                    .commit();
        }

    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);

    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }
}

Fragment With View Pager:

public class MainActivity extends Fragment {

    private FirebaseAuth mAuth;
    private SectionsPagerAdapter sectionsPagerAdapter;
    private ViewPager viewPager;
    private TabLayout tabs;
    private Toolbar toolbar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAuth = mAuth = FirebaseAuth.getInstance();

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_main, container, false);
        sectionsPagerAdapter = new SectionsPagerAdapter(getContext(),((AppCompatActivity)getActivity()).getSupportFragmentManager());
        viewPager = view.findViewById(R.id.view_pager);
        viewPager.setAdapter(sectionsPagerAdapter);
        tabs = view.findViewById(R.id.tabs);
        tabs.setupWithViewPager(viewPager);
        tabs.showContextMenu();
       toolbar = view.findViewById(R.id.topAppBar);
       ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
       ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);
        setHasOptionsMenu(true);
        tabs.getTabAt(0).setIcon(R.drawable.home_selector);
        tabs.getTabAt(1).setIcon(R.drawable.destination);
        tabs.getTabAt(2).setIcon(R.drawable.mail_outline_blk);
        tabs.getTabAt(3).setIcon(R.drawable.notification_bell);
        

        return view;
    }

    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        inflater.inflate(R.menu.main_menu, menu);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);

        switch (item.getItemId()){
            case R.id.logout:
                mAuth.signOut();
                //navigate to home fragment
                LoginFragment fragment = new LoginFragment();
                ((AppCompatActivity)getActivity()).getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.frameLayout, fragment)
                        .commit();
                return true;
            default:

                return false;
        }

    }

    @Override
    public void onResume() {
        super.onResume();

    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {

        super.onSaveInstanceState(outState);
    }
}

Adapter Code:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    @StringRes
    private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2, R.string.tab_text_3, R.string.tab_text_4};
    private final Context mContext;

    public SectionsPagerAdapter(Context context, FragmentManager fm) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

        mContext = context;
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        switch (position){
            case 0:
                PostFragment postFragment = new PostFragment();
                return postFragment;
            case 1:
                TestFragment userFeedFragmentt = new TestFragment();
                return userFeedFragmentt;

            default:
                TestFragment  userFeedFragmenttt = new TestFragment();
                return userFeedFragmenttt;
        }
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mContext.getResources().getString(TAB_TITLES[position]);
    }

    @Override
    public int getCount() {
        // Show 2 total pages.
        return 4;
    }


}

 

Комментарии:

1. Может быть, вы можете использовать sharedpreferences для отслеживания последнего известного фрагмента?