0

我有一个带有ActionBar功能的FragmentActivity,它承载 4 个片段。每个片段都是一个基本上对我列表中的结果进行不同排序的片段(例如,基于评级、价格、距离等)LocateMeListView

我的问题是,我如何编写我的代码,以便在FragmentActivityLocateMe中完成位置管理(例如检索、更新),而当按下按钮时,片段只使用这个位置来执行创建时的任何数据调用或对列表进行排序.

如果我在每个片段中都有LocationManager来处理位置,那肯定感觉不对,除非我不知道如何做正确的事情。

谢谢你们。:)

4

2 回答 2

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>,您将根据添加/删除方法添加和删除侦听器。每次您的活动接收到新数据时,它都应该对其进行处理,然后将其传递给数组上的所有侦听器。

在您应该从活动中注册和注销自己的片段上onPauseonResume如下所示:

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);
}

然后每当用户单击菜单按钮时:

  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
       }
于 2013-01-09T10:24:58.483 回答
1

我想建议对 Budius 的答案进行改进。

您可以使用已经在 J​​ava 中实现并且可用于 Android 的观察者模式,而不是创建这些接口。

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
    }

}

我创建了一个单独的类来封装数据(我使用了作为 Google Play SDK 一部分并在 Google IO 2013 中引入的 Location Client,但您可以使用经典的 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);
    }

}

于 2014-05-08T12:14:35.340 回答