Android 从活动开始片段

Android 从活动开始片段,android,android-intent,android-fragments,fragmenttransaction,Android,Android Intent,Android Fragments,Fragmenttransaction,我可以从一个活动开始一个片段。 然而,我担心我的实现可能会出现问题 我有两个片段,FragmentA和FragmentB 我有三个活动类,Activity1,Activity2,ResultActivity public class NavigationTabs extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save

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

我有两个片段,
FragmentA
FragmentB
我有三个活动类,
Activity1
Activity2
ResultActivity

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;
      ......
      ......
      }
  }
^如何调用
FragmentA
FragmentB

FragmentA
通过意图启动
活动1

    Intent intent = new Intent(getActivity(), Activity1.class);
    startActivity(intent);
Intent intent = new Intent(getActivity(), Activity2.class);
    startActivity(intent);
Activity1
然后将计数器的结果传递给
ResultActivity

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;
      ......
      ......
      }
  }
resultivity
启动(或返回)
FragmentA
并通过onClick设置共享引用,如下所示

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();
}
}
   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
通过意图启动
活动2

    Intent intent = new Intent(getActivity(), Activity1.class);
    startActivity(intent);
Intent intent = new Intent(getActivity(), Activity2.class);
    startActivity(intent);
Activity2
然后将计数器的结果传递给
ResultActivity

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;
      ......
      ......
      }
  }
ResultActivity
启动(返回)
FragmentB
并通过onClick设置共享引用,如下所示

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();
}
}
   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
返回正确的片段,并正确设置savedReference

然而,它的实现似乎非常糟糕。 首先,在搜索我读到的其他问题时,“不要直接从片段开始活动”,海报也链接到了正确的实现

我试着像这样从
FragmentA
调用
Activity1
,但我看不出行为或性能有什么不同

  Intent intent = new Intent(getActivity(), Activity1.class);
  startActivity(intent);
  getActivity().getSupportFragmentManager().popBackStack();
所以我的问题是,当我开始
Activity1
时,是否需要完成/删除
FragmentA
,然后从
ResultActivity
再次启动
FragmentA

 FragmentTransaction transaction = getFragmentManager().beginTransaction();
提前谢谢

编辑所以我要做的是杀死/完成/pop
FragmentA
,这样我就可以从
ResultActivity
重新启动它。 我之所以这么做是因为当我从
ResultActivity
返回到
FragmentA
时,我的saved引用没有加载(它们正确地保存和加载了,但我看不到它们)

正如我从文档中了解到的,碎片会暂停。因此,在Resume()上调用我的loadPreferences方法;已加载我的SavedReferences

没有将此标记为答案,因为我没有实现任何处理片段的标准/正确实践
popBackStack()
零碎交易

  • 引用:“不要直接从片段启动活动”
  • 我读了写这篇文章的海报,我强烈反对。他的基本原理是,它减少了片段的模块化,他认为应该促使接口调用活动

    我不同意。它并没有减少模块化,事实上它增加了模块化。为什么要实现一个抽象层来完成片段在每个实现中要做的事情?既然可以在片段中模块化,为什么要在每个活动中重新编写相同的代码?事实上,如果这违反了设计原则,片段就不会有自己的专门功能来启动活动

    例如,如果您使用fragment.startAcitivtyForResult()启动活动,则该片段将直接作为onActivityResult接收器。如果使用活动实例直接启动新活动,则情况并非如此

  • 在开始新活动之前,无需删除框架
  • Android将暂停/停止你的片段,并可能在必要时销毁它们和底层活动。Android不断地破坏和重建活动和片段,就像每次你改变屏幕上的方向一样——默认设置让你的活动和片段集体自杀


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

    这似乎太复杂了。当您试图返回到已经分离或删除的片段时,可能会出现空指针异常……是的,您是对的。我的方法不必要的复杂性主要是因为不了解/不理解片段的生命周期以及用于管理它的工具。感谢您的反馈,您可以使用您提到的回调模式,让宿主活动处理所有操作,或者启动新活动,或者启动片段。那么你的片段只是一个特定视图的容器。首选使用回调模式,因为活动具有所有
    上下文
    内容。或者在当前实现下,确保在返回到片段时选中
    null
    。这是正确的。但是,即使您不删除片段,当您的活动返回到上一个片段时,由于活动上的系统例程,也有可能出现空指针异常。因此,这可能会使应用程序变得不稳定。1-从我对模块化和抽象层的有限理解来看,因为它与我的实现有关,我同意你的看法。谢谢你的解释。2-“在开始新的活动之前,你不需要移除碎片”是的,我不知道。通过测试和日志记录,我可以了解何时调用了哪些函数。我没有接受过正式的培训。我通过教程、试错、淘汰过程来学习,所以像你这样的帖子很有帮助。感谢您花时间解释并阐明此主题。super.onCreate(bundle)能够重新创建/重新附加保存到bundle中的片段/视图,super.onSaveInstanceState()将它们放在那里。他们写各种各样的数据,比如文本视图中的文本、光标位置、滚动状态等。您在片段中创建的字段有可能被删除