【问题标题】:Instantiating SupportMapFragment randomly throws NullPointerException实例化 SupportMapFragment 随机抛出 NullPointerException
【发布时间】:2015-07-12 00:42:26
【问题描述】:

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

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

getMap() 正是返回 null)

但是,当我将 as explained in this answer 更改为:

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

然后我也得到 NPE。

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

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

【问题讨论】:

    标签: java android google-maps google-play-services


    【解决方案1】:

    在你的活动中使用它

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

    在片段中给用户 SupportMapFragment。

    【讨论】:

      【解决方案2】:

      确保您在您的Activity 中动态地膨胀其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"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        • 2012-09-12
        • 2015-12-27
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多