在片段和活动之间进行沟通 – 最佳实践

这个问题主要是为了征求意见,处理我的应用程序的最佳方式。 我有三个片段正在处理一个活动。 片段A有一个可点击的元素的照片和片段B有4个可点击的元素的button。 另一个片段只显示点击照片的细节。 我正在使用ActionBarSherlock。

屏幕截图

前进和后退button需要分别将照片更改为下一个或之前的姿势。 我可以将照片和button保留在同一个片段中,但是想要将它们分开以防我想重新排列在平板电脑中。

我需要一些build议 – 我应该结合碎片A和B吗? 如果没有,我将需要弄清楚如何实现3个可点击的项目的接口。

我考虑使用Roboguice,但我已经扩展使用SherlockFragmentActivity所以这是一个不行。 我看到提到Otto,但是我没有看到如何在项目中包含的好教程。 你认为最好的devise实践应该是什么?

我还需要帮助弄清楚如何在片段和活动之间进行通信。 我想在应用程序中保留一些数据“全局”,比如pose ID。 除了股票android开发者的信息,还有一些我能看到的代码示例吗? 这不是全部有用的。

顺便说一句,我已经存储了每个姿势在SQLite数据库中的所有信息。 这是很容易的部分。

    在活动和片段之间进行通信的最简单方法是使用接口。 这个想法基本上是在一个给定的片段A中定义一个接口,并让这个活动实现这个接口。

    一旦它实现了这个接口,你就可以在它覆盖的方法中做任何你想要的事情。

    接口的另一个重要部分是你必须从你的片段中调用抽象方法,并记住把它投射到你的活动中。 如果不正确,它应该捕获一个ClassCastException。

    简单开发人员博客上有一个关于如何做这种事情的好教程。

    我希望这对你有帮助!

    build议的片段之间通信的方法是使用由您的主要活动pipe理的callback\监听器。

    我认为这个页面上的代码很清楚: http : //developer.android.com/training/basics/fragments/communicating.html

    您也可以参考IO 2012 Schedule应用程序,该应用程序旨在成为事实上的参考应用程序。 它可以在这里find: http : //code.google.com/p/iosched/

    此外,这是一个很好的信息的SO问题: 如何在片段之间传递数据

    它是通过callback接口实现的:首先我们要做一个接口:

    public interface UpdateFrag { public void updatefrag(); } 

    在活动中执行以下代码:

     UpdateFrag updatfrag ; public void updateApi(UpdateFrag listener) { updatfrag = listener; } 

    来自callback必须在活动中触发的事件:

     updatfrag.updatefrag(); 

    在Fragment中实现CreateView中的接口执行以下代码:

      ((Home)getActivity()).updateApi(new UpdateFrag() { @Override public void updatefrag() { .....your stuff...... } }); 

    在活动,片段,服务等之间有很多种方式进行交stream。最明显的是使用接口进行交stream。 但是,这不是一种有效的沟通方式。 你必须实现听众等

    我的build议是使用一个事件总线。 事件总线是一个发布/订阅模式的实现。

    你可以在你的活动中订阅事件,然后你可以在你的片段中发布这些事件。

    在我的博客文章中,您可以find有关此模式的更多详细信息,以及一个示例项目以显示使用情况。

    我不确定我真的明白你想要做什么,但build议的片段之间通信的方式是使用callback与活动,而不是直接在片段之间。 看到这里http://developer.android.com/training/basics/fragments/communicating.html

    我做了一个注释库,可以为你做演员。 看一下这个。 https://github.com/zeroarst/callbackfragment/

     @CallbackFragment public class MyFragment extends Fragment { @Callback interface FragmentCallback { void onClickButton(MyFragment fragment); } private FragmentCallback mCallback; @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt1 mCallback.onClickButton(this); break; case R.id.bt2 // Because we give mandatory = false so this might be null if not implemented by the host. if (mCallbackNotForce != null) mCallbackNotForce.onClickButton(this); break; } } } 

    然后它生成你的片段的子类。 只需将其添加到FragmentManager。

     public class MainActivity extends AppCompatActivity implements MyFragment.FragmentCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction() .add(R.id.lo_fragm_container, MyFragmentCallbackable.create(), "MY_FRAGM") .commit(); } Toast mToast; @Override public void onClickButton(MyFragment fragment) { if (mToast != null) mToast.cancel(); mToast = Toast.makeText(this, "Callback from " + fragment.getTag(), Toast.LENGTH_SHORT); mToast.show(); } } 

    您可以使用片段中的函数声明来创build声明公共接口,并在活动中实现接口。 然后你可以从这个片段调用这个函数。

    我正在使用Intents将行动传达回主要活动。 主要活动是通过覆盖onNewIntent(Intent intent)来监听这些事件。 主要活动将这些操作转换为相应的片段。

    所以你可以做这样的事情:

     public class MainActivity extends Activity { public static final String INTENT_ACTION_SHOW_FOO = "show_foo"; public static final String INTENT_ACTION_SHOW_BAR = "show_bar"; @Override protected void onNewIntent(Intent intent) { routeIntent(intent); } private void routeIntent(Intent intent) { String action = intent.getAction(); if (action != null) { switch (action) { case INTENT_ACTION_SHOW_FOO: // for example show the corresponding fragment loadFragment(FooFragment); break; case INTENT_ACTION_SHOW_BAR: loadFragment(BarFragment); break; } } } 

    然后在任何片段里面显示foo片段:

     Intent intent = new Intent(context, MainActivity.class); intent.setAction(INTENT_ACTION_SHOW_FOO); // Prevent activity to be re-instantiated if it is already running. // Instead, the onNewEvent() is triggered intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); getContext().startActivity(intent);