实例化 SupportMapFragment 随机抛出 NullPointerException



我有一个嵌入到另一个片段中的SupportMapFragment。我从这一行得到NPE(请注意,我找不到原因,目前它似乎是随机发生的):

mMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapview)).getMap();

getMap()是完全返回空值)

但是,当我按照本答案中的说明将其更改为:

mMap = ((SupportMapFragment) this.getChildFragmentManager().findFragmentById(R.id.mapview)).getMap();

然后我也得到NPE。

我正在使用支持库 v4:19.1.0。

该问题可能与最近从Eclipse(没有Gradle)到Android Studio的项目迁移有关。

在您的

活动中使用它

googleMap = ((MapFragment) getFragmentManager().findFragmentById(
            R.id.mapNearMEButton)).getMap();

并在片段中提供给用户支持地图片段。

确保您处于动态膨胀其Fragment Activity

注: 当布局出现时,您无法将布局膨胀为片段 包括一个 .嵌套片段仅在添加时受支持 动态到片段。

例如:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment =  fm.findFragmentById(R.id.fragment);
        if(fragment == null){
            MainActivityFragment mMainActivityFragment = new MainActivityFragment();
            fm.beginTransaction()
            .replace(R.id.fragment, mMainActivityFragment, "MainActivityFragment")
            .commit();
        }
    }
}

R.layout.activity_main

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

主活动片段

 public class MainActivityFragment extends Fragment {
        private SupportMapFragment supportMapFragment;
        private GoogleMap mGoogleMap = null;
        public MainActivityFragment() {
        }
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            FragmentManager fm = getChildFragmentManager();
            supportMapFragment = (SupportMapFragment) fm.findFragmentById(R.id.container_map);
            if (supportMapFragment == null) {
                supportMapFragment =   SupportMapFragment.newInstance();
                fm.beginTransaction().replace(R.id.container_map, supportMapFragment).commit();
            }
        }
         @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View mRoot =  inflater.inflate(R.layout.fragment_main, container, false);
            return  mRoot;
        }
        @Override
        public void onResume() {
            createMapView();
            super.onResume();
        }
        private void createMapView() {
            mGoogleMap = supportMapFragment.getMap();
            if (mGoogleMap != null) {
                mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                   @Override
                   public boolean onMarkerClick(Marker marker) {
                       return false;
                   }
               });
            }
        }
    }

R.layout.fragment_main

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/container_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

相关内容

最新更新