从活动开始片段

时间:2014-11-05 21:49:12

标签: android android-intent android-fragments fragmenttransaction

我可以从一个Activity开始一个Fragment。 但是我担心我的实施可能存在问题。

我有两个片段,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返回正确的片段,并正确设置SavedPreferences。

但实施起来似乎非常糟糕。 对于初学者,在搜索我读过的其他问题时,“不要直接从片段开始活动”这张海报也与这里正确的实施相关联https://developer.android.com/guide/components/fragments.html#EventCallbacks

我尝试过Activity1这样的FragmentA,但我并没有真正看到行为或表现上的差异

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

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

之类的内容从FragmentA再次启动ResultActivity
 FragmentTransaction transaction = getFragmentManager().beginTransaction();

提前致谢。

编辑所以我试图杀死/完成/弹出FragmentA,以便我可以从ResultActivity重新启动它。 我之所以这么做是因为当我从FragmentA回到ResultActivity时,我的savedPreferences没有加载。(他们正在保存并正确加载,但我看不到它们)

正如我从文档中理解的那样,碎片会暂停。所以调用我的loadPreferences方法onResume();加载了我的SavedPreferences。

不将此标记为答案,因为我没有实施任何处理碎片的标准/正确做法popBackStack(); FragmentTransactions

1 个答案:

答案 0 :(得分:1)

  1. 引用:"不要直接从片段开始活动"
  2. 我读过写这篇文章的海报,我强烈不同意。他的理由是它减少了片段的模块性,他认为你应该强迫一个接口回调活动。

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

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

    1. 在开始新活动
    2. 之前,您无需删除framgents

      Android会暂停/停止你的碎片,如果需要,也可能会破坏它们和基础活动。 Android会不断地破坏和重新创建活动和片段,就像每次更改屏幕上的方向一样 - 默认设置会让您的活动和片段自杀。

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