Yoh*_* AI 5 android google-maps google-maps-android-api-2
函数setUpMapIfNeeded()中的getFragmentManager返回 null pointer exception。我将片段与activity_main.xml分开放置,这是我的代码:
activity_main.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.yai.testmap.MainActivity"
tools:ignore="MergeRootFrame" />
Run Code Online (Sandbox Code Playgroud)
fragment_main.xml:
<?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">
<!-- MapView-->
<com.google.android.gms.maps.MapView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
/>
Run Code Online (Sandbox Code Playgroud)
这是我的* .java文件:
包com.yai.testmap;
导入android.support.v7.app.ActionBarActivity;
导入android.support.v4.app.Fragment;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.View;
导入android.view.ViewGroup;
/ *错误报告* /
导入android.util.Log;
/ *使用此项目导入下拉列表* /
导入android.widget.CheckBox;
导入android.widget.Spinner;
导入android.widget.Toast;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.AdapterView.OnItemSelectedListener;
导入com.google.android.gms.common.ConnectionResult;
导入com.google.android.gms.common.GooglePlayServicesNotAvailableException;
导入com.google.android.gms.common.GooglePlayServicesUtil;
/ *导入GOOGLE地图* /
导入com.google.android.gms.maps.GoogleMap;
导入com.google.android.gms.maps.MapFragment;
导入com.google.android.gms.maps.MapsInitializer;
导入com.google.android.gms.maps.SupportMapFragment;
导入com.google.android.gms.maps.MapView;
/ *对于GOOGLE MAP TYPE * /
导入静态com.google.android.gms.maps.GoogleMap.MAP_TYPE_HYBRID;
导入静态com.google.android.gms.maps.GoogleMap.MAP_TYPE_NONE;
导入静态com.google.android.gms.maps.GoogleMap.MAP_TYPE_NORMAL;
导入静态com.google.android.gms.maps.GoogleMap.MAP_TYPE_SATELLITE;
导入静态com.google.android.gms.maps.GoogleMap.MAP_TYPE_TERRAIN;
公共类MainActivity扩展ActionBarActivity实现OnItemSelectedListener {
私有静态MapView mMapView;
私有静态MapFragment mMapFragment;
私有静态GoogleMap mGoogleMap;
私有静态CheckBox mTrafficCheckbox,mLocationCheckbox,mBuildingCheckbox,mIndoorCheckbox;
公共静态类PlaceholderFragment扩展Fragment {
公共PlaceholderFragment(){
}
@Override
公共视图onCreateView(LayoutInflater充气机,ViewGroup容器,
捆绑保存的InstanceState){
查看rootView = inflater.inflate(R.layout.fragment_main,容器,
假);
Spinner spinner =(Spinner)rootView.findViewById(R.id.spinnerOption);
ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(),R.array.spinner_option_string,android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(((OnItemSelectedListener)getActivity());
mTrafficCheckbox =(CheckBox)rootView.findViewById(R.id.checkbox_traffic);
mLocationCheckbox =(CheckBox)rootView.findViewById(R.id.checkbox_location);
mBuildingCheckbox =(CheckBox)rootView.findViewById(R.id.checkbox_building);
mIndoorCheckbox =(CheckBox)rootView.findViewById(R.id.checkbox_indoor);
MapsInitializer.initialize(getActivity());
开关(GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()))
{
案例ConnectionResult.SUCCESS:
mMapView =(MapView)rootView.findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);
if(mMapView!= null){
mGoogleMap = mMapView.getMap();
mGoogleMap.getUiSettings()。setMyLocationButtonEnabled(false);
mGoogleMap.setMyLocationEnabled(true);
}
}
返回rootView;
}
}
@Override
受保护的void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
如果(savedInstanceState == null){
getSupportFragmentManager()。beginTransaction()
.add(R.id.container,new PlaceholderFragment())。commit();
}
setUpMapIfNeeded();
}
私人无效setUpMapIfNeeded(){
if(mGoogleMap == null){
// mMapFragment =(MapFragment)getFragmentManager()。findFragmentById(R.id.map);
mGoogleMap = mMapView.getMap();
}
}
私人布尔checkReady(){
if(mGoogleMap == null){
Toast.makeText(this,R.string.map_not_ready,Toast.LENGTH_SHORT).show();
返回false;
}
返回true;
}
私人无效updateTraffic(){
if(!checkReady()){
返回;
}
mGoogleMap.setTrafficEnabled(mTrafficCheckbox.isChecked());
}
公共无效onTrafficToggled(查看){
updateTraffic();
}
私有无效updateLocation(){
if(!checkReady()){
返回;
}
mGoogleMap.setMyLocationEnabled(mLocationCheckbox.isChecked());
}
public void onLocationToggled(View view){
updateLocation();
}
私人无效updateBuilding(){
if(!checkReady()){
返回;
}
mGoogleMap.setBuildingsEnabled(mBuildingCheckbox.isChecked());
}
public void onBuildingToggled(View view){
updateBuilding();
}
私人无效updateIndoor(){
if(!checkReady()){
返回;
}
mGoogleMap.setIndoorEnabled(mIndoorCheckbox.isChecked());
}
onIndoorToggled的public void(查看视图){
updateIndoor();
}
@Override
public void onItemSelected(AdapterView parent,View view,int position,long id){
setLayer((String)parent.getItemAtPosition(position));
}
私人无效setLayer(String layerName){
if(!checkReady()){
返回;
}
if(layerName.equals(getString(R.string.normal))){
mGoogleMap.setMapType(MAP_TYPE_NORMAL);
}
否则if(layerName.equals(getString(R.string.hybrid))){
mGoogleMap.setMapType(MAP_TYPE_HYBRID);
}
否则if(layerName.equals(getString(R.string.satellite))){
mGoogleMap.setMapType(MAP_TYPE_SATELLITE);
}
否则if(layerName.equals(getString(R.string.terrain))){
mGoogleMap.setMapType(MAP_TYPE_TERRAIN);
}
否则if(layerName.equals(getString(R.string.none_map))){
mGoogleMap.setMapType(MAP_TYPE_NONE);
}
其他{
Log.i(“ LDA”,“错误设置名称为” + layerName)的图层;
}
}
@Override
公共无效onNothingSelected(AdapterView parent){
}
@Override
受保护的void onResume(){
super.onResume();
setUpMapIfNeeded();
如果(mGoogleMap!= null){
updateTraffic();
updateLocation();
updateBuilding();
updateIndoor();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
//膨胀菜单;这会将项目添加到操作栏(如果有)。
getMenuInflater()。inflate(R.menu.main,menu);
返回true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
//单击操作栏项。动作栏将
//自动处理Home / Up按钮上的点击
//在AndroidManifest.xml中指定父活动时。
int id = item.getItemId();
如果(id == R.id.action_settings){
返回true;
}
返回super.onOptionsItemSelected(item);
}
}
我试图将getSupportFramentManager与android.support.v4.app.DialogFragment支持库一起使用:
mGoogleMap = ((MapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
Run Code Online (Sandbox Code Playgroud)
但仍然无效。我从eclipse得到了这个错误Cannot cast from Fragment to MapFragment。我试图扩展到FragmentActivity并且仍然返回空指针。但是,当我尝试在函数setUpMapIfNeeded()中注释getSupportFragmentManager时,错误消失了。
这是我的LogCat:
03月24日20:43:36.124:E / AndroidRuntime(27152):java.lang.RuntimeException:无法启动活动ComponentInfo {com.yai.testmap / com.yai.testmap.MainActivity}:java.lang.NullPointerException
03月24日20:43:36.124:E / AndroidRuntime(27152):位于com.yai.testmap.MainActivity.setUpMapIfNeeded(MainActivity.java:104)
03月24日20:43:36.124:E / AndroidRuntime(27152):在com.yai.testmap.MainActivity.onCreate(MainActivity.java:98)
任何的想法?
铸造问题可以通过以下方式解决
mGoogleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
Run Code Online (Sandbox Code Playgroud)
如果您想在片段内使用映射,则需要使用MapView或扩展SupportMapFragment.
您可以参考以下内容
Android - android.view.InflateException:二进制 XML 文件行 #8:膨胀类片段时出错
| 归档时间: |
|
| 查看次数: |
6410 次 |
| 最近记录: |