IMHOがインターフェースと登録リスナーを介する「最もクリーンな」方法
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>
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);
}
そして、ユーザーがメニューボタンをクリックするたびに:
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
}