2013-02-21 2 views
21

Я использую API Google Maps V2 в деятельности, где выпадаете навигацию, где карта находится во второй позиции.Android: как уведомлять активность, когда представления фрагментов готовы?

Я добавляю карту прагматично нравится:

mMapFragment = supportMapFragment.newInstance(); 
getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.placeHolder, mMapFragment, TAG_MAP) 
     .commit(); 

Я хочу, чтобы получить ovject GoogleMap, как документации https://developers.google.com/maps/documentation/android/map говорят, что это должно быть сделано с mMapFragment.getMap(), но она возвращает нуль.

в соответствии с http://developer.android.com/reference/com/google/android/gms/maps/SupportMapFragment.html он возвращает значение null, если Фрагмент не прошел через событие жизненного цикла onCreateView.

Как я могу знать, когда фрагмент готов?

EDIT: Я нашел это How do I know the map is ready to get used when using the SupportMapFragment?

Перекрытие onActivityCreated кажется решением, но тогда я должен создать экземпляр фрагмента через конструктор, а не с newInstance(), он делает никакой разницы?

ответ

35

Мой предпочтительный способ заключается в использовании обратного вызова, чтобы получить сигнал от Fragment. Кроме того, это рекомендуемый метод, предложенный Android в Communicating with the Activity

Для вашего примера, в вашем Fragment, добавьте интерфейс и зарегистрируйте его.

public static interface OnCompleteListener { 
    public abstract void onComplete(); 
} 

private OnCompleteListener mListener; 

public void onAttach(Context context) { 
    super.onAttach(context); 
    try { 
     this.mListener = (OnCompleteListener)context; 
    } 
    catch (final ClassCastException e) { 
     throw new ClassCastException(context.toString() + " must implement OnCompleteListener"); 
    } 
} 

Теперь реализовать этот интерфейс в вашем Activity

public class MyActivity extends FragmentActivity implements MyFragment.OnCompleteListener { 
    //... 

    public void onComplete() { 
     // After the fragment completes, it calls this callback. 
     // setup the rest of your layout now 
     mMapFragment.getMap() 
    } 
} 

Теперь, независимо от вашей Fragment означает, что он загружен, уведомить ваш Activity, что он готов.

@Override 
protected void onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // create your fragment 
    //... 

    // signal that you're done and tell the Actvity to call getMap() 
    mListener.onComplete(); 
} 

EDIT 2017-12-05 onAttach (активность деятельности) является deprecated, используйте onAttach (контекст Context) вместо этого. Код выше скорректирован.

+1

просто комментарий, что onAttach (активность) устарел – Ewoks

+0

Ewoks, поэтому какой метод следует использовать вместо этого? –

0

Я не уверен, что полностью понимаю вашу проблему, но у меня есть аналогичная установка, где я использую раскрывающееся меню навигации. Вот что работает для меня:

1.) Загрузите фрагмент из файла XML и вызвать setupMapIfNeeded()

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.basicMap); 

setUpMapIfNeeded(); 

Вот файл XML для справки:

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/basicMap" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.SupportMapFragment" /> 

2.) Тогда установка карты (подробности isGoogleMapsInstalled(), см this question)

private void setUpMapIfNeeded() 
    { 
    // Do a null check to confirm that we have not already instantiated the map. 
    if (mMap == null) 
    { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.basicMap)).getMap(); 
     // Check if we were successful in obtaining the map. 
     if(isGoogleMapsInstalled()) 
     { 
      if (mMap != null) 
      { 
       mMap.setOnCameraChangeListener(getCameraChangeListener()); 
       mMap.setInfoWindowAdapter(new MyCustomInfoWindowAdapter(this)); 
      } 
     } 
     else 
     { 
      MapConstants.showDialogWithTextAndButton(this, R.string.installGoogleMaps, R.string.install, false, getGoogleMapsListener()); 
     } 
    } 
    } 

3.) Убедитесь, что йо U также вызвать setUpMapIfNeeded() из onResume():

public void onResume() 
{ 
    super.onResume(); 

    setUpMapIfNeeded(); 
} 
1

В дополнение к Kirk's answer: поскольку public void onAttach(Activity activity) осуждается теперь вы можете просто использовать:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 

    Activity activity; 

    if (context instanceof Activity){ 

     activity=(Activity) context; 

     try { 
      this.mListener = (OnCompleteListener)activity; 
     } catch (final ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement OnCompleteListener"); 
     } 
    } 
} 

Остальное остается тем же ... Можно было бы хотеть использовать (Fragment sender) в качестве параметра, хотя и всегда проходят this.

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

  • Нет связанных вопросов^_^