首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FragmentActivity与片段类型GoogleMap的交互

FragmentActivity与片段类型GoogleMap的交互
EN

Stack Overflow用户
提问于 2019-01-30 09:25:36
回答 1查看 64关注 0票数 2

问题,FragmentActivity (称为A)如何与另一个片段(称为B)相互作用,而B依赖于片段(称为C),但C尚未被告知要制作B。

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

场景,A是一个视图,它有一个按钮可以随机添加、更新、删除、修改,B. C中的google是一些视图,它有一个按钮可以转换到google视图,并且这个视图可以反映来自B的动态更新。

A的流,A中的OnButtonClick()与B交互。

流用于C,OnButtonClick()在C中,转换为B。

代码语言:javascript
运行
复制
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...
 }
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-30 22:24:37

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

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

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

(3)在顶层活动中实现地图接口,

(4)从事高层活动,

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

注意:关键是将片段B中的上下文转换为顶级活动,以便通过getter访问我的对象。

代码语言:javascript
运行
复制
/*
 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()*/
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54437194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档