Защо onResume() се извиква в скрити фрагменти?

Приложението ми показва много изображения на главния екран. Потребителят може да види повече информация за продукт, като докосне изображение. Фрагментът на основния екран се скрива, а фрагментът с подробности за продукта става видим. Като щракнете върху клавиша за връщане назад, фрагментът от главния екран става видим отново.

Транзакцията на фрагмента се изпълнява, както следва:

    @Override
public void showProduct(Product p, boolean isParentTabbed) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();

    // the new fragment
    Fragment mFragment = new ProductDetailFragment(p,isParentTabbed);

    //hide main screen fragment and add product detail fragment
    transaction.hide(currentlyOpenedFragment);
    transaction.add(android.R.id.content,mFragment);

    //set new fragment as current "on top" fragment
    currentlyOpenedFragment = mFragment;

    //start animation
    transaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_top);

    transaction.addToBackStack(null);
    transaction.commit();
}

Всичко работи добре, освен ако потребителят отвори диалоговия прозорец за споделяне (стандартно намерение за споделяне на Android) във фрагмента с подробности за продукта и затвори диалоговия прозорец, като щракне върху клавиша за връщане назад. По някаква причина се извиква методът onResume в основния фрагмент на екрана (който е скрит). Реших проблема, като добавих следния код към метода onResume в основния фрагмент на екрана:

    super.onResume();
    if(this.isHidden()){
        Log.d("tab","dont resume tab0fragment because it is hidden");
        return;
    }

Това работи добре, но остава въпросът: Защо се извиква onResume() в скрития фрагмент, когато потребителят затвори диалогов прозорец за споделяне в друг фрагмент?


person Apfelsaft    schedule 28.04.2013    source източник


Отговори (1)


Скритите фрагменти все още следват жизнения цикъл на фрагмента. Разгледайте блок-схемата от документацията. User navigates backwards or the fragment is removed/replaced. Води до извикване на onDestroyView(), където The fragment returns to the layout from the back stack,, което е мястото, където се намира основният фрагмент от екрана.

person loadedion    schedule 03.05.2013