当屏幕再次打开时,MapView Fragment显示黑色(视图为空)

时间:2012-06-16 20:17:06

标签: android google-maps tabs android-fragments android-mapview

片段中的我的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; }

干杯。

1 个答案:

答案 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