Я нашел решение, которое устраняет предыдущую проблему, с которой я столкнулся. Тем не менее, я до сих пор не до конца понимаю, в чем проблема.
У меня есть фрагмент, который отображает TextView, и я пытаюсь сохранить данные в этом TextView, когда я поворачиваю экран. Ранее, даже после использования onSaveInstanceState и наблюдения, что текст действительно был СОХРАНЕН в пакете, текст не был установлен при использовании setText (). Только после изменения моего метода onCreate в MainActivity для проверки того, был ли инициализирован QuoteFragment, мой текст появился.
Почему это так, и почему setText теперь работает, если данные все еще сохраняются? Сохраняет ли FragmentManager копию фрагмента после уничтожения действия, и вызывает ли setText () какой-либо старый фрагмент? Я покажу свой фрагмент кода, который не изменился, и старый и новый код активности, который я изменил, чтобы исправить проблему:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
quoteDatabaseManager = new QuoteDatabaseManager(getActivity());
if(checkSavedQuote(savedInstanceState)) {
int id = savedInstanceState.getInt(KEY_ID);
String quote = savedInstanceState.getString(KEY_QUOTE);
boolean viewed = savedInstanceState.getBoolean(KEY_VIEWED);
boolean favorite = savedInstanceState.getBoolean(KEY_FAVORITE);
currentQuote = new Quote(id, quote, viewed, favorite);
currentQuoteIsFavorite = currentQuote.getFavorite();
currentQuoteText = currentQuote.getQuote();
Log.d("TEST", "Inside onCreate");
Log.d("TEST", currentQuoteText);
} else {
ContentValues quoteValues = new ContentValues();
quoteValues.put("VIEWED",false);
try {
quoteDatabaseManager.updateAllQuotes(quoteValues);
} catch (SQLiteException e) {
Toast.makeText(mActivity, "Database unavailable", Toast.LENGTH_SHORT).show();
}
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_quote, container, false);
textViewQuote = view.findViewById(R.id.textview_quote);
btnFindQuote = view.findViewById(R.id.btn_find_quote);
btnFindQuote.setOnClickListener(this);
if(currentQuote !=null) {
Log.d("TEST","inside onCreateView's if statement");
textViewQuote.setText(currentQuoteText);
}
setHasOptionsMenu(true);
Log.d("TEST", "onCreateView has finished");
return view;
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_ID, currentQuoteId);
outState.putString(KEY_QUOTE, currentQuoteText);
outState.putBoolean(KEY_VIEWED, currentQuoteIsViewed);
outState.putBoolean(KEY_FAVORITE, currentQuoteIsFavorite);
Log.d("TEST", "onSaveInstanceState called");
}
Старый MainActivity'sCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mToolbarTitle = findViewById(R.id.toolbar_title);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
initQuoteFragment();
}
private void initQuoteFragment() {
mQuoteFragment = new QuoteFragment();
doFragmentTransaction(mQuoteFragment, TAG_QUOTE_FRAGMENT, false);
}
private void doFragmentTransaction(Fragment fragment, String tag, boolean addToBackStack) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment, tag);
if(addToBackStack) {
transaction.addToBackStack(tag);
}
transaction.commit();
}
Новое создание MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mToolbarTitle = findViewById(R.id.toolbar_title);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
//new changes that fixed issue and got setText() to work
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(TAG_QUOTE_FRAGMENT);
if(fragment == null) {
initQuoteFragment();
} else {
mQuoteFragment = (QuoteFragment) fragment;
}
}