当前位置: 首页 > 知识库问答 >
问题:

getFragmentManager返回空指针异常

储承
2023-03-14

函数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)

知道吗?

共有2个答案

焦信鸥
2023-03-14

问题是因为在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();
公孙鸿才
2023-03-14

铸造问题可以通过以下方法解决

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注释,