我正在开发一个显示带有一些标记的 MapFragment
的小型 Android 应用程序。问题是我发现应用程序启动和 map 之间的时间太长了。所以我想在开始时显示一个 ProgressDialog
,本地图开始渲染时,关闭 ProgressDialog
并显示 map 。
到目前为止,我通过创建 MapFragment
的实例、调用 getMapAsync
并在 onMapReady
回调中显示 fragment 来进行尝试。但是,如果您不在 onCreate
...
这是我的代码:
public class MyApp extends FragmentActivity implements OnMapReadyCallback
{
private ProgressDialog mLoading;
private MapFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mFragment = MapFragment.newInstance();
mFragment.getMapAsync(this);
// Dosen't work without the line below
// getFragmentManager().beginTransaction().replace(android.R.id.content, mFragment).commit();
mLoading = ProgressDialog.show(this, "Chargement", "", true, false);
}
@Override
public void onMapReady(GoogleMap googleMap)
{
googleMap.setOnMyLocationButtonClickListener(null);
googleMap.setMyLocationEnabled(false);
googleMap.getUiSettings().setMyLocationButtonEnabled(false);
googleMap.getUiSettings().setMapToolbarEnabled(false);
// When map renders entirely, dismiss ProgressDialog and display MapFragment
mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback()
{
@Override
public void onMapLoaded()
{
mLoading.dismiss();
getFragmentManager().beginTransaction().replace(android.R.id.content, mFragment).commit();
}
});
// ...
}
我是 Android 世界的新手,所以我需要您的帮助。 如果我的代码或英语有误,请告诉我,我正在学习两者。
最佳答案
为了真正获得onMapReady
回调,需要创建 map 。现在,您只是创建一个 MapFragment
对象,然后什么都不做。正如您在问题中指出的那样,直到您将 map 添加到屏幕后才会开始加载 map 。我不确定您的布局 XML 是如何设置的,但我在测试中的做法是这样的:
您希望 Fragment 出现的位置的布局 XML:
<FrameLayout
android:id="@+id/frame_map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false" />
在 onCreate
中:
MapFragment mFragment = MapFragment.newInstance();
getFragmentManager().beginTransaction().add(R.id.frame_map, mFragment).commit();
FrameLayout fl = new FrameLayout(context);
fl.setBackgroundColor(Color.WHITE); //change to whatever color your activity/fragment has set as its background color
fl.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); //cover the whole frame
final int flid = View.generateViewId(); //generate a new View ID. This requires API 17, so if you're supporting lower than that use just a static integer instead
fl.setId(flid);
((FrameLayout) findViewById(R.id.frame_map)).addView(fl);
然后,在您的 onMapLoaded
回调中:
((FrameLayout) findViewById(R.id.frame_map)).removeViewInLayout(findViewById(flid));
这将启动 Fragment,然后用一个新的 FrameLayout
覆盖它,它只会有一个坚实的背景(可能有更好的方法来做到这一点,我只是很快找到了这个)。然后,一旦加载完成,覆盖布局将被删除。或者,由于您无论如何都用 ProgressDialog
覆盖它,因此看不到正在加载的 map 可能并不重要,但这只是我的意见。希望这会按预期工作!
编辑:第一个答案无效,用新方法修改。
关于android - 加载屏幕直到 map 出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426245/