问题,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。
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...
}
}

发布于 2019-01-30 22:24:37
通过执行以下操作找到解决方案:
(1)实现一个接口MapIf,MapLoader是我的片段,包含共享的谷歌地图,
(2)在顶级活动中实例化我共享的google地图对象,
(3)在顶层活动中实现地图接口,
(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()*/
}https://stackoverflow.com/questions/54437194
复制相似问题