我可以从一个活动开始一个片段。
但是我担心我的实施可能存在的问题。

我有两个片段,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尚未加载。(好了,它们可以正确地保存和加载,但是我看不到它们)

据我从文档中了解到,片段继续暂停。因此,在onResume()上调用我的loadPreferences方法;加载了我的SavedPreferences。

不将其标记为答案,因为我没有实现处理片段popBackStack(); FragmentTransactions等的任何标准/正确实践

最佳答案

Quote:“不要直接从片段开始活动”


我读了写这篇文章的海报,但我对此表示强烈反对。他的理由是它减少了片段的模块化,并且他认为您应该推动一个接口来回调活动。

我不同意。它不会降低模块化,实际上会提高模块化。为什么要实现一个抽象层来执行每个实现中片段要执行的操作?如果可以在片段中对它们进行模块化,为什么还要在每个活动中都重写相同的代码?实际上,如果这违反了设计原则,则片段将没有自己的专用功能来启动活动。

例如,如果您使用fragment.startAcitivtyForResult()启动活动,则该片段将直接作为onActivityResult接收者放置。如果您使用活动实例直接启动新活动,则不是这样。


您无需在开始新的活动之前删除香精


Android会暂停/停止您的片段,并在需要时可能破坏它们以及基础活动。 Android会不断破坏和重新创建活动和片段,就像每次您更改屏幕方向时一样-默认设置会使您的活动和片段大量自杀。

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

关于android - 从 Activity 开始 fragment ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26767789/

10-10 23:02