FragmentActivity взаимодействует с типом фрагмента GoogleMap - PullRequest
0 голосов
/ 30 января 2019

Вопрос , как FragmentActivity (назовите его A) взаимодействует с другим фрагментом (назовите его B), а B зависит от фрагмента (назовите его C), но C еще не было сказано сделатьB.

Предположение , C еще не имел OnButtonClick (), поэтому B не был переведен в, но A имел OnButtonClick (), так что теперь A и B могут связываться.

Сценарий , A - это представление, в котором есть кнопка для случайного добавления, обновления, удаления, изменения карты Google, расположенной в B. C, это представление, в котором есть кнопка для перехода к карте Google.и этот вид может отражать динамические обновления из B.

Поток для A , OnButtonClick () в A взаимодействует с B .

Поток для C , OnButtonClick () в C, переход к B .

public class A extends FragmentActivity implements OnClickListener {
 @Override
 public void onClick(View v) {
    onButtonClick(/*interact with B*/);
 }
}

public class C extends Fragment implements OnClickListener {
 @Override
 public void onClick(View v) {
    onButtonClick(/*transition to B*/);
    FragmentManager fragmentManager = this.getFragmentManager();
    FragmentTransaction fragmentTransaction = 
     fragmentManager.beginTransaction();
    Fragment map = new B();
    fragmentTransaction.replace(R.id.layout_of_C, layout_of_B);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
 }
}

public class B extends Fragment implements OnMapReadyCallback {
 @Override public void onMapReady(GoogleMap map){
  ...some map stuff...
 }
}

abstract view

1 Ответ

0 голосов
/ 31 января 2019

Нашли решение, выполнив следующее:

(1) реализуя интерфейс MapIf, MapLoader - это мой фрагмент, который содержит общую карту Google,

(2) создание моей общей карты Googleобъект на верхнем уровне активности,

(3) реализация интерфейса карты на верхнем уровне активности,

(4) метод получения на верхнем уровне активности,

(5) реализуя MapIf на моем фрагменте B,

примечание: ключ передавал мой context во фрагмент B как активность верхнего уровня для доступа к моему объекту через геттер.

/*
 getMapLoaderSet: need a set with capacity 1, unique map
 getMapLoader: unique map to be accessed
 onMapLoaderSet: do some UI msg Toast on data
*/
interface MapIf<MapLoader>{
 Set<MapLoader> getMapLoaderSet(); 
 MapLoader getMapLoader();
 void onMapLoaderSet(Set<MapLoader> s);
}

public class MainActivity (Top Level) extends Activity{
 private MapLoader mMapLoader;
 private MapIf<MapLoader> mMapIf;
 @Override public void onCreate(...){
 /*unique set of 1; only 1 google map per application*/
 final int capacity = 1;
 this.mMapLoaderSet = new HashSet<>(capacity);
 mMapLoader = new MapLoader();
 mMapLoaderSet.add(mMapLoader);

 /*interface to share map accessibility*/
 mMapIf = new MapIf<MapLoader>() {
 @Override public Set<MapLoader> getMapLoaderSet() { return mMapLoaderSet; }
 @Override public MapLoader getMapLoader() { return mMapLoader; }
 @Override public void onMapLoaderSet(Set<MapLoader> s) { }
 };//mMapIf
 mMapIf.onMapLoaderSet(mMapLoaderSet);
}

public class SomeView (A) extends FragmentActivity implements OnClickListener, MapIf<MapLoader> {
 private Set<MapLoader> mMapLoaderSet;
 private MapLoader mMapLoader;
 @Override for OnCreate(...)
  mMapLoaderSet = ((MainActivity)context).getmMapLoaderSet();
  mMapLoader = mMapLoaderSet.iterator().next();
 }
 @Override for OnClickListener
 @Override for MapIf<MapLoader>
 @Override public Set<MapLoader> getMapLoaderSet() {
  return ((MainActivity)this.getApplicationContext()).getmMapLoaderSet();
 }
 @Override public MapLoader getMapLoader() {
  return ((MainActivity)this.getApplicationContext()).getmMapLoader();
 }
 @Override public void onMapLoaderSet(Set<MapLoader> s) { }
 }

public class MapLoader (B) extends Fragment implements 
 OnMapReadyCallback, MapIf<MapLoader> {
 /* same class members as SomeView (A)*/
 @Override for OnCreate(...)
 @Override for OnMapReadyCallback
 @Override for MapIf<MapLoader>
 /* same override implementation as SomeView (A)*/
 /* use getContext() instead of getApplicationContext()*/
}
...