当我试图初始化一个GoogleMap对象时,我得到一个NullPointerException [英] I get a NullPointerException when I'm trying to initialise a GoogleMap object

查看:178
本文介绍了当我试图初始化一个GoogleMap对象时,我得到一个NullPointerException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在我的一个片段类中显示地图。我在地图的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 
在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)
/developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()rel =nofollow noreferrer> getChildFragmentManager():

  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_horizo​​ntal_margin
android:paddingRight =@ dimen / activity_horizo​​ntal_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆