加载屏幕直到地图显示

时间:2016-07-17 21:47:55

标签: android android-fragments google-maps-api-3

我正在开发一个小型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世界中有点新手,这就是我需要你帮助的原因。 请告诉我,如果我的代码或英文错了,我正在学习。

1 个答案:

答案 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这将按预期工作!

编辑:第一个答案没有用,用新方法修改。

相关问题