【问题标题】:HERE Map/MapView without using MapFragment popupBackstack issuesHERE Map/MapView 不使用 MapFragment popupBackstack 问题
【发布时间】:2016-10-27 00:12:19
【问题描述】:

我有一个 Activity 并将两个片段(MapScreenFragment 和 OtherFragment)加载到后台堆栈。我遇到的问题是,当我开始从后台弹出一些片段时,MapScreenFragment 显示黑屏。

我应该为 MapView 设置新的地图吗?

map = new Map();
mapView.setMap(map);

XML 布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.here.android.mpa.mapping.MapView
    android:id="@+id/map_view"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"/>

</FrameLayout>

片段类

public class MapScreenFragment extends Fragment {
@Override
public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume");

    if(isMapEngineInitialized && mapEngine != null) {
        mapEngine.onResume();
        mapView.onResume();
        Log.d(TAG, " onResume Map engine reference " + mapEngine.getResourceReferenceCount());
    }
}

@Override
public void onPause() {
    super.onPause();

    Log.d(TAG, "onPause");

    if(isMapEngineInitialized && mapEngine != null) {
        mapEngine.onPause();
        mapView.onPause();
        Log.d(TAG, " onPause Map engine reference " + mapEngine.getResourceReferenceCount());
    }
}
}

/***** added ******/
OnEngineInitListener onEngineInitListener = new OnEngineInitListener() {
    @Override
    public void onEngineInitializationCompleted(Error error) {
        if(error == Error.NONE) {
            isMapEngineInitialized = true;

            if(map == null) {
                Log.d(TAG, " Map is null");
                map = new Map();
            }

            mapView.setMap(map);
            mapView.setMapMarkerDragListener(MapScreenFragment.this);

            map = mapView.getMap();
            map.addTransformListener(MapScreenFragment.this);

            mapGesture = mapView.getMapGesture();
            mapGesture.setAllGesturesEnabled(true);
            mapGesture.addOnGestureListener(MapScreenFragment.this);

            setUpMap();

            Log.d(TAG, "MapEngine initialized! " + mapEngine.getResourceReferenceCount());

        }

    }
};

MainActivity Backpressed 并添加 Fragments

mapFragment = new MapScreenFragment ();
mFragmentTransaction =  getSupportFragmentManager().beginTransaction();
mFragmentTransaction.add(R.id.main_frame_layout, mapFragment , mdmFragmentID);
mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
mFragmentTransaction.addToBackStack(null);
mFragmentTransaction.commit();



otherFragment = new OtherFragment ();
mFragmentTransaction =  getSupportFragmentManager().beginTransaction();
mFragmentTransaction.replace(R.id.main_frame_layout, otherFragment , mdmFragmentID);
mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
mFragmentTransaction.addToBackStack(null);mFragmentTransaction.commit();


@Override
public void onBackPressed() {
    Log.d(TAG, "Back stack count " + getSupportFragmentManager().getBackStackEntryCount());
    if( getSupportFragmentManager().getBackStackEntryCount() == 1) {
        finish();
    } else {
        getSupportFragmentManager().popBackStack();
    }
}

【问题讨论】:

  • 另外,您使用的是哪个 SDK 版本?

标签: android android-fragments sdk here-api


【解决方案1】:

确保在 isMapEngineInitialized == false 的情况下调用 MapView#onResume(),尤其是在回调 MapEngine#onEngineInit 侦听器时。

通常,应用程序生命周期调用 onResume() 远早于引擎初始化。如果未调用 MapView#onResume(),则不会启动底层渲染构造。有关示例,请参阅我们的示例应用程序。

另外,为什么不使用嵌套片段?您始终可以将 MapFragment 嵌入到另一个片段中,以便自动处理生命周期。

【讨论】:

  • 嵌套片段不是不好的做法吗?我没有使用 MapFragment 的另一个原因是因为我想将其他视图对象从主 Activity 中分离出来,例如搜索栏和弹出视图等。
  • 我相信在Android 4.2之后,嵌套的fragment是很正常的并且得到了很好的支持。它也应该是 support-library.too 的一部分。请看developer.android.com/about/versions/…
  • 您在哪个 SDK 版本中看到了这个问题?
  • 我尝试了您的建议,但 MapFragment 在初始化时出现 UNKNOWN 错误。
  • appid、appcode和权限字符串你加了吗?和任何 adb logcat 日志?也许有什么东西引发了异常?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2022-06-20
相关资源
最近更新 更多