试图把地图中的片段活动 [英] Trying to put a map in a fragment activity
问题描述
在我的Android应用我显示扩展片段的类中的谷歌地图的地图。
目前,只有地图所示,但我不能够获得来自SupportFragmentManager地图。
我所做的就是适应浮现在我的应用程序的Android Studio中MapActivity。
下面是我的code:
公共类TAB2扩展片段{ 私人GoogleMap的MMAP; //可能为空,如果谷歌Play服务APK不可用。 私人双latitud_del_hotel,longitud_del_hotel;
私人字符串nombre_del_hotel;
私人GoogleMap的地图; @覆盖
公共查看onCreateView(LayoutInflater吹气,@Nullable的ViewGroup容器,@Nullable捆绑savedInstanceState){
视图V = inflater.inflate(R.layout.tab_2,集装箱,FALSE);
// setUpMapIfNeeded();
返回伏;
} @覆盖
公共无效onActivityCreated(包状态){
super.onActivityCreated(州);
setUpMapIfNeeded();
} setUpMapIfNeeded私人无效(){
//做一个空检查确认,我们还没有实例化地图。
如果(MMAP == NULL){
//尝试获取来自SupportMapFragment地图。
MMAP =((SupportMapFragment)getActivity()。getSupportFragmentManager()。findFragmentById(R.id.map))
.getMap();
//检查是否成功地获得地图。
如果(MMAP!= NULL){
setUpMap();
}
}
} 私人无效setUpMap(){
mMap.addMarker(。新的MarkerOptions()位置(经纬度新(0,0))标题(标记)。);
}}
我得到一个例外:显示java.lang.NullPointerException
在com.solinpromex.elpasojuarezexperience.Tab2.setUpMapIfNeeded
我曾尝试调用方法 setUpMapIfNeeded()
从两种方法:onCreateView和onActivityCreated。这两种情况下抛出异常。
如果我删除 setUpMapIfNeeded()
则显示的地图,但我想添加地图对象。
任何帮助是值得欢迎的。
修改
从logcat的完整异常日志:
09-16 00:34:09.614 13999-13999 / com.solinpromex.elpasojuarezexperience E / AndroidRuntime:致命异常:主要
工艺:com.solinpromex.elpasojuarezexperience,PID:13999
显示java.lang.NullPointerException
在com.solinpromex.elpasojuarezexperience.Tab2.setUpMapIfNeeded(Tab2.java:66)
在com.solinpromex.elpasojuarezexperience.Tab2.onActivityCreated(Tab2.java:57)
在android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1797)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:979)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
在android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
在android.support.v4.view.ViewPager.populate(ViewPager.java:1105)
在android.support.v4.view.ViewPager.populate(ViewPager.java:951)
在android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1473)
在android.view.View.measure(View.java:16857)
在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621)
在android.widget.LinearLayout.measureVertical(LinearLayout.java:742)
在android.widget.LinearLayout.onMeasure(LinearLayout.java:607)
在android.view.View.measure(View.java:16857)
在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
在android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
在android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
在android.view.View.measure(View.java:16857)
在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621)
在android.widget.LinearLayout.measureVertical(LinearLayout.java:742)
在android.widget.LinearLayout.onMeasure(LinearLayout.java:607)
在android.view.View.measure(View.java:16857)
在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
在android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
在android.view.View.measure(View.java:16857)
在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621)
在android.widget.LinearLayout.measureVertical(LinearLayout.java:742)
在android.widget.LinearLayout.onMeasure(LinearLayout.java:607)
在android.view.View.measure(View.java:16857)
在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
在android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
在com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java:2332)
在android.view.View.measure(View.java:16857)
在android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2271)
在android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1334)
在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1532)
在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1211)
在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6282)
在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:788)
在android.view.Choreographer.doCallbacks(Choreographer.java:591)
在android.view.Choreographer.doFrame(Choreographer.java:560)
在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:774)
在android.os.Handler.handleCallback(Handler.java:808)
在android.os.Handler.dispatchMessage(Handler.java:103)
在android.os.Looper.loop(Looper.java:193)
在android.app.ActivityThread.main(ActivityThread.java:5299)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:825)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
在dalvik.system.NativeStart.main(本机方法)
编辑2
版式文件tab_2
<?XML版本=1.0编码=UTF-8&GT?;
<的RelativeLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent> <的LinearLayout
机器人:方向=垂直
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT> <片段的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:名字=com.google.android.gms.maps.MapFragment
机器人:ID =@ + ID /图
机器人:layout_alignParentTop =真
机器人:layout_alignParentBottom =真
机器人:layout_alignParentLeft =真
机器人:layout_alignParentRight =真/>
< / LinearLayout中>
< / RelativeLayout的>
如果您使用最新的 GooglePlayServices
您可以使用 getMapAsync
功能,它会自动初始化地图系统和视图。
另外在布局使用图形页面
这是我如何加入片段地图。
公共类MapFragment扩展片段实现OnMa $ P $ {padyCallback @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
鉴于= inflater.inflate(R.layout.fragment_tab_fragment1,集装箱,FALSE); FragmentManager经理= getFragmentManager();
FragmentTransaction交易= manager.beginTransaction();
SupportMapFragment片段=新SupportMapFragment();
transaction.add(R.id.mapView,片段);
器transaction.commit(); fragment.getMapAsync(本); 返回视图。
} @覆盖
公共无效onMa pready(GoogleMap的地图){
//地图已准备就绪
map.addMarker(...
}
}
以xml
< com.google.android.gms.maps.MapView
机器人:ID =@ + ID /图形页面
类=com.google.android.gms.maps.SupportMapFragment
机器人:layout_width =match_parent
机器人:layout_height =match_parent/>
要使用最新的GooglePlayService把这个在gradle这个
编译com.google.android.gms:发挥服务:8.3.0
In my Android app I am showing a Google Maps map inside a class that extends Fragment.
At the moment, only the map is shown, but I am not able to obtain the map from the SupportFragmentManager.
What I have done is adapting the MapActivity that comes within Android Studio to my app.
Here is my code:
public class Tab2 extends Fragment {
private GoogleMap mMap; // Might be null if Google Play services APK is not available.
private double latitud_del_hotel, longitud_del_hotel;
private String nombre_del_hotel;
private GoogleMap map;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.tab_2, container, false);
//setUpMapIfNeeded();
return v;
}
@Override
public void onActivityCreated(Bundle state) {
super.onActivityCreated(state);
setUpMapIfNeeded();
}
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) getActivity().getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
}
}
I am getting an exception: java.lang.NullPointerException at com.solinpromex.elpasojuarezexperience.Tab2.setUpMapIfNeeded
I have tried calling method setUpMapIfNeeded()
from both methods: onCreateView and onActivityCreated. Both cases throw the exception.
If I remove setUpMapIfNeeded()
then the map is shown, but I want to add map objects.
Any help is welcome..
EDIT
Complete exception log from logcat:
09-16 00:34:09.614 13999-13999/com.solinpromex.elpasojuarezexperience E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.solinpromex.elpasojuarezexperience, PID: 13999
java.lang.NullPointerException
at com.solinpromex.elpasojuarezexperience.Tab2.setUpMapIfNeeded(Tab2.java:66)
at com.solinpromex.elpasojuarezexperience.Tab2.onActivityCreated(Tab2.java:57)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1797)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:979)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1105)
at android.support.v4.view.ViewPager.populate(ViewPager.java:951)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1473)
at android.view.View.measure(View.java:16857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:742)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:607)
at android.view.View.measure(View.java:16857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
at android.view.View.measure(View.java:16857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:742)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:607)
at android.view.View.measure(View.java:16857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
at android.view.View.measure(View.java:16857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:742)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:607)
at android.view.View.measure(View.java:16857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5378)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2332)
at android.view.View.measure(View.java:16857)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2271)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1334)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1532)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1211)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6282)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788)
at android.view.Choreographer.doCallbacks(Choreographer.java:591)
at android.view.Choreographer.doFrame(Choreographer.java:560)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
at dalvik.system.NativeStart.main(Native Method)
EDIT 2
Layout file tab_2
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"
android:id="@+id/map"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true" />
</LinearLayout>
</RelativeLayout>
If you use the latest GooglePlayServices
you can use the getMapAsync
function which will automatically initializes the maps system and the view.
Also use a MapView
in the layout
This is how I added the map in fragment.
public class MapFragment extends Fragment implements OnMapReadyCallback {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_tab_fragment1, container, false);
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
SupportMapFragment fragment = new SupportMapFragment();
transaction.add(R.id.mapView, fragment);
transaction.commit();
fragment.getMapAsync(this);
return view;
}
@Override
public void onMapReady(GoogleMap map) {
//map is ready
map.addMarker(...
}
}
in xml
<com.google.android.gms.maps.MapView
android:id="@+id/mapView"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
To use the latest GooglePlayService put this in gradle
compile 'com.google.android.gms:play-services:8.3.0'
这篇关于试图把地图中的片段活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!