Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android:getLocation在活动中并让子片段检索它_Android_Android Location_Android Fragmentactivity - Fatal编程技术网

android:getLocation在活动中并让子片段检索它

android:getLocation在活动中并让子片段检索它,android,android-location,android-fragmentactivity,Android,Android Location,Android Fragmentactivity,我有一个FragmentActivity,在操作栏上有一个LocateMe功能,它包含4个片段。每个片段都是一个列表视图,基本上对列表中的结果进行不同的排序(例如,基于评级、价格、距离等) 我的问题是,如何编写代码,以便在FragmentActivity中完成位置管理(例如检索、更新),而当按下LocateMe按钮时,片段仅在该位置执行创建或排序列表时的任何数据调用 如果我在每个片段中都有LocationManager来处理位置,那肯定感觉不对,除非我不知道如何做正确的事情 谢谢大家。:) IM

我有一个FragmentActivity,在操作栏上有一个
LocateMe
功能,它包含4个片段。每个片段都是一个
列表视图
,基本上对列表中的结果进行不同的排序(例如,基于评级、价格、距离等)

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

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


谢谢大家。:)

IMHO最“干净”的方式是通过接口和注册监听器

创建两个接口:

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);
}
然后让您的活动实现
LocationListener注册
,片段实现
LocationListener

在您的活动中,您将有一个
私有ArrayList
,您将根据add/remove方法添加和删除侦听器。每次您的活动接收到新数据时,它都应该对其进行处理,然后传递给阵列上的所有侦听器

在片段上,您应该
onPause
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);
}
您的片段将实现LocationListener

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

IMHO最“干净”的方式是通过接口和注册监听器

创建两个接口:

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);
}
然后让您的活动实现
LocationListener注册
,片段实现
LocationListener

在您的活动中,您将有一个
私有ArrayList
,您将根据add/remove方法添加和删除侦听器。每次您的活动接收到新数据时,它都应该对其进行处理,然后传递给阵列上的所有侦听器

在片段上,您应该
onPause
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);
}
您的片段将实现LocationListener

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

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

您可以使用已经在Java中实现并在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
    }
}

我创建了一个单独的类来封装数据(我使用了Location Client,它是Google Play SDK的一部分,在Google IO 2013中引入,但您可以使用经典的LocationManager实现。我仍在学习:p):


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

您可以使用已经在Java中实现并在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
    }
}

我创建了一个单独的类来封装数据(我使用了Location Client,它是Google Play SDK的一部分,在Google IO 2013中引入,但您可以使用经典的LocationManager实现。我仍在学习:p):


}

你好。谢谢你的回答。如果我不需要位置信息怎么办。我只需要将位置设置为“就绪”,这样当我加载其他片段或按下LocateMe函数时,位置信息就可以传递给片段,或者片段可以从活动中检索它。或者这种数据传递方法被认为是“不干净的”。hahawell,你只需将位置存储在活动中,每当用户按下菜单按钮时,你就会调用阵列上的侦听器。我对这个侦听器概念不是很好,但我慢慢理解了,所以请耐心等待。因此LocationListenersRegistry方法将从arraylist中添加/删除项。但是我应该如何实现LocationListener?它只是getter/setter方法还是什么?我在答案中添加了一些代码。这有意义吗?接口只是说明这个类将拥有那个方法的一种方式,如何实现这些方法取决于这个类。我想建议对Budius的答案进行改进。您可以使用已经在Java中实现的、Android.hello中提供的观察者模式,而不是创建接口。谢谢你的回答。如果我不需要位置信息怎么办。我只需要将位置设置为“就绪”,这样当我加载其他片段或按下LocateMe函数时,位置信息就可以传递给片段,或者片段可以从活动中检索它。或者这种数据传递方法被认为是“不干净的”。hahawell,你只需将位置存储在活动中,每当用户按下菜单按钮时,你就会调用阵列上的侦听器。我对这个侦听器概念不是很好,但我慢慢理解了,所以请耐心等待。因此LocationListenersRegistry方法将从arraylist中添加/删除项。但是我应该如何实现LocationListener?它只是getter/setter方法还是什么?我在答案中添加了一些代码。这有意义吗?接口只是说明这个类将拥有那个方法的一种方式,如何实现这些方法取决于这个类。我想建议对Budius的答案进行改进。您可以使用已经在Java中实现并在Android中可用的观察者模式,而不是创建接口。