0

Я пытаюсь добавить обратный вызов из андроида MapFragment.Пользовательский прослушиватель Android, порядок выполнения операций

Моего исходный код выглядел примерно так:

@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, потому что он является асинхронным и не может быть завершен, пока не будет создан экземпляр до вызова getMap()

Итак, я решил добавить обратный вызов во Фрагмент по его методу onActivityCreated(), который будет обратный вызов для этого действия, и делать то, что мне нужно сделать с картой, тогда, поскольку к тому времени Карта должна быть c и я могу вызвать 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 всегда возвращает нуль по той же причине ... Так что, как, черт возьми, чтобы связать все это вверх? Мне нужно получить googlemap, но только после его полного создания, но это произойдет не до тех пор, пока не будет создан фрагмент, любая моя инъекция фрагмента и FragmentManager также асинхронны ... Так как мне это нравится все в порядке, так что моя деятельность не будет пытаться получить GoogleMap, прежде чем все это закончится с асинхронным материалом?

Должен быть способ ... Я просто не вижу его в данный момент.

ответ

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

} 


} 

есть данная деятельность реализации данного слушателя

+0

Спасибо, это, кажется, только то, что мне нужно, и не находил. – user282172

Смежные вопросы