我正在开发一个小型Android应用程序,它显示带有一些标记的MapFragment
。问题是我发现应用程序启动之间的时间和地图显示的时间太长。所以我想在开头显示ProgressDialog
,当地图开始渲染时,关闭ProgressDialog
并显示地图。
到目前为止,我通过创建MapFragment
的实例,调用getMapAsync
并在onMapReady
回调中显示片段来尝试它。但是如果你不在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世界中有点新手,这就是我需要你帮助的原因。 请告诉我,如果我的代码或英文错了,我正在学习。
答案 0 :(得分:2)
为了实际获得local[4]
回调,需要创建地图。现在,您只是创建一个top
对象,然后对其执行任何操作。正如您在问题中所述,地图的加载不会开始,直到您将其添加到屏幕上为止。我不确定您的布局XML是如何设置的,但我在测试中的方式是这样的:
用于显示片段的布局XML:
onMapReady
在MapFragment
:
<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));
覆盖它,那么您无法看到正在加载的地图可能并不重要,但这仅仅是我的观点。 Hopfeully这将按预期工作!
编辑:第一个答案没有用,用新方法修改。