2016-12-30 25 views
3

我想要在片段中使用MapView。 这似乎很简单...我仍然不明白!ViewPager中的MapFragment NullPointer:空对象上的'void maps.ad.y.v()'参考

我启动应用程序时得到这个错误:

显示java.lang.NullPointerException:尝试上的空对象引用调用接口方法 '空隙maps.ad.yv()'

我有一个ViewPager活动:MainActivity

public class MainActivity extends AppCompatActivity { 

    private SectionsPagerAdapter mSectionsPagerAdapter; 
    private ViewPager mViewPager; 

    //...onCreate(), etc 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 
    //... 
    @Override 
    public Fragment getItem(int position) { 
     if (position == 0) { 

     return ClassicFragment.newInstance(position + 1); 
     // no problem with this one 

     } else if (position == 1) { 

     return MyMapFragment.newInstance(position + 1); 
     // here is my problem 

     } 
    } 
    } 
} 

而且2片段。 (一个简单的,和一个带有地图) 我不设法做正确的片段:MyMapFragment

public class MyMapFragment extends SupportMapFragment implements OnMapReadyCallback { 

    View rootView; 
    private MapView mapView; 
    private GoogleMap googleMap; 

    public MyMapFragment() { 
    } 

    public static MyMapFragment newInstance(int sectionNumber) { 
     MyMapFragment fragment = new MyMapFragment(); 
     return fragment; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     rootView = inflater.inflate(R.layout.fragment_map, container, false); 
     return rootView; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     mapView = (MapView) rootView.findViewById(R.id.map); 
     mapView.onCreate(savedInstanceState); 
     mapView.onResume(); 
     mapView.getMapAsync(this);//when you already implement OnMapReadyCallback in your fragment 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     googleMap = map; 
    } 
} 

最后,这里是为MyMapFragment的XML(fragment_map.xml)。

<LinearLayout 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"> 

    <com.google.android.gms.maps.MapView 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</LinearLayout> 

任何想法我做错了什么?

+0

http://stackoverflow.com/a/35496677/1584654 – GVillani82

+0

@ GVillani82我也尝试这个解决办法,但得到了同样的确切的错误:( – Fundhor

+0

我会建议使用MapView的,而不是双重嵌套片段。这可能也无意中解决你的问题 – Orbit

回答

3

我发现2个解决方案:

解决方案1:

变化SupportMapFragment片段

解决方案2:(我选择了这一个)

添加此呼叫在MyMapFragment。

super.onCreateView(inflater, container, savedInstanceState); 
+0

第二次为我工作。在maps.ad.yv()上得到一个空指针, –

1

希望这会帮助你。看一看。

public class MyActivity extends AppCompactActivity { 


private TabLayout tabLayout; 
private ViewPager viewPager; 
Toolbar mToolBar; 
FontIcon backBtnToolbar, nextBtnToolbar; 
RobotoRegularTextView titleToolbar; 
private PopupWindow settingPopUp; 
private View popUpView; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.hotspot_tabs); 





    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
    initToolbar(); 
    initPopUpView(); 
} 

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new MapFragment(), "Map"); 
    adapter.addFragment(new Map1Fragment(), "Map1"); 
    adapter.addFragment(new Map2Fragment(), "Map2"); 
    viewPager.setAdapter(adapter); 
} 

class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 

}

而且使用MapFragment作为

public class MapFragment extends Fragment 
    { 
MapView mapView; 
GoogleMap mMap; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // inflat and return the layout 

    View v = inflater.inflate(R.layout.map_fragment_layout, container, 
      false); 

    switch (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity())) { 
     case ConnectionResult.SUCCESS: 
      Toast.makeText(getActivity(), "SUCCESS", Toast.LENGTH_SHORT).show(); 
      mapView = (MapView) v.findViewById(R.id.map); 
      mapView.onCreate(savedInstanceState); 

      if (mapView != null) { 
       mMap = mapView.getMap(); 
       mMap.getUiSettings().setMyLocationButtonEnabled(true); 
       mMap.animateCamera(CameraUpdateFactory.zoomTo(17.0f)); 



      } 
      break; 
     case ConnectionResult.SERVICE_MISSING: 
      Toast.makeText(getActivity(), "SERVICE MISSING", Toast.LENGTH_SHORT).show(); 
      break; 
     case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: 
      Toast.makeText(getActivity(), "UPDATE REQUIRED", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      Toast.makeText(getActivity(), GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()), Toast.LENGTH_SHORT).show(); 
    } 



    return v; 
} 

}

<com.google.android.gms.maps.MapView 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 
相关问题