getSupportLoaderManager()在不同的片段中使用相同的ID?

dan*_*elz 8 android android-cursor android-listfragment android-loadermanager android-support-library

我在FragmentActivity中使用多个ListFragments创建一个viewPager.为了填充不同的列表视图,我在加载器中获得LoaderManager和initiliaze.我希望每个片段都有一个唯一的LoaderManager,但是,片段没有getSupportLoaderManager()方法,所以我需要调用父片段活动:

getActivity().getSupportLoaderManager()
Run Code Online (Sandbox Code Playgroud)

我的Loaders在不同片段中识别的这种方法的问题与彼此冲突.当你已经在一个片段中拥有多个加载器id时,它会变得有点麻烦.那么有没有办法为每个片段获取一个唯一的LoaderManager,而不是调用父片段?我基本上希望能够在多个片段上使用相同的id.

谢谢

fr1*_*50n 14

是的,您可以使用:android.support.v4.app.Fragment.getLoaderManager() 为每个片段获取一个唯一的片段,这意味着您可以从零开始您的ID.

  • @States它返回`android.support.v4.app.LoaderManager`,ergo a**support**LoaderManager(它确实不存在).来自`android.app.Fragment`的正常片段返回一个`android.app.FragmentManager`(**不是**支持实现).所以使用这个mehtod是值得的. (9认同)

Sni*_*las 7

评论太长了,但我会在你的问题评论中继续我们的讨论.

你应该采取相反的方式:实际上ID是活动的本地,而不是片段.

是的,片段和活动之间的耦合很差.大多数来自片段的回调将片段链接到一个活动(即使使用它不是那么干净的接口),以及将参数从活动传递到片段:您必须使用静态工厂方法来构建片段并设置其参数通过setArgs.

而你的问题就是这样一个耦合问题:活动的每个片段中的加载器ID不应该与所有其他片段使用的ID重叠.这也是一个耦合约束,因为我们对位于活动级别的片段有一个约束.你是对的,这可能是Android在片段级别通过向片段引入本地加载器来解决的.

然而,可能有优雅的方法来解决这个问题并保留相对解耦方案.例如,您可以创建一个ID工厂,为片段内的加载器生成"好"ID并防止重叠(id ++将是完美的):

public interface IdFactory {
   public int createId();
}
Run Code Online (Sandbox Code Playgroud)

然后在每个片段内,当你需要一个加载器:

this.newLoaderId = idFactory.createId();
Run Code Online (Sandbox Code Playgroud)

使用以下三种策略之一,所有碎片可以共享工厂:

  • 单身人士 每个片段都将通过访问IdFactory

    IdFactory idFactory = DefaultIdFactory.getInstance();

  • 创建一个实现IdFactory的类的单个实例,使该类的实例成为应用程序类中的数据字段,并为其提供一个getter.每个片段都可以使用它来访问它

    IdFactory idFactory =((MyApplication)getActivity().getApplicationContext()).getIdFactory();

  • 在活动级别创建工厂.任何一个活动都可以实现IdFactory接口,或者它们可以提供内部类来执行它.然后每个片段将使用以下方式访问工厂:

    IdFactory idFactory = getActivity().getIdFactory(); //或IdFactory idFactory =(IdFactory)getActivity();

第三种选择是更好的,因为它将遵循您的确切需要,并将遵循活动生命周期,允许您的工厂被垃圾收集.

还有其他选项,如使用RoboGuice或Dagger或任何其他依赖注入框架,但这不太标准.