Android自定义监听器,操作顺序问题

时间:2014-11-11 21:39:00

标签: android asynchronous callback google-maps-android-api-2 fragmentmanager

我正在尝试从android MapFragment添加回调。

我的原始代码看起来像这样:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        //Put the map fragment into the main window
        FragmentManager fm = getFragmentManager();
        fm.beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
        fm.executePendingTransactions();
        MapFragment sf = (MapFragment)fm.findFragmentById(R.id.map);
        googleMap = sf.getMap();
    }

不幸的是,在将片段注入占位符的实际调用与片段管理器实际能够获取GoogleMap的能力之间存在延迟,因为它是异步的,并且可能无法在调用之前完成实例化to getMap()

所以我决定在片段中添加一个回调函数,它的onActivityCreated()方法会回调到这个活动,然后做我需要做的事情,因为那时应该创建Map并且我可以毫无问题地调用getMap。

所以我创建了一个界面:

public interface MapCreatedListener {
 public void onGoogleMapCreation();
}

我扩展了MapFragment:

public class MyMapFragment extends MapFragment {

MapCreatedListener mListener;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
mListener.onGoogleMapCreation();
}

/**
 * @return the listener
 */
public MapCreatedListener getListener() {
    return mListener;
}
/**
 * @param listener the listener to set
 */
public void setListener(MapCreatedListener listener) {
   mListener = listener;
}

我确保我的原始活动实现了界面:

  public myClass extends Activity implements MapCreatedListener{

  ...

   @Override
   public void onGoogleMapCreation() {
       System.out.println("CALLBACK HAPPENED");
      initializeMap();

   }

   ....

   }

所以现在所有的框架都已到位,我现在应该通过调用

将我原来的活动注册为监听器
            setListener(this);

 from my activity on the mapFragment.... So.. I change my activity code to look like this:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        //Put the map fragment into the main window
        FragmentManager fm = getFragmentManager();
        fm.beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
        fm.executePendingTransactions();
        MyMapFragment sf = (MyMapFragment)fm.findFragmentById(R.id.map);
        sf.setListener(this);
    }

但是findFragmentById总是因为同样的原因而返回null ...所以,我怎么把这个连接起来呢?我需要获取googlemap,但只有在完全创建之后,但是在创建片段之后才会发生这种情况,我对片段的注入和FragmentManager都是异步的......所以我怎么样这样所有这一切,所以我的活动不会试图获得谷歌地图之前所有这些其他东西完成其异步的东西?

必须有一种方法......我现在才看到它。

1 个答案:

答案 0 :(得分:0)

在片段的onAttach方法中写下这个

public void onAttach(Activity activity){
super.onAttach(activity);
try{
mListener = (YourListenerType) activity;

}catch(ClassCastException e){
throw new RuntimeException("Activity must implement my listener");

}


}

让给定的活动实现给定的侦听器