函数setUpMapIfNeeded()中的getFragmentManager返回空指针异常
。我把我的片段与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" />
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"
/>
这是我的*.Java文件:
package com.yai.testmap; import android.support.v7.app.ActionBarActivity; import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; /* FOR ERROR REPPORT */ import android.util.Log; /* IMPORT FOR DROPDOWNLIST USED THIS PROJECT */ import android.widget.CheckBox; import android.widget.Spinner; import android.widget.Toast; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.AdapterView.OnItemSelectedListener; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesUtil; /* IMPORT FOR GOOGLE MAP */ import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.MapView; /* FOR GOOGLE MAP TYPE */ import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_HYBRID; import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_NONE; import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_NORMAL; import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_SATELLITE; import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_TERRAIN; public class MainActivity extends ActionBarActivity implements OnItemSelectedListener { private static MapView mMapView; private static MapFragment mMapFragment; private static GoogleMap mGoogleMap; private static CheckBox mTrafficCheckbox, mLocationCheckbox, mBuildingCheckbox, mIndoorCheckbox; public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); 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()); switch (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()) ) { case 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); } } return rootView; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); } setUpMapIfNeeded(); } private void setUpMapIfNeeded(){ if(mGoogleMap == null){ //mMapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); mGoogleMap = mMapView.getMap(); } } private boolean checkReady(){ if(mGoogleMap == null){ Toast.makeText(this, R.string.map_not_ready, Toast.LENGTH_SHORT).show(); return false; } return true; } private void updateTraffic(){ if(!checkReady()){ return; } mGoogleMap.setTrafficEnabled(mTrafficCheckbox.isChecked()); } public void onTrafficToggled(View view){ updateTraffic(); } private void updateLocation(){ if(!checkReady()){ return; } mGoogleMap.setMyLocationEnabled(mLocationCheckbox.isChecked()); } public void onLocationToggled(View view){ updateLocation(); } private void updateBuilding(){ if(!checkReady()){ return; } mGoogleMap.setBuildingsEnabled(mBuildingCheckbox.isChecked()); } public void onBuildingToggled(View view){ updateBuilding(); } private void updateIndoor(){ if(!checkReady()){ return; } mGoogleMap.setIndoorEnabled(mIndoorCheckbox.isChecked()); } public void onIndoorToggled(View view){ updateIndoor(); } @Override public void onItemSelected(AdapterView parent, View view, int position, long id){ setLayer((String) parent.getItemAtPosition(position)); } private void setLayer(String layerName){ if(!checkReady()){ return; } if(layerName.equals(getString(R.string.normal))){ mGoogleMap.setMapType(MAP_TYPE_NORMAL); } else if(layerName.equals(getString(R.string.hybrid))){ mGoogleMap.setMapType(MAP_TYPE_HYBRID); } else if(layerName.equals(getString(R.string.satellite))){ mGoogleMap.setMapType(MAP_TYPE_SATELLITE); } else if(layerName.equals(getString(R.string.terrain))){ mGoogleMap.setMapType(MAP_TYPE_TERRAIN); } else if(layerName.equals(getString(R.string.none_map))){ mGoogleMap.setMapType(MAP_TYPE_NONE); } else{ Log.i("LDA", "Error setting layer with name " + layerName); } } @Override public void onNothingSelected(AdapterView parent){ } @Override protected void onResume() { super.onResume(); setUpMapIfNeeded(); if (mGoogleMap != null) { updateTraffic(); updateLocation(); updateBuilding(); updateIndoor(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
我已尝试将getSupportFramentManager与Android.support.v4.app.DialogFragment支持库一起使用:
mGoogleMap = ((MapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
但还是不起作用。我从eclipse不能从Fragment转换为mapfragment
中得到这个错误。我尝试扩展到FragmentActivity,但仍然返回空指针。但是当我试图在函数setUpMapIfNeeded()中注释getSupportFragmentManager时,错误消失了。
这是我的LogCat:
03-24 20:43:36.124: E/AndroidRuntime(27152): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yai.testmap/com.yai.testmap.MainActivity}: java.lang.NullPointerException 03-24 20:43:36.124: E/AndroidRuntime(27152): at com.yai.testmap.MainActivity.setUpMapIfNeeded(MainActivity.java:104) 03-24 20:43:36.124: E/AndroidRuntime(27152): at com.yai.testmap.MainActivity.onCreate(MainActivity.java:98)
知道吗?
问题是因为在xml文件中使用了
android:name="com.google.android.gms.maps.SupportMapFragment"
并且在您的Java类文件中使用了
mGoogleMap = ((MapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
所以你弄错了。所以答案是从
mGoogleMap = ((MapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
至
mGoogleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
铸造问题可以通过以下方法解决
mGoogleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
如果希望在片段内部映射,则需要使用MapView
或扩展SupportMapFragment
。
你可以参考下面的
Android-Android.view.inflateException:二进制XML文件第8行:膨胀类片段时出错
web.xml 应用程序-servlet.xml context.xml(在tomcat conf文件夹中) 谢谢你的建议和帮助。
问题内容: 当我尝试在片段上显示地图时,它返回空指针异常。我已将所有权限添加到清单中。我将片段文件附加为其XML文件和log cat Chatffragment.java 其XML LOGCAT 第55和70行是googleMap = mapFrag.getMap(); initilizeMap(); 问题答案: 您必须等到地图加载完毕…。 编辑 检查编辑代码,使用ChildFragmentMan
我在尝试单元测试函数调用时遇到了一个问题。尽管调用已被存根,但由于无效方法调用而失败。 请在下面找到我的代码的简化快照。我正在使用do答案()存根来模拟空方法(基于StackOverflow上的早期答案)。 我甚至尝试了其他选项的和存根,但当调用存根方法时,它们也会在相同的NPE中失败:(。 如果有人能提出解决方案/解决方法,我将不胜感激。非常感谢。 考试班 正在测试的实现类,来自该类的存根方法调
问题内容: 有可能这可能是一个双重问题。我将String变量初始化为null。我可能会或可能不会使用一个值更新它。现在我想检查此变量是否不等于null以及我尝试执行的操作是否会得到null指针异常。空指针异常,因为它代价高昂。是否有任何有效的解决方法.TIA 问题答案: 如果您使用 你 不会 得到。 我怀疑你在做什么: 这是因为null 而引发,而不是因为null。 如果仍然无法解释,请发布您用于
我已经更新了我的项目中的一些依赖关系之后,我的Hibernate配置类显示Nullpointerx的。 我将SpringDataJPA存储库与hibernate一起使用,已经超过24小时了,仍然没有找到任何关于小问题的适当解决方案。 我已经尝试过的一些解决方案:- 使用@bean(name=“entityManagerFactory”)提供bean名称 我面临的问题 波姆。xml文件 配置类 db
当我实例化实体并在DTO to entity方法上使用mapstruct mapper时,我有一个返回空指针的简单映射器。我的实体要长得多,并且使用另一种语言,所以我将编写一个类似的实体作为示例。 我使用的是java 8和Spring boot 2.5.2 这是我的实体: 这是我的数据传输对象,又名DTO: 这是我的映射器,两个类(实体和dto)具有相同的属性名称。事实上,我也尝试过@Map注释,