Сохранить состояние фрагмента на вкладке с тремя фрагментами

Итак, я следовал учебнику из youtube Android Tab Tutorial [Фрагменты вкладки Android Studio].

Я сделал несколько базовых изменений, на каждой вкладке есть кнопка и текстовое представление. Когда я нажимаю кнопки, текст в TextView изменяется.

Проблема заключается в том, что при изменении ориентации экрана текст TextView возвращается к значению по умолчанию.

Я следовал инструкциям руководства Google Life Lifecycle, но моему приложению все еще не удается сохранить значение в TextView при изменении ориентации экрана или переключении между вкладками. Я предполагаю, что это как-то связано с тем, как создаются фрагменты, но я не могу понять, в чем конкретно заключается проблема или как ее исправить.

Код как ниже:

Класс MainActivity:

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";

private SectionsPageAdapter mySectionsPageAdapter;
private ViewPager myViewPager;

SectionsPageAdapter myAdapter = new SectionsPageAdapter(getSupportFragmentManager());

private Fragment Tab1 = new Tab1Fragment();
private Fragment Tab2 = new Tab2Fragment();
private Fragment Tab3 = new Tab3Fragment();

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

        Log.d(TAG, "onCreate: Starting.");

        mySectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());

        myViewPager = (ViewPager) findViewById(R.id.container);
        setupViewPager(myViewPager);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(myViewPager);
}

private void setupViewPager(ViewPager viewPager)
{       
        myAdapter = new SectionsPageAdapter(getSupportFragmentManager());
        myAdapter.addFragment(new Tab1Fragment(), "Tab 1");  
        myAdapter.addFragment(new Tab2Fragment(), "Tab 2");  
        myAdapter.addFragment(new Tab3Fragment(), "Tab 3");  
        viewPager.setAdapter(myAdapter);
}} 

Класс SectionsPageAdapter:

public class SectionsPageAdapter extends FragmentPagerAdapter {

private final List<Fragment> myFragmentsList = new ArrayList<>();
private final List<String> myFragmentTitlesList = new ArrayList<>();

public void addFragment(Fragment myFragment, String fragmentTitle)
{
    myFragmentsList.add(myFragment);
    myFragmentTitlesList.add(fragmentTitle);
}

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

@Override
public CharSequence getPageTitle(int position) {
    return myFragmentTitlesList.get(position); // super.getPageTitle(position);
}

@Override
public Fragment getItem(int position) {
    return myFragmentsList.get(position); // null;
}

@Override
public int getCount() {
    return myFragmentsList.size(); // 0;
}}

Класс Tab1Fragment:

public class Tab1Fragment extends Fragment
{
private static final String TAG = "Tab1Fragment";
private Button Button1;
private TextView Textview1;

static final String labelText = "";
static String labelTextValue = "";

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{

    View viewOne = inflater.inflate(R.layout.tab1_fragment, container, false);

    Button1 = (Button) viewOne.findViewById(R.id.button1);
    Textview1 = (TextView) viewOne.findViewById(R.id.textView1);

    Button1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view)
        {
            labelTextValue = "This text was changed from the button!";
            Textview1.setText(labelTextValue);
        }
    });
    return viewOne; // super.onCreateView(inflater, container, savedInstanceState);
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        savedInstanceState.putString(labelText, (labelTextValue));

    } else {
        // Probably initialize members with default values for a new instance
    }
}

@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the TextView's value
    savedInstanceState.putString(labelText, (labelTextValue));

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}}

Код для двух других фрагментов одинаков, я только меняю число "1" на 2 и 3.

0 ответов

Другие вопросы по тегам