扩展SupportMapFragment - 如何实例化新片段?

时间:2014-02-05 23:22:05

标签: java android android-fragments google-maps-api-2 supportmapfragment

MapFragmentSupportMapFragment的文档中,他们通过调用newInstance()而不是使用new SupportMapFragment()来创建新片段。

我的应用项目扩展了SupportMapFragment,我尝试在我的片段类上调用MyMapFragment.newInstance(),导致地图按预期显示,但没有我的重写方法,例如onCreateView()onActivityCreated()正在被召唤。在我尝试使用new MyMapFragment()实例化我的片段之前花了一段时间 - 而且,我的被覆盖的方法开始被调用!

我没有在我的类中覆盖newInstance(),事后看来newInstance()显然返回SupportMapFragment的实例,而不是我的扩展类的实例(duh!)。

但我的问题是 - 为什么 有一个newInstance()方法,为什么文档使用它,当它似乎与new SupportMapFragment()一样好用?使用其中一个有什么区别?我无法找到SupportMapFragment的源代码,所以......

1 个答案:

答案 0 :(得分:1)

在这种情况下,我相信newInstance方法只是空构造函数的静态工厂方法所以没有效果(虽然没有可用的源代码我们无法确定),即它可能是这样的:

public static SupportMapFragment newInstance() {
    return new SupportMapFragment();
}

为什么它存在?

  • 为了与其他newInstance(GoogleMap)方法保持一致
  • 理论上,该方法可以返回SupportMapFragment的子类,可能是针对设备或平台优化的子类
  • 如果需要设置任何参数(可能现在或将来)

由于最后一点,在创建片段时始终使用静态工厂通常是一种好习惯,将来可以将其修改为:

public static SupportMapFragment newInstance() {
    SupportMapFragment fragment = new SupportMapFragment();
    Bundle args = new Bundle();
    args.putBoolean("secretOptionNotEnabledWithNormalConstructor", true);
    fragment.setArguments(args);
    return fragment;
}