Сохранить состояние фрагмента на вкладке с тремя фрагментами
Итак, я следовал учебнику из 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.