1

我可以从活动开始片段。然而,我担心我的实施可能出现的问题。从活动开始片段

我有两个片段,FragmentAFragmentB 我有3个活动课,Activity1Activity2ResultActivity

public class NavigationTabs extends FragmentActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple_tabs_2); 

    FragmentStatePagerAdapter adapter = new MyTabs(getSupportFragmentManager()); 
    .... 
    .... 
} 

static class MyTabs extends FragmentStatePagerAdapter { 
    public MyTabs(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch(position) 
     { 
       case 0: 

        FragmentA FragA = new FragmentA(); 
        return FragA; 

       case 1: 

        FragmentB FragB = new FragmentB(); 
        return FragB; 
     ...... 
     ...... 
     } 
    } 

^我怎么叫通过意图FragmentAFragmentB

FragmentA开始Activity1

Intent intent = new Intent(getActivity(), Activity1.class); 
    startActivity(intent); 

Activity1然后通过一个计数器的结果,以ResultActivity

ResultActivity开始(或返回)FragmentA和经由的onClick设置SharedPreferences像经由意图这个

public void onClick(View v) { 
    if(v.getId()== R.id.button_1){ 
     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
     Editor edit = sp.edit(); 
     edit.putInt(passedSavePref, counter); 
     edit.commit(); 

     finish(); 
} 
} 

FragmentB开始Activity2

Intent intent = new Intent(getActivity(), Activity2.class); 
    startActivity(intent); 

Activity2然后通过一个计数器的结果ResultActivity

ResultActivity开始(返回)FragmentB,并通过设置的onClick像SharedPreferences这

public void onClick(View v) { 
    if(v.getId()== R.id.button_1){ 
     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
     Editor edit = sp.edit(); 
     edit.putInt(passedSavePref, counter); 
     edit.commit(); 

     finish(); 
} 
} 

这所有的作品我的需要。 GC似乎很好,它释放和分配内存。

ResultActivty返回正确的Fragment,并正确设置SavedPreferences。

然而这似乎很不好实现。 对于初学者,同时通过我读过其他问题搜索,“不要直接从片段开始的活动”的海报也与这里的正确实施https://developer.android.com/guide/components/fragments.html#EventCallbacks

我已经打过电话Activity1FragmentA这样,但我实在不明白行为上的差异或性能

Intent intent = new Intent(getActivity(), Activity1.class); 
    startActivity(intent); 
    getActivity().getSupportFragmentManager().popBackStack(); 

所以我的问题是,我需要完成/删除FragmentA当我开始Activity1,然后再从ResultActivity使用类似

启动
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

在此先感谢。

编辑因此,我试图是要么杀/面漆/流行FragmentA,这样我可以从ResultActivity重新启动它。 我之所以这样做的原因是因为当我从ResultActivity回到FragmentA时,我的savedPreferences没有加载。(好吧,他们正在保存和加载,但我看不到他们)

据我了解它的文档,片段继续暂停。所以调用我的loadPreferences方法onResume();加载我的SavedPreferences。

没有标记这个作为一个答案,因为我没有执行有关片段popBackStack();的任何标准的/恰当的做法FragmentTransactions

+1

这看起来太复杂了。当您尝试返回已经分离或删除的片段时,您可能会收到空指针异常... – StoneBird 2014-11-06 05:14:28

+0

是的,你说得对。我的方法不必要的复杂性主要是由于不了解/理解片段的生命周期以及用于管理片段的工具。感谢您的反馈 – Mcorv 2014-11-06 13:57:36

+0

您可以做的是使用您提到的回调模式,让主机活动处理所有操作,启动新的活动或片段。那么你的片段只是一个特定视图的容器。使用回调模式是首选,因为该活动具有所有'Context'的东西。 – StoneBird 2014-11-06 14:29:55

回答

1
  1. 名言:“不要直接从片段开始的活动”

我看了写这个的海报,我强烈反对。他的理由是它减少了片段的模块性,他相信你应该推动界面回调活动。

我不同意。它不会减少模块化,事实上它增加了它。为什么要实现一个抽象层来完成片段在每个实现中要做的事情?为什么在每个活动中重新编写相同的代码,何时可以在片段中模块化?事实上,如果这违反了设计原则,那么片段就不会有自己专门的开始活动的功能。例如,如果使用fragment.startAcitivtyForResult()启动一个活动,则该片段直接作为onActivityResult接收器。如果您使用活动实例直接启动新活动,则不是这样。

  • 你并不需要开始一个新的活动
  • 之前删除framgents

    Android将暂停/停止你的片段,并有可能破坏他们的基本活动,以及如果需要。 Android会不断摧毁并重新创建活动和片段,就像每次在屏幕上更改方向一样 - 默认设置会导致您的活动和片段大规模自杀。

    这就是为什么像OnSaveInstanceState()这样的函数非常重要,因为它们让您的活动和片段返回到保存状态。 Android编程的一般规则是你的活动/片段应该能够优雅地响应自发的死亡。

    +0

    这是事实。但是,即使不删除片段,当活动返回到前一个片段时,由于活动上的系统例程,您可能会得到空指针异常。所以它会导致应用程序潜在的不稳定。 – StoneBird 2014-11-06 14:27:08

    +0

    1-从我对模块性和抽象层的理解有限,因为它涉及到我的实现,我同意你的看法。 感谢您的解释。 2-“在开始新活动之前,您不需要移除framgents” 是的,我不知道。测试和日志记录让我看到哪些函数在什么时候被调用。 我没有正式的培训。我通过教程,试错法,淘汰过程学习,所以像你这样的帖子是非常有帮助的。 感谢您花时间解释并阐明了这个话题。 – Mcorv 2014-11-06 14:33:55

    +1

    super.onCreate(bundle)能够重新创建/重新连接保存到bundle的碎片/视图,super.onSaveInstanceState()将它们放在那里。他们在textView,光标位置,滚动状态等等中编写各种数据,例如文本中的数据。除非将数据放入捆绑yoruself中,否则在碎片中创建的字段在每次破坏时都会丢失,或者将参考移动到不会死的东西上。 – NameSpace 2014-11-06 15:35:48