2012-01-30 72 views
10

在关于在Android文档中使用片段的example中,当应用程序处于“双视图”模式时,只要应用程序需要显示不同标题的详细信息,就会重新创建详细信息片段。 FragmentTransaction.replace()用于将每个旧的细节片段实例替换为新的细节片段实例。好的更新片段而不是创建新的实例?

这是推荐的做法吗?如果真正的意图(不是双关语意图)是更新UI显示的内容而不是UI本身,那么创建新的UI实例并不是浪费。在我看来,创建新实例的唯一原因是如果有人想将它们添加到后台堆栈,以便用户可以回溯步骤。否则,是否安全/建议直接更新片段?

在该示例的情况下,这意味着沿着DetailsFragment.setShownIndex()的方向的方法。这将被称为传递新的标题索引,而不是重新创建DetailsFragment

假设我们有一个示例版本,其中一个活动同时管理两个片段,但每次只显示一个片段,根据需要将每个片段交换出来。活动创建每个片段的实例,保留每个片段的引用,然后根据需要简单地添加或移除这两个实例可以吗?

这样做的一个可能粘性后果是,当标题片段处于resumed状态(即在'前景'中)时,选择标题将导致在细节片段处于中时调用DetailsFragment.setShownIndex()stopped状态。

好主意?馊主意?

在此先感谢。

回答

5

就像你说的那样,创建新Fragment实例的主要原因是为了方便使用back栈。重复使用现有片段也是绝对安全的(使用FragmentManager.findFragmentById()FragmentManager.findFragmentByTag()查看)。有时你需要充分利用片段方法,如isVisible()isRemoving()等,所以当DetailsFragmentstopped时,您不会非法引用UI组件。

无论如何在你提出的单窗格活性与2个片段,您的setShownIndex方法可以在其在onCreateViewonActivityCreated加载DetailsFragment设置一个私有字段。当DetailsFragment被添加到容器

例如,

DetailsFragment df = getFragmentManager().findFragmentByTag("details"); 
if (df != null) { 
    df.setShownIndex(getSelectedIndex()); 
} else { 
    df = DetailsFragment.newInstance(getSelectedIndex()); 
} 
fragmentTransaction.replace(R.id.frame, df, "details").commit(); 

在两种情况下,DF是否被新创建的或重复使用,onCreateViewonActivityCreated将被调用。

但如果你想一回堆,我强烈建议刚创建新实例,否则你只是在实现自己的背部栈为DetailsFragment的内容。

0

我曾尝试下面的代码和它的作品对我来说:

private void replaceFragment(Class fragmentClass, String FRAGMENT_NAME, android.support.v4.app.FragmentManager fragmentManager) { 

    Fragment fragment = null; 
    String backStateName = fragmentClass.getName(); // nome della classe del Fragment 

    Log.d("Fragment: ", "Creazione Fragment: "+backStateName); 


    Boolean fragmentExit = isFragmentInBackstack(fragmentManager, backStateName); 


    if (fragmentExit) { //Il Fragment è presente nello stacback 

     // Fragment exists, go back to that fragment 
     //// you can also use POP_BACK_STACK_INCLUSIVE flag, depending on flow 
     fragmentManager.popBackStackImmediate(fragmentClass.getName(), 0); 

    } else { 

     // se non esiste lo aggiungiamo 
     try { 
      fragment = (Fragment) fragmentClass.newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Inizializzo la transazione del Fragment 
     android.support.v4.app.FragmentTransaction ft = fragmentManager.beginTransaction(); 
     ft.setCustomAnimations(
       R.anim.fragment_slide_left_enter, 
       R.anim.fragment_slide_left_exit, 
       R.anim.fragment_slide_right_enter, 
       R.anim.fragment_slide_right_exit); 
     ft.replace(R.id.frameLayout_contentMain, fragment, FRAGMENT_NAME); 
     ft.addToBackStack(fragmentClass.getName()); 
     ft.commit(); 

     // Recupero il numero di Fragment presenti 
     Integer nFragment = fragmentManager.getBackStackEntryCount(); 

     Log.d("Fragment: ", "Numero di Fragment: "+nFragment); 

    } 

} 

要确定是否片段已经在StackBack执行此功能:

public static boolean isFragmentInBackstack(final android.support.v4.app.FragmentManager fragmentManager, final String fragmentTagName) { 
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) { 
     if (fragmentTagName.equals(fragmentManager.getBackStackEntryAt(entry).getName())) { 
      return true; 
     } 
    } 
    return false; 
} 

我希望我可以帮你

+0

会更有帮助,如果您提供英语评论 – 2016-05-14 20:12:48

+0

我很抱歉,我是意大利人。 – 2016-05-15 08:13:59

相关问题