【问题标题】:How to manage multiple Fragments with one single Activity?如何通过一个 Activity 管理多个 Fragment?
【发布时间】:2016-02-01 12:34:54
【问题描述】:

关于管理片段的快速问题。 现在我正在使用这个结构:

我有一个 MainActivity 和多个片段,即LoginFragmentInventoryFragmentNetworkFragment 等。我正在使用FragmentManager 进行交易,到目前为止效果很好。 但我遇到了一个问题。它是关于处理从 Fragments 到 Activity 的回调。

我正在使用接口回调的简单方法,我在 Fragment 中定义并在 MainActivity 中实现,但是随着我得到越来越多的 Fragment,接口变得非常拥挤。

它看起来像这样

public class MainActivity extends AppCompatActivity implements LoginFragmentCallback, InventoryFragmentCallback, NetworkFragmentCallback, AnyFragmentCallback

所以我的问题是如何更好地管理 Fragment 和 Activity 之间的通信?

感谢您的帮助!


编辑 1:我知道如何通过用户 @Rohit5k2 的评论来解决这个问题

在我的 MainActivity 中我创建了一个公共方法

public class MainActivity extends AppCompat{
  public callMe();
} 

在我的 Fragment 中,我可以通过

调用此方法
public class AnyFragment extends Fragment{
  private void someMethod(){
    ((MainActivity)getActivity()).callMe();
}

似乎解决了我认为的问题。还是不好?有了这个,我不需要实现任何回调,因为我有对带有 Fragments 的 MainActivity 的引用。

【问题讨论】:

  • 我认为这是您的最佳选择。这比在活动中保留对片段的引用要好。
  • 为什么不只在片段中实现接口呢?只实施需要的。
  • 使用本地广播。所有片段都应该向主要活动广播事件。主要活动可以在接收到事件后更新 UI 或决定下一步要执行什么操作。 *.com/questions/8802157/…
  • 嗯,我想这是一个有很多可能答案的问题。我倾向于让我的活动尽可能的精简,而是嵌套相关的片段。使用回调或 setTargetFrament 与父片段交谈
  • 关于您的编辑,我建议您在片段的 onAttatch 方法中确保活动是 instanceof MainActivity。或者更好的是,让活动实现一个回调接口并以相同的方式进行检查。这样您就可以在以后添加其他活动,同时仍然可以重用您的片段

标签: android android-fragments


【解决方案1】:

我自己喜欢这个活动+很多片段,所以我正在使用这种方法。

Activity实现接口

 interface ControllerAccess {
    <T> getController(Class<T> clazz);
 }

我有一个Map&lt;Class,Object&gt; 在活动中。在onCreate 中,我用片段特定的控制器类填充它,比如你的LoginFragmentCallback 等。

map.put(LoginFragmentCallback.class,new LoginFragmentCallbackImpl());

接口实现是这样的

public <T> T getController(Class<T> clazz) {
   return (T) map.get(clazz);
 } 

在片段中我做了类似的东西

LoginFragmentCallback callback;

void onAttach(Activity activity) {

    if (activity instanceof ControllerAccess) {
        callback = (ControllerAccess)activity.getController(LoginFragmentCallback.class);  
    }
}

【讨论】:

    【解决方案2】:

    如果您需要将数据从Fragment 发送到Activity,您可以使用getActivity 并将其投射到您的主要活动中。

    如果你不得不去另一个方向,也许你做错了什么。 Fragment 必须足够独立于它的托管活动。

    另一个建议是使用Activity 登录,然后启动您的主要登录。

    对于其他类型的通信,我推荐 EventBus: https://github.com/greenrobot/EventBus

    【讨论】:

    • 感谢您的建议。似乎这是一个有效的解决方案。我的心态是使用一个单一的活动并将工作分成碎片。如果没有其他建议,我稍后会接受。
    【解决方案3】:
    public class MainActivity extends FragmentActivity implements FragmentInteractionListener {
    
     //your main activity code
    }
    
    public class Fragment1 extends Fragment {
    
    //you can get resource from MainActivity using below code
    (MainActivity) getActivity().getSomeInfo())
    
    }
    

    【讨论】: