SupportMapFragment的实例化随机抛出NullPointerException异常

3

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

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

(getMap() 返回 null 的确切原因是什么)

然而,当我按照这个答案中的说明进行更改时:

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

我还遇到了NPE(空指针异常)。

我正在使用Support Library v4:19.1.0。

问题可能与最近从不使用Gradle的Eclipse迁移到Android Studio的项目有关。

2个回答

0

在你的Activity中使用这个

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

并在片段中返回SupportMapFragment给用户。


0

请确保您在动态填充Fragment时,位于您的Activity中。

注意:当布局包含一个<fragment>标签时,您无法将布局填充到一个Fragment中。只有在动态添加到Fragment时,才支持嵌套Fragment

例如:

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

MainActivityFragment

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接