android - 加载屏幕直到 map 出现

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

我正在开发一个显示带有一些标记的 MapFragment 的小型 Android 应用程序。问题是我发现应用程序启动和 map 之间的时间太长了。所以我想在开始时显示一个 ProgressDialog,本地图开始渲染时,关闭 ProgressDialog 并显示 map 。

到目前为止,我通过创建 MapFragment 的实例、调用 getMapAsync 并在 onMapReady 回调中显示 fragment 来进行尝试。但是,如果您不在 onCreate...

中显示 fragment ,它似乎不起作用

这是我的代码:

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/

相关文章:

google-maps - 通过API自定义Google Maps Layers?

google-maps - 将大型 KML 分解为多个(较小的)KML

Android NDK 链接问题

android - 使用什么帐户来创建应用程序 ID

android - 新的 Parse Android SDK 附带的新 GCM(C2DM) 权限是否会禁用当前应用程序用户的自动更新?

android - MapFragment隐藏fragment中的所有内容

javascript - Google Maps API 在创建 InfoWindows 后使用 Javascript 对其进行控制

android - 如何将Mysql JDBC Driver 到android studio

android - 处理屏幕旋转上的 fragment 重复(带有示例代码)

java - 抽屉导航后退按钮到主要 fragment