当我试图初始化一个GoogleMap对象时,我得到一个NullPointerException [英] I get a NullPointerException when I'm trying to initialise a GoogleMap object
问题描述
我试图在我的一个片段类中显示地图。我在地图的XML类中创建了一个片段,并像这样使用它:
@Override
public View onCreateView (LayoutInflater inflater,ViewGroup容器,
Bundle savedInstanceState){
查看rootView = inflater.inflate(R.layout.fragment_profile,container,false);
GoogleMap mapFragment =((SupportMapFragment)getFragmentManager()
.findFragmentById(R.id.map))。getMap();
Marker hamburg = mapFragment.addMarker(new MarkerOptions()。position(HAMBURG)
.title(Hamburg));
Marker kiel = mapFragment.addMarker(new MarkerOptions()
.position(KIEL)
.title(Kiel)
.snippet(Kiel is cool)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.icon)));
这是基于我在网上找到的教程。问题是我不断得到一个NullPointerException,我初始化mapFragment,我不知道为什么。有谁知道为什么会发生这种情况?
非常感谢任何帮助。
LogCat:
java.lang.NullPointerException
$由于您在Fragment中使用嵌套的SupportMapFragment,因此您需要使用 /developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()rel =nofollow noreferrer> getChildFragmentManager():
在com.example.sv_laptop03.snapchain.Profile.onCreateView(Profile.java:65)
在android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
在android.support .v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
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.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java :1105)
at android.support.v4.view.ViewPager.populate(V iewPager.java:951)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1473)
at android.view.View.measure(View.java:16831)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View .java:16831)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
at android。 widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16831)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy .impl.PhoneWindow $ DecorVi ew.onMeasure(PhoneWindow.java:2586)
at android.view.View.measure(View.java:16831)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2189)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1352)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1535)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl .java:1249)
at android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6364)
at android.view.Choreographer $ CallbackRecord.run(Choreographer.java:791)
在android.view.Choreographer.doCallbacks(Choreographer.java:591)
在android.view.Choreographer.doFrame(Choreographer.java:561)
在android.view.Choreographer $ FrameDisplayEventReceiver.run( Choreographer.java:777)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at an droid.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method )
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method)
GoogleMap mapFragment =((SupportMapFragment)getChildFragmentManager()
.findFragmentById(R.id.map))。getMap();
然而,尽管这样做会更好,但是您的Fragment可以扩展SupportMapFragment,不需要嵌套片段:
public class MyMapFragment extends SupportMapFragment
实现OnMapReadyCallback {
私人GoogleMap mMap;
私人标记标记;
$ b public MyMapFragment(){
}
@Override
public void onResume(){
super.onResume( );
setUpMapIfNeeded();
$ b $ private void setUpMapIfNeeded(){
if(mMap == null){
getMapAsync(this);
}
}
@Override
public void onMapReady(GoogleMap googleMap){
mMap = googleMap;
setUpMap();
}
private void setUpMap(){
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mMap.getUiSettings()。setMapToolbarEnabled(false);
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener(){
$ b @Override
public void onMapClick(LatLng point){
//删除先前放置的标记
if(marker!= null){
marker.remove();
}
//将标记放置在用户只需点击
marker = mMap.addMarker(new MarkerOptions()。position(point).title(Marker)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
}
});
$ b编辑:
以下是一个嵌套的SupportMapFragment的完整工作片段:
import com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.Marker;
导入com.google.android.gms.maps.model.MarkerOptions;
public class MainActivityFragment extends Fragment {
private final LatLng HAMBURG = new LatLng(53.558,9.927);
private final LatLng KIEL = new LatLng(53.551,9.993);
私人GoogleMap地图;
public MainActivityFragment(){
}
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup容器,
Bundled savedInstanceState){
查看rootView = inflater.inflate(R.layout.fragment_main,container,false);
$ b map =((SupportMapFragment)getChildFragmentManager()。findFragmentById(R.id.map))。getMap();
map.setMyLocationEnabled(true);
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
map.getUiSettings()。setMapToolbarEnabled(false);
Marker hamburg = map.addMarker(new MarkerOptions()。position(HAMBURG)
.title(Hamburg));
Marker kiel = map.addMarker(new MarkerOptions()
.position(KIEL)
.title(Kiel)
.snippet(Kiel is cool)
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher)));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG,15));
map.animateCamera(CameraUpdateFactory.zoomTo(10),2000,null);
返回rootView;
}
}
fragment_main.xml:
< RelativeLayout xmlns:android =http://schemas.android.com/apk/res/android
xmlns:tools = http://schemas.android.com/toolsandroid:layout_width =match_parent
android:layout_height =match_parentandroid:paddingLeft =@ dimen / activity_horizontal_margin
android:paddingRight =@ dimen / activity_horizontal_margin
android:paddingTop =@ dimen / activity_vertical_margin
android:paddingBottom =@ dimen / activity_vertical_margintools:context =。MainActivityFragment>
片段
android:id =@ + id / map
android:layout_width =match_parent
android:layout_height =match_parent
class =com.google.android.gms.maps.SupportMapFragment/>
< / RelativeLayout>
结果:
编辑2:
以下是完整的类代码,基于这个答案中的第一个解决方案,它不使用嵌套的SupportMapFragment,使用ViewPager和三个选项卡,而是具有片段范围SupportMapFragment:
import android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentManager;
导入android.support.v4.app.FragmentPagerAdapter;
导入android.support.v4.app.FragmentTransaction;
导入android.support.v4.view.ViewPager;
导入android.support.v7.app.ActionBar;
导入android.os.Bundle;
导入android.support.v7.app.AppCompatActivity;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.View;
导入android.view.ViewGroup;
导入android.widget.TextView;
import com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.Marker;
导入com.google.android.gms.maps.model.MarkerOptions;
import java.util.Locale;
public class MainActivity extends AppCompatActivity implements ActionBar.TabListener {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
//用分段适配器设置ViewPager。
mViewPager =(ViewPager)findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
final ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override
public void onPageSelected(int position){
actionBar.setSelectedNavigationItem(position);
}
});
for(int i = 0; i< mSectionsPagerAdapter.getCount(); i ++){
actionBar.addTab(actionBar.newTab()。setText(mSectionsPagerAdapter.getPageTitle(i)) .setTabListener(本));
$ b @Override
public boolean onCreateOptionsMenu(菜单菜单){
//充值菜单;这会将项目添加到操作栏(如果存在)。
getMenuInflater()。inflate(R.menu.menu_main,menu);
返回true;
@Override
public boolean onOptionsItemSelected(MenuItem item){
int id = item.getItemId();
if(id == R.id.action_settings){
return true;
}
返回super.onOptionsItemSelected(item);
$ b @Override
public void onTabSelected(ActionBar.Tab tab,FragmentTransaction ft){
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab,FragmentTransaction ft){
}
@覆盖
public void onTabReselected(ActionBar.Tab tab,FragmentTransaction ft){
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm){
super(fm);
}
@Override
public Fragment getItem(int position){
switch(position){
case 0:
返回PlaceholderFragment.newInstance(位置+ 1);
案例1:
返回PlaceholderFragment.newInstance(position + 1);
案例2:
返回MapTabFragment.newInstance(position + 1);
}
返回null;
}
@Override
public int getCount(){
//显示3个页面。
返回3;
}
@Override
public CharSequence getPageTitle(int position){
Locale l = Locale.getDefault();
switch(position){
case 0:
return getString(R.string.title_section1).toUpperCase(l);
case 1:
return getString(R.string.title_section2).toUpperCase(l);
案例2:
return getString(R.string.title_section3).toUpperCase(l);
}
返回null;
}
}
public static class PlaceholderFragment extends Fragment {
private static final String ARG_SECTION_NUMBER =section_number;
TextView文本;
public static PlaceholderFragment newInstance(int sectionNumber){
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER,sectionNumber);
fragment.setArguments(args);
return fragment;
$ b $ public PlaceholderFragment(){
}
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,
Bundled savedInstanceState){
查看rootView = inflater.inflate(R.layout.fragment_main,container,false);
text =(TextView)rootView.findViewById(R.id.section_label);
text.setText(placeholder);
返回rootView;
public static class MapTabFragment extends SupportMapFragment implements
OnMapReadyCallback {
private final LatLng HAMBURG = new LatLng(53.558,9.927 );
private final LatLng KIEL = new LatLng(53.551,9.993);
private static final String ARG_SECTION_NUMBER =section_number;
私有GoogleMap mMap;
私人标记标记;
public static MapTabFragment newInstance(int sectionNumber){
MapTabFragment fragment = new MapTabFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER,sectionNumber);
fragment.setArguments(args);
return fragment;
$ b $ public MapResponse(){
@Override
public void onResume(){
super.onResume ();
Log.d(MyMap,onResume);
setUpMapIfNeeded();
private void setUpMapIfNeeded(){
if(mMap == null){
Log.d(MyMap ,setUpMapIfNeeded);
getMapAsync(this);
$ b @Override
public void onMapReady(GoogleMap googleMap){
Log.d(MyMap,onMapReady);
mMap = googleMap;
setUpMap();
}
private void setUpMap(){
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mMap.getUiSettings()。setMapToolbarEnabled(false);
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mMap.getUiSettings()。setMapToolbarEnabled(false);
Marker hamburg = mMap.addMarker(new MarkerOptions()。position(HAMBURG)
.title(Hamburg));
Marker kiel = mMap.addMarker(new MarkerOptions()
.position(KIEL)
.title(Kiel)
.snippet(Kiel is cool)
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher)));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG,15));
mMap.animateCamera(CameraUpdateFactory.zoomTo(10),2000,null);
$ b}
}
}
layout xml:
< android.support.v4.view.ViewPager xmlns:android =http:// schemas .android.com / apk / res / android
xmlns:tools =http://schemas.android.com/toolsandroid:id =@ + id / pager
android:layout_width =match_parentandroid:layout_height =match_parent
tools:context =。MainActivity/>
结果,我可以成功切换到所有标签,并且地图显示没有错误:
I'm trying to have a map displayed in one of my fragment classes. I made a fragment in the XML class for the map and using it like this:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_profile, container, false); GoogleMap mapFragment = ((SupportMapFragment) getFragmentManager() .findFragmentById(R.id.map)).getMap(); Marker hamburg = mapFragment.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = mapFragment.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.drawable.icon)));
This is based off a tutorial I found online. The problem is I keep getting a NullPointerException where I initialise mapFragment and I'm not sure why. Does anyone know why this might be happening?
Very grateful for any help.
LogCat:
java.lang.NullPointerException at com.example.sv_laptop03.snapchain.Profile.onCreateView(Profile.java:65) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 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.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 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:16831) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16831) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) at android.view.View.measure(View.java:16831) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2586) at android.view.View.measure(View.java:16831) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2189) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1352) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1535) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6364) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791) at android.view.Choreographer.doCallbacks(Choreographer.java:591) at android.view.Choreographer.doFrame(Choreographer.java:561) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777) at android.os.Handler.handleCallback(Handler.java:730) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:176) at android.app.ActivityThread.main(ActivityThread.java:5419) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) at dalvik.system.NativeStart.main(Native Method)
解决方案Since you're using a nested SupportMapFragment inside of a Fragment, you need to use getChildFragmentManager():
GoogleMap mapFragment = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.map)).getMap();
However, while that would work, you would be better off having your Fragment extend SupportMapFragment, that way you wouldn't need to have nested Fragments:
public class MyMapFragment extends SupportMapFragment implements OnMapReadyCallback { private GoogleMap mMap; private Marker marker; public MyMapFragment () { } @Override public void onResume() { super.onResume(); setUpMapIfNeeded(); } private void setUpMapIfNeeded() { if (mMap == null) { getMapAsync(this); } } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; setUpMap(); } private void setUpMap() { mMap.setMyLocationEnabled(true); mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); mMap.getUiSettings().setMapToolbarEnabled(false); mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng point) { //remove previously placed Marker if (marker != null) { marker.remove(); } //place marker where user just clicked marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA))); } }); } }
Edit:
Here is a fully working Fragment with a nested SupportMapFragment:
import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; public class MainActivityFragment extends Fragment { private final LatLng HAMBURG = new LatLng(53.558, 9.927); private final LatLng KIEL = new LatLng(53.551, 9.993); private GoogleMap map; public MainActivityFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); map = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap(); map.setMyLocationEnabled(true); map.setMapType(GoogleMap.MAP_TYPE_HYBRID); map.getUiSettings().setMapToolbarEnabled(false); Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = map.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.mipmap.ic_launcher))); map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); return rootView; } }
fragment_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivityFragment"> <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" /> </RelativeLayout>
Result:
Edit 2:
Here is the full class code that worked for me with a ViewPager and three tabs, based on the first solution in this answer, which does not use a nested SupportMapFragment, and instead has the Fragment extent SupportMapFragment:
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import java.util.Locale; public class MainActivity extends AppCompatActivity implements ActionBar.TabListener{ SectionsPagerAdapter mSectionsPagerAdapter; ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); final ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); } }); for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this)); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { mViewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { } public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return PlaceholderFragment.newInstance(position + 1); case 1: return PlaceholderFragment.newInstance(position + 1); case 2: return MapTabFragment.newInstance(position + 1); } return null; } @Override public int getCount() { // Show 3 total pages. return 3; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.title_section1).toUpperCase(l); case 1: return getString(R.string.title_section2).toUpperCase(l); case 2: return getString(R.string.title_section3).toUpperCase(l); } return null; } } public static class PlaceholderFragment extends Fragment { private static final String ARG_SECTION_NUMBER = "section_number"; TextView text; public static PlaceholderFragment newInstance(int sectionNumber) { PlaceholderFragment fragment = new PlaceholderFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); text = (TextView) rootView.findViewById(R.id.section_label); text.setText("placeholder"); return rootView; } } public static class MapTabFragment extends SupportMapFragment implements OnMapReadyCallback { private final LatLng HAMBURG = new LatLng(53.558, 9.927); private final LatLng KIEL = new LatLng(53.551, 9.993); private static final String ARG_SECTION_NUMBER = "section_number"; private GoogleMap mMap; private Marker marker; public static MapTabFragment newInstance(int sectionNumber) { MapTabFragment fragment = new MapTabFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } public MapTabFragment() { } @Override public void onResume() { super.onResume(); Log.d("MyMap", "onResume"); setUpMapIfNeeded(); } private void setUpMapIfNeeded() { if (mMap == null) { Log.d("MyMap", "setUpMapIfNeeded"); getMapAsync(this); } } @Override public void onMapReady(GoogleMap googleMap) { Log.d("MyMap", "onMapReady"); mMap = googleMap; setUpMap(); } private void setUpMap() { mMap.setMyLocationEnabled(true); mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); mMap.getUiSettings().setMapToolbarEnabled(false); mMap.setMyLocationEnabled(true); mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); mMap.getUiSettings().setMapToolbarEnabled(false); Marker hamburg = mMap.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = mMap.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.mipmap.ic_launcher))); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); mMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); } } }
layout xml:
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" />
Result, I'm able to switch to all tabs successfully, and the map shows up with no errors:
这篇关于当我试图初始化一个GoogleMap对象时,我得到一个NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!