我用了一个活动谷歌地图API V2在地图上的第二位置王氏下拉导航。
我务实添加地图,如:
mMapFragment = supportMapFragment.newInstance();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.placeHolder, mMapFragment, TAG_MAP)
.commit();
我想获得的GoogleMap ovject,如文档https://developers.google.com/maps/documentation/android/map说,它应该做mMapFragment.getMap()
但它返回null。
根据http://developer.android.com/reference/com/google/android/gms/maps/SupportMapFragment.html它,如果片段没有经过onCreateView生命周期事件不见了返回null。
我怎样才能知道,每当这个片段准备好了吗?
编辑:我发现这我怎么知道地图是准备使用SupportMapFragment时习惯?
重写onActivityCreated似乎是一个解决方案,但后来我不得不通过构造函数,而不是用的newInstance(),这有什么区别实例片段?
我首选的方法是使用一个回调以获取从信号Fragment
。 此外,这是在由Android提出的推荐方法与活动沟通
对于你的榜样,在你的Fragment
,添加接口和注册。
public static interface OnCompleteListener {
public abstract void onComplete();
}
private OnCompleteListener mListener;
public void onAttach(Context context) {
super.onAttach(context);
try {
this.mListener = (OnCompleteListener)context;
}
catch (final ClassCastException e) {
throw new ClassCastException(context.toString() + " must implement OnCompleteListener");
}
}
现在,实现你的这个界面 Activity
public class MyActivity extends FragmentActivity implements MyFragment.OnCompleteListener {
//...
public void onComplete() {
// After the fragment completes, it calls this callback.
// setup the rest of your layout now
mMapFragment.getMap()
}
}
现在,无论你的Fragment
意味着它的加载,通知你的Activity
,它的准备。
@Override
protected void onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// create your fragment
//...
// signal that you're done and tell the Actvity to call getMap()
mListener.onComplete();
}
EDIT 2017年12月5日 onAttach(活动活性) 弃用 ,使用onAttach(上下文上下文)来代替。 上面的代码进行调整。
除了柯克的答案 :因为public void onAttach(Activity activity)
已经过时,你现在可以简单地使用:
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity activity;
if (context instanceof Activity){
activity=(Activity) context;
try {
this.mListener = (OnCompleteListener)activity;
} catch (final ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnCompleteListener");
}
}
}
其余保持不变......有人可能会想使用(Fragment sender)
虽然作为参数,并总是通过this
。
我不知道我完全理解你的问题,但我已经在那里我使用导航下拉菜单类似的设置。 下面是我的什么作品:
1。)从XML文件加载片段并调用setupMapIfNeeded()
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.basicMap);
setUpMapIfNeeded();
下面是引用的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/basicMap"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
2。)然后被设定在地图上(对于isGoogleMapsInstalled(细节),参见这个问题 )
private void setUpMapIfNeeded()
{
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null)
{
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.basicMap)).getMap();
// Check if we were successful in obtaining the map.
if(isGoogleMapsInstalled())
{
if (mMap != null)
{
mMap.setOnCameraChangeListener(getCameraChangeListener());
mMap.setInfoWindowAdapter(new MyCustomInfoWindowAdapter(this));
}
}
else
{
MapConstants.showDialogWithTextAndButton(this, R.string.installGoogleMaps, R.string.install, false, getGoogleMapsListener());
}
}
}
3)确保您也呼吁从的onResume setUpMapIfNeeded()():
public void onResume()
{
super.onResume();
setUpMapIfNeeded();
}
如果你想这样做没有任何监听器:
添加片段与TAG
supportFragmentManager
.beginTransaction()
.add(R.id.pagerContainer, UniversalWebViewFragment.newInstance(UniversalWebViewFragment.YOUTUBE_SERACH_URL+"HD trailers"),
"UniversalWebView")
.disallowAddToBackStack()
.commit()
创建托管Activity类要加载片段后调用的公共方法 。 在这里,我回电话我例如片段的方法
public fun loadURL() {
val webViewFragment = supportFragmentManager
.findFragmentByTag("UniversalWebView")
as UniversalWebViewFragment
webViewFragment.searchOnYoutube("Crysis Warhead")
}
现在里面onViewCreated
您的片段的方法,你可以简单地调用这样的主机活动的公共方法:
(activity as HomeActivity ).loadURL()