2013-01-09 38 views
0

我有一個FragmentActivity與上動作條一個LocateMe功能,它承載4個片段。每個片段是一個ListView,基本上不同的排序在我的列表中的結果(例如,基於收視率,價格,距離等)安卓:在的getLocation活性和有孩子的片段檢索

我的問題是,我怎麼寫我的代碼,這樣的位置管理(例如檢索,更新)在FragmentActivity中完成,而片段只是在該按鈕被按下時按下這個位置來執行任何數據調用或對列表進行排序。

如果我有LocationManager在每個片段處理位置,但我不知道如何做正確的事情,它絕對感覺不對。

謝謝大家。 :)

回答

2

的「乾淨」的方式恕我直言,是通過接口和註冊監聽

創建兩個接口:

public interface LocationListener{ 
    public void onLocationAvailable(/* whatever data you want to pass */); 
} 
public interface LocationListenersRegistry{ 
    public void addLocationListener(LocationListener listener); 
    public void removeLocationListener(LocationListener listener); 
} 

然後你讓你的活動實施LocationListenersRegistry和你的片段落實LocationListener

你的活動你將有一個private ArrayList<LocationListener>,你將添加和刪除偵聽器按照添加/刪除方法。每當您的活動接收到新數據時,它都應該處理它,然後傳遞給陣列上的所有偵聽器。

你應該和onResume註冊和註銷自己從活動的片段,類似的東西:

onResume(){ 
    super.onResume(); 
    ((LocationListenersRegistry)getActivity()).addLocationListener(this); 
} 

onPause(){ 
    super.onPause(); 
    ((LocationListenersRegistry)getActivity()).removeLocationListener(this); 
} 

編輯:

您的活動實現了LocationListenersRegistry,然後將這段代碼:

public class MyActivity extends Activity implements LocationListenersRegistry { 

private ArrayList<LocationListener> listeners = new ArrayList<LocationListener>(); 
public void addLocationListener(LocationListener listener){ 
     listeners.add(listener); 
} 
public void removeLocationListener(LocationListener listener){ 
    listeners.remove(listener); 
} 

and the the n只要用戶點擊菜單按鈕:

for(LocationListener l:listeners) 
     l.onLocationAvailable(/* pass here the data for the fragment */); 

和您的片段將被實施LocationListener的

public class MyFragment extends Fragments implements LocationListener{ 
     public void onLocationAvailable(/* receive here the data */){ 
      // do stuff with your data 
     } 
+0

打招呼。感謝你的回答。如果我在任何時候都不需要位置信息,該怎麼辦?我只需要將位置「準備就緒」,這樣當我加載其他片段或按LocateMe函數時,位置信息可以傳遞給片段,或片段可以從活動中檢索它。 或者這種數據傳遞方法被認爲是「不潔淨」。哈哈 – chongzixin

+0

好吧,你可以只存儲活動的位置和每當用戶按下菜單按鈕你調用陣列上的監聽器。 – Budius

+0

我對這個聽衆的概念不是很好,但我慢慢理解,所以請耐心等待。所以LocationListenersRegistry方法將添加/刪除數組列表中的項目。我應該如何實現LocationListener?它只是getter/setter方法或東西? – chongzixin

1

我想建議提高到Budius答案。

除了創建這些接口,您可以使用已經在Java中實現並且可用於Android的Observer模式。

public class MyFragment extends Fragment implements Observer { 
    @Override 
    public void onResume() { 
     super.onResume(); 
     myLocationServices.addObserver(this); 
    } 
    @Override 
    public void onPause() { 
     super.onPause(); 
     myLocationServices.deleteObserver(this); 
    } 
    @Override 
    public void update(Observable observable, Object data) { 
     // do stuff with your data 
    } 

}

我創建了一個分隔的類來封裝數據(我使用地點的客戶這是谷歌Play的一部分SDK,並在谷歌IO 2013被引入,但你可以使用經典的LocationManager實施。我還在學習:P):

public class MyLocationServices extends Observable implements 
    GooglePlayServicesClient.ConnectionCallbacks, 
    GooglePlayServicesClient.OnConnectionFailedListener, LocationListener { 
    @Override 
    public void onLocationChanged(Location location) { 
     Location mBestReading; 
     //Obtain the location. Do the staff 
     //And notify the observers 
     setChanged(); 
     notifyObservers(mBestReading); 
    } 

}

+0

http://stackoverflow.com/questions/13744450/when-should-we-use-observer-and-observable – Yehonatan