0

我在 Fragment 中的 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;
}

这在滑动到其他 Fragment 时调用 onPause 时效果很好,因为当 MapActivity 再次可见时,onCreateView(..) 在 Fragment 中被覆盖,其中 mapViewContainer 被重新实例化。

但是当我关闭屏幕时;当屏幕重新开机时,onCreateView(..) 不会被覆盖(onPaused 和 onResume 调用工作正常)。这会导致 MapView 显示为黑色,因为在 onPause 中的 removeView 调用中视图为空,直到在某些交互后再次调用 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; }

干杯。

4

1 回答 1

1

我可能已经找到了我们问题的答案。我不认为这是一个很好的,但它似乎工作..

如果您在 onStart() 中保存对 mapViewContainer 的父级(我将其设为静态)的引用,则可以在 onResume() 中将 mapViewContainer 添加到父级(如果它尚未包含)。

这是我所做的:

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,所以我可以重用它。

如果您有任何改进此“解决方案”的建议,非常欢迎您!

希望能帮助到你。

干杯

于 2012-06-20T08:51:46.263 回答