Как onSaveInstanceState FragmentPagerAdapter - PullRequest
0 голосов
/ 01 июля 2019

Итак, у меня есть два фрагмента, оба имеют RecyclerView и оба связаны через FragmentPagerAdapter и TabLayout.При попытке использовать onSaveInstanceState невозможно определить, к какому фрагменту следует onSaveInstanceState.Вот код:

public class MainActivity extends AppCompatActivity {

private TabLayout tabLayout;
private ViewPager viewPager;
private ViewPagerAdapter adapter;
private TvShow tvShow = new TvShow();
private FilmShow filmShow = new FilmShow();

public MainActivity() {
}

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

    Toolbar toolbar = findViewById(R.id.toolbar);

    // placing toolbar in place of action bar
    setSupportActionBar(toolbar);



    /*Membuat tabLayout*/
    tabLayout = findViewById(R.id.tablayout);
    viewPager = findViewById(R.id.viewpager);

    adapter = new ViewPagerAdapter(getSupportFragmentManager());


    //adding fragment
    adapter.AddFragment(tvShow, "Tv");
    adapter.AddFragment(filmShow, "Film");

    // Adapter Setrup
    viewPager.setAdapter(adapter);

    tabLayout.setupWithViewPager(viewPager);

    if (savedInstanceState != null) {
        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container,tvShow);
        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container,filmShow);
        toolbar.setTitle(adapter.getPageTitle(0));
        toolbar.setTitle(adapter.getPageTitle(1));
    } else {
        tvShow = (TvShow) getSupportFragmentManager().getFragment(savedInstanceState, "Tv");
        filmShow = (FilmShow) getSupportFragmentManager().getFragment(savedInstanceState, "Film");

        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container, tvShow);
        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container, filmShow);

        toolbar.setTitle(adapter.getPageTitle(0));
        toolbar.setTitle(adapter.getPageTitle(1));
    }
}

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    outState.putString("Title", String.valueOf(adapter.getPageTitle(0))); //
    outState.putString("Title", String.valueOf(adapter.getPageTitle(1))); //

    getSupportFragmentManager().putFragment(outState, "Tv", tvShow);
    getSupportFragmentManager().putFragment(outState, "Film", filmShow);


    super.onSaveInstanceState(outState, outPersistentState);

}

..........

Приведенный выше код дает нулевую ошибку при

tvShow = (TvShow) getSupportFragmentManager().getFragment(savedInstanceState, "Tv");

EDIT

Добавлен еще один класс, расширяющий FragmentPagerAdapter

    package picodiploma.dicoding.database;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

import picodiploma.dicoding.database.picodiploma.dicoding.database.film.FilmShow;
import picodiploma.dicoding.database.picodiploma.dicoding.database.tv.TvShow;

public class ViewPagerAdapter extends FragmentPagerAdapter {

private final List<Fragment> fragmentList = new ArrayList<>();
private final List<String> FragmentListTitles = new ArrayList<>();
private TvShow tvShow;
private FilmShow filmShow;

public ViewPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int i) {
    return fragmentList.get(i);
}

@Override
public int getCount() {
    return FragmentListTitles.size();
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return FragmentListTitles.get(position);
}

public void AddFragment(Fragment fragment, String title) {
    fragmentList.add(fragment);
    FragmentListTitles.add(title);
}


@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, position);
    switch (position) {
        case 0 :
            tvShow = (TvShow) fragment;
            break;
        case 1:
            filmShow = (FilmShow) fragment;
            break;
    }
    return fragment;
}

public class DetailOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {

    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public final int getCurrentPage() {
        return currentPage;
    }
}
}

код может иметь необъяснимую логику, он просто пытается соединить кусочки и посмотреть, связано ли что-нибудь

решено с помощью прослушивателя tabLayout, получающего текущую страницу

...