2014-03-04 82 views
0

那麼,下面是我的例子,我在Android中有一個主要的活動,我創建了一個工具欄,並且有一個叫做位置的子函數,我將調用一些位置函數這裏。 它被編碼在一個片段中,因爲我需要在單擊工具欄中的圖標後進入子函數時創建一個片段。如何把谷歌地圖功能放到一個片段中

我已經得到如何顯示一個活動內的谷歌地圖。但是我沒有在片段中顯示它。 我能做的只是在片段內調用onActivityCreated。但是,雖然程序工作正常,但佈局將省略工具欄(我不擅長英語,如果你不明白我在說什麼,只是問我的細節:))

所以呢任何人都可以幫助我弄清楚如何調用一些谷歌位置服務,例如查找png和lat,或者在片段中顯示谷歌地圖?我的片段代碼如下:

LocationFragment.java:

public class LocationFragment extends MapFragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View location_layout = inflater.inflate(R.layout.location_layout, container, false); 
     return location_layout; 
    } 
} 

回答

1

片段類將是:

public class MyFragment extends Fragment { 

    private MapView mapView; 
    private GoogleMap map; 
    private Bundle bundle; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_map, container, false); 

     // initialize it to avoid a NPE 
     try { 
      MapsInitializer.initialize(getActivity()); 
     } catch (GooglePlayServicesNotAvailableException e) { } 

     mapView = (MapView) v.findViewById(R.id.map); 
     mapView.onCreate(bundle); 

     // check if the map is null 
     if (map == null) { 
      map = ((MapView) v.findViewById(R.id.map)).getMap(); 
     } 

     // add a marker 
     map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Here!")); 

     return v; 
    } 

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

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

    @Override 
    public void onPause() { 
     super.onPause(); 
     mapView.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     mapView.onDestroy(); 
     super.onDestroy(); 
    } 

    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
     mapView.onLowMemory(); 
    } 
} 

最後,你的佈局fragment_map

<com.google.android.gms.maps.MapView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/map" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

他我們去在片段內顯示你的地圖!請參閱a little post以及the reference來自Google。

對於用戶的位置,需要一點閱讀才能知道更多關於它的信息:Location Strategies(仔細閱讀,一切都在那裏)。你需要一個Location Manager和一個Location Listener
首先,你需要這樣實現:

// The implement 
implements LocationListener { [...] } 

有了這個監聽器,你就能夠擁有並通過GPS或網絡更新設備的位置。不要忘了測試設備的服務的狀態,這樣的事情:

// Getting Google Play availability status 
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); 

下面這段代碼是這個例子中的一個片段內的當前位置:

public class LocationFragment extends Fragment implements LocationListener { 

    private Marker marker; 
    private LocationManager locationManager; 

    static final LatLng NEWYORK = new LatLng(40.75, -74.03); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View v = inflater.inflate(R.layout.location_layout, container, false); 

     // ... 
     if (map == null) { 
      map = ((MapView) v.findViewById(R.id.map)).getMap(); 
     } 
     // ... 
     if (map != null) initMap(); 

     locationManager = (LocationManager) getActivity().getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 
     if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      getGPS(); 
     } else { 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 10, this);  
     } 
     // ... 

     return v; 
    } 

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

    @Override 
    public void onPause() { 
     super.onPause(); 
     outGPS(); 
    } 

    public void getGPS() { 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, this); 
    } 

    public void outGPS() { 
     locationManager.removeUpdates(this); 
    } 

    @Override 
    public void onLocationChanged(final Location location) { 
     // get the latitude and the longitude 
     final StringBuilder msg = new StringBuilder("lat : "); 
     msg.append(location.getLatitude()); 
     msg.append("; lng : "); 
     msg.append(location.getLongitude()); 
     // display it on a toast 
     Toast.makeText(getActivity().getApplicationContext(), msg.toString(), Toast.LENGTH_SHORT).show(); 

     // final latlng with these above to update the position on a marker 
     final LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
     gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 1)); 
     marker.setPosition(latLng); 
     // ... 
    } 

    @Override 
    public void onProviderDisabled(final String provider) { 
     if("gps".equals(provider)) { 
      desabonnementGPS(); 
     } 
    } 

    @Override 
    public void onProviderEnabled(final String provider) { 
     if("gps".equals(provider)) { 
      abonnementGPS(); 
     } 
    } 

    @Override 
    public void onStatusChanged(final String provider, final int status, final Bundle extras) { } 

    private void initMap() { 
     gMap.addMarker(new MarkerOptions().title("New-York").position(NEWYORK)); 
     marker = gMap.addMarker(new MarkerOptions().title("I am here!").position(new LatLng(0, 0))); 
    } 
} 

然後創建經理,然後使用onLocationChanged方法更新當前位置。有一些很好的教程:a tutorial by Vogella(這可能是幫助)和another tutorial(也可以幫助你)。

您對this blog不少小費。非常簡單,非常全面。

注意2:不要忘記在您的清單中添加權限。

我希望,我回答清楚,這將是有益的。
快樂編碼!

+0

嘿弗洛,謝謝你的建議。 但我想創建一個片段內的地圖視圖,說我已創建一個片段類,所以它應該是一個onCreateView方法,而不是的onCreate,因爲它是一個片段並不是一項活動... –

+0

酷!我看到了,我根據自己的需要更新了答案。讓我知道這是否有幫助。 – Fllo

+0

謝謝你!有用!! –