Почему вызов setText () фрагмента после поворота экрана работает только в том случае, если фрагмент не был создан заново? - PullRequest
0 голосов
/ 06 июля 2019

Я нашел решение, которое устраняет предыдущую проблему, с которой я столкнулся. Тем не менее, я до сих пор не до конца понимаю, в чем проблема.

У меня есть фрагмент, который отображает 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;
    }
}
...