2014-03-24 74 views
0

我一直在嘗試讓位置管理器在我的片段內工作幾個小時。 我發現了一個關於類似問題的StackOverflow問題,並試圖實現該解決方案。 答案位於這裏:https://stackoverflow.com/a/18533440/3035598無法讓位置管理器在片段內工作

所以我幾乎從字面上複製答案所說的一切,但它不適合我。 當地圖打開時,我收到錯誤「Google Play Services Missing」。這是由NullPointerException引起的,因爲您可以在答案中閱讀。

我不知道爲什麼它不起作用,因爲我做了他所說的一切。

有誰知道發生了什麼問題?

如果我必須提供我的代碼,讓我知道,我會做到這一點,但它幾乎等同於我所提供的鏈接。


編輯:

我的代碼使用方法:

package com.example.bt6_aedapp; 

import android.location.Location; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.InflateException; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesClient; 
import com.google.android.gms.location.LocationClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.maps.CameraUpdate; 
import com.google.android.gms.maps.CameraUpdateFactory; 
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.model.LatLng; 

public class fragmentB extends Fragment implements GooglePlayServicesClient.ConnectionCallbacks, 
GooglePlayServicesClient.OnConnectionFailedListener, 
LocationListener { 

    private GoogleMap map; 
    private LatLng latlng; 

    private LocationRequest lr; 
    private LocationClient lc; 

    MapFragment mapFragment; 
    ImageView iv; 

    private static View view; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     if(view != null) { 
      ViewGroup parent = (ViewGroup) view.getParent(); 
      if(parent != null) { 
       parent.removeView(view); 
      } 
     } 

     try { 
      view = inflater.inflate(R.layout.fragment_b, container, false); 

      mapFragment = ((MapFragment) this.getActivity().getFragmentManager().findFragmentById(R.id.map)); 
      iv = (ImageView) view.findViewById(R.id.iv); 

      map = mapFragment.getMap(); 
      map.getUiSettings().setAllGesturesEnabled(false); 
      map.getUiSettings().setMyLocationButtonEnabled(false); 
      map.setMyLocationEnabled(true); 
      map.getUiSettings().setZoomControlsEnabled(false); 

      MapsInitializer.initialize(this.getActivity()); 
     } 
     catch (InflateException e) { 
      Toast.makeText(getActivity(), "Problems inflating the view !", Toast.LENGTH_LONG).show(); 
     } 
     catch (NullPointerException e) { 
      Toast.makeText(getActivity(), "Google Play Services missing !", Toast.LENGTH_LONG).show(); 
     } 

     return view; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     lr = LocationRequest.create(); 
     lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     lc = new LocationClient(this.getActivity().getApplicationContext(), 
       this, this); 
     lc.connect(); 
    } 

    @Override 
    public void onLocationChanged(Location location) {  
     latlng = new LatLng(location.getLatitude(), location.getLongitude()); 
     CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latlng, 10); 
     map.animateCamera(cameraUpdate); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult arg0) { 

    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     lc.requestLocationUpdates(lr, this); 

    } 

    @Override 
    public void onDisconnected() { 

    } 
} 

現在我得到的錯誤是位於115行:在com。示例 顯示java.lang.NullPointerException 。 bt6_aedapp.fragmentB.onLocationChanged(fragmentB.java:155)

我檢查了location.getLatitude()和location.getLongitude(),它們都不是e mpty,他們返回一個正確的值。

+0

檢查,谷歌播放服務是安裝在設備中。 –

+0

在我的設備中?我正在使用Nexus 5(Android 4.4)。我會怎麼做? –

+0

您是否在項目中添加了** Google play services **作爲庫? – Naddy

回答

1

好的,經過大量的調試和研究,我找到了解決方案。

我所要做的就是更換

`mapFragment = ((MapFragment) this.getActivity().getFragmentManager().findFragmentById(R.id.map));` 

有:

mapFragment = ((SupportMapFragment)getFragmentManager().findFragmentById(R.id.map));