片段中的我的MapView解决方案主要基于ChristophK,user1414726和inazaruk在此SO帖子中提供的示例:mapview-in-a-fragment
在Fragment中调用onPause()时,会进行一些清理以避免IllegalArgumentException。 onPause和onStop中的代码:
if (mapViewContainer != null) {
mapViewContainer.setVisibility(View.GONE);
((ViewGroup) mapViewContainer.getParent()).removeView(mapViewContainer);
mapViewContainer = null;
}
当在滑动到其他片段时调用onPause时,这很正常,因为当MapActivity再次可见时,onCreateView(..)会在片段中被覆盖,其中mapViewContainer被重新实例化。
当我关闭屏幕时,但;当屏幕重新打开电源时,onCreateView(..)不会被覆盖(onPaused和onResume调用正常)。这会导致MapView显示黑色,因为onPause中的removeView调用视图为null,直到在某次交互后再次调用onCreateView(..)。
当屏幕重新启动时,如何强制onCreateView覆盖或以某种方式将MapView添加回Fragment?
onCreateView(..)中的代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// This is where you specify you activity class
Intent i = new Intent(getActivity(), MapTabActivity.class);
Window w = mLocalActivityManager.startActivity("tag", i);
mapViewContainer = w.getDecorView();
mapViewContainer.setVisibility(View.VISIBLE);
mapViewContainer.setFocusableInTouchMode(true);
((ViewGroup)
mapViewContainer).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
return mapViewContainer; }
干杯。
答案 0 :(得分:1)
我可能已经找到了解决问题的方法。我不认为这是一个好的,但它似乎工作..
如果在onStart()中保存对mapViewContainer的父级(我使其为静态)的引用,则可以将onViewestatainer添加到onResume()中的父级(如果它尚未包含)。
这是我做的:
private static ViewParent parent;
@Override
public void onStart() {
super.onStart();
parent = mapViewContainer.getParent();
}
@Override
public void onResume() {
super.onResume();
if(mapViewContainer != null && parent != null && ((FrameLayout) parent).findViewById(mapViewContainer.getId()) == null) {
((FrameLayout) parent).addView(mapViewContainer);
}
}
在onPause()中我没有设置mapViewContainer == null,所以我可以重用它。
如果您有任何改进此“解决方案”的建议,我们非常欢迎您!
希望它有所帮助。
CHEERS