代码之家  ›  专栏  ›  技术社区  ›  EvOlaNdLuPiZ

FragmentActivity与片段类型GoogleMap交互

  •  2
  • EvOlaNdLuPiZ  · 技术社区  · 6 年前

    ,FragmentActivity(称之为A)如何与另一个片段(称之为B)交互,而B依赖于片段(称之为C),但C还没有被告知生成B。

    假定 ,C还没有OnButtonClick(),所以B还没有被转换到,但A有OnButtonClick(),所以现在A和B可以通信了。

    脚本 , A是一个视图,它有一个按钮可以随机添加、更新、删除、修改B中的谷歌地图。 C是一个视图,它有一个按钮可以转换到GoogleMap视图,这个视图可以反映B的动态更新。

    流动 ,onButton单击中的() 互动 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 回复  |  直到 6 年前
        1
  •  0
  •   EvOlaNdLuPiZ    6 年前

    通过执行以下操作找到解决方案:

    (1) 实现接口MapIf,MapLoader是我的片段,包含共享的google地图,

    (2) 在顶级活动中实例化我的共享google地图对象,

    (4) 在顶级活动中,

    (5) 在片段B上实现MapIf,

    注:钥匙是我的 上下文 在片段B中,作为通过getter访问我的对象的顶级活动。

    /*
     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()*/
    }