【问题标题】:FragmentActivity interact with Fragment type GoogleMapFragmentActivity 与 Fragment 类型的 GoogleMap 交互
【发布时间】:2019-01-30 09:25:36
【问题描述】:

问题,FragmentActivity(称为A)如何与另一个Fragment(称为B)交互,B依赖于Fragment(称为C),但C尚未被告知做B。

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

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

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

C 的流程,C 中的 OnButtonClick(),过渡到 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...
 }
}

【问题讨论】:

  • 我考虑过使用以下方法:(1)接口回调将接口放置在 A 上并从 B 回调,(2)自 GoogleMap 以来,在我的 MainActivity 中使用 FragmentManager 或新类之类的东西实例化 B将成为我应用程序中某些类的共享对象,(3) 将包从 B 传递到 A,(4) 可序列化接口并从 B 传递到 A,(5) 使用 AsyncTask 从 B 到 A 通信,(6)我正在查找 EventBus,但老实说,我不确定这是否会带来可行的解决方案。
  • 是否可以创建一个包含 Fragment B 的 Fragment D?重构代码,使 A 与 D 交互,C 过渡到 B,B 具有 A 和 C 需要的通用功能。
  • @hjchin,澄清一下,A(视图)与 D(SharedGoogleMap)交互,C(视图)转换到 B(GoogleMapLoader),B(GoogleMapLoader)实现 D(SharedGoogleMap)?
  • @hjchin,那么,B 将更新 D,而 A 将获得这些更新?我非常倾向于为此使用界面,我唯一担心的是在 A 获得更新之前谷歌地图可能还没有准备好......请分享你的想法。谢谢。
  • 你的B是A和C都可以访问的同一个实例吗?如果不是这种情况,你将创建 B 的不同实例,然后 D 可以在其片段中包含 B。 D和C类似,不同的是你不做transit,直接在D的xml中附加B的片段。我希望我能正确理解您的问题和答案。

标签: java android android-fragments android-intent


【解决方案1】:

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

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

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

(3) 在顶层activity实现地图接口,

(4) 顶级活动的吸气剂,

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

注意:关键是将片段 B 中的 context 转换为顶级活动,以通过 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()*/
}

【讨论】:

    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 2012-04-19
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多