0

我在我的應用程序中使用GoogleMaps。爲此,我在自定義Fragment類中實現了SupportMapFragment Map-v2。但不幸的是,我得到NullPointerException沒有理由在行在MapFragment中獲取java.lang.NullPointerException

SupportMapFragment fm = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById (R.id.map)); 
      googleMap = fm.getMap(); 

我真的不知道該怎麼做,我完全無奈。我甚至提到了link 1,link 2link 3這幾個類似的問題。但似乎沒有任何結果。請幫助我。請找到我的logcat錯誤並完成代碼,如下所示。

MapFragment.java

public class MapFragment extends Fragment implements GoogleMap.OnMarkerClickListener { 

    GoogleMap googleMap;  
    private Map<Marker, Integer> markerPosition = new HashMap(); 
    private ImageView imgUser; 
    private TextView txtName, txtLocation,txtCount; 
    private ArrayList<Info> mList; 

    public static MapFragment newInstance() { 
     MapFragment fragment = new MapFragment(); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_map, container, false); 
     findViews (view); 
     googleMapsData(); 
     return view; 
    } 



    @Override 
    public void onViewCreated (View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated (view, savedInstanceState); 
     mList = getHelper().getList(); 
     counts(); 
    } 

    private void googleMapsData() { 
     int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable (getActivity()); 
     if(status!= ConnectionResult.SUCCESS){ 

      int requestCode = 10; 
      Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, getActivity(), requestCode); 
      dialog.show(); 

     }else { 

      SupportMapFragment fm = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById (R.id.map)); //This is the line getting error 
      googleMap = fm.getMap(); //This is the line getting error 
      googleMap.setMapType (GoogleMap.MAP_TYPE_NORMAL); 
      googleMap.setOnMarkerClickListener(this); 
      googleMap.setMyLocationEnabled(true); 

       for(int i=0;i<mList.size();i++){ 
        drawMarker (new LatLng (Double.parseDouble (mList.get (i).getLatitude()), Double.parseDouble (mList.get (i).getLongitude())),i); 
       } 

      CameraPosition cameraPosition = new CameraPosition.Builder() 
        .target (new LatLng (Double.parseDouble ("13.0900"), Double.parseDouble ("80.2700"))) 
        .zoom (7)        
        .build();     


      googleMap.animateCamera(CameraUpdateFactory.newCameraPosition (cameraPosition), new GoogleMap.CancelableCallback() { 

       @Override 
       public void onFinish() { 
        CameraUpdate cu_scroll = CameraUpdateFactory.scrollBy(-300, 70); 
        googleMap.animateCamera(cu_scroll); 
       } 

       @Override 
       public void onCancel() { 
       } 
      }); 
     } 

     googleMap.setOnMapClickListener(new OnMapClickListener() { 
      @Override 
      public void onMapClick(LatLng point) { 
      } 
     }); 


     googleMap.setOnMapLongClickListener(new OnMapLongClickListener() { 
      @Override 
      public void onMapLongClick(LatLng point) { 
      } 
     }); 
    } 


    public void details(Info Info){ 
     cardBottomdetails.setVisibility (View.VISIBLE); 
     txtName.setText (Info.getHotelName()); 
     txtLocation.setText (Info.getCity()); 
     Glide.with (getActivity()) 
       .load(Constant.BASE_IP+Info.getImage()) 
       .centerCrop() 
       .placeholder(getResources().getDrawable (R.drawable.img)) 
       .crossFade() 
       .into(imgUser); 

    } 

    public void counts(){ 
     txtCount.setText (""+mList.size()); 
     if(Build.VERSION.SDK_INT >= 16) { 
      txtCount.setBackground (Util.drawCircle (getActivity(), 25, 25, getResources().getColor (R.color.yellow))); 
     }else{ 
      txtCount.setBackgroundDrawable (Util.drawCircle (getActivity(), 25, 25, getResources().getColor (R.color.yellow))); 
     } 
    } 

    private void drawMarker(LatLng point , int index){ 
     MarkerOptions markerOptions = new MarkerOptions(); 
     markerOptions.position (point); 
     Marker marker = googleMap.addMarker(markerOptions); 
     markerPosition.put (marker,index); 
    } 

    public void findViews(View view){ 
     imgUser = (ImageView)view.findViewById (R.id.img_user); 
     txtName = (TextView)view.findViewById (R.id.txt_name); 
     txtLocation = (TextView)view.findViewById (R.id.txt_location); 
     txtCount = (TextView)view.findViewById (R.id.txt_count); 
    } 


    @Override 
    public boolean onMarkerClick (Marker marker) { 
     int index = markerPosition.get (marker); 
     details (mList.get (index)); 
     return false; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
    } 
} 

fragment_map.xml

<FrameLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <fragment 
      android:id="@+id/map" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      class="com.google.android.gms.maps.SupportMapFragment"/> 

</FrameLayout> 

logcat的錯誤:

java.lang.NullPointerException 
      at com.example.map.fragment.MapFragment.googleMapsData(MapFragment.java:105) 
      at com.example.map.fragment.MapFragment.onCreateView(MapFragment.java:68) 
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
      at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:146) 
      at android.app.ActivityThread.main(ActivityThread.java:5602) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
      at dalvik.system.NativeStart.main(Native Method) 

注意

1)我在我的代碼中導入import android.support.v4.app.Fragment;

2)代碼工作正常,當我在Activity中使用這個。只有當我從Activity切換到Fragment時纔會出現此問題。

在此先感謝。您的所有解決方案對解決我的問題將更有用和有價值。

+0

嘗試withtout使用'getActivity()','SupportMapFragment FM =(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);' – Shvet

+0

沒有得到錯誤,如果我使用它一樣,所以 – Chandru

+0

試試這個:'SupportMapFragment fm =(SupportMapFragment)getChildFragmentManager()。findFragmentById(R.id.map);'。希望這可以幫助 – Minhtdh

回答

2

當我剛剛使用地圖時,我收到了同樣的問題。這個問題是因爲加載谷歌地圖需要時間(如果你在一個片段中使用,你可以預期這個加載時間很長),而當你在加載之前嘗試訪問地圖時,你會得到NullPointerException稱地圖引用爲空。您應該先等待地圖加載,然後才能訪問地圖視圖。你有預先定義的回調,這是你應該如何使用它。

supportMapFragment.getMapAsync(new OnMapReadyCallback() { 

     @Override 
     public void onMapReady(GoogleMap map) { 

      googleMap = map; 
     googleMap.setMapType (GoogleMap.MAP_TYPE_NORMAL); 
     googleMap.setOnMarkerClickListener(this); 
     googleMap.setMyLocationEnabled(true); 

      for(int i=0;i<mList.size();i++){ 
       drawMarker (new LatLng (Double.parseDouble (mList.get (i).getLatitude()), Double.parseDouble (mList.get (i).getLongitude())),i); 
      } 

     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target (new LatLng (Double.parseDouble ("13.0900"), Double.parseDouble ("80.2700"))) 
       .zoom (7)        
       .build();     


     googleMap.animateCamera(CameraUpdateFactory.newCameraPosition (cameraPosition), new GoogleMap.CancelableCallback() { 

      @Override 
      public void onFinish() { 
       CameraUpdate cu_scroll = CameraUpdateFactory.scrollBy(-300, 70); 
       googleMap.animateCamera(cu_scroll); 
      } 

      @Override 
      public void onCancel() { 
      } 
     }); 
     } 
    }); 
+0

最後你的解決方案的作品。豎起大拇指。謝謝 – Chandru

相關問題