【问题标题】:Loading screen until map appears加载屏幕直到地图出现
【发布时间】:2016-11-20 10:37:37
【问题描述】:

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

到目前为止,我通过创建MapFragment 的实例、调用getMapAsync 并在onMapReady 回调中显示片段来进行尝试。但是在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 世界的新手,所以我需要您的帮助。 如果我在代码或英语方面有错误请告诉我,我正在学习。

【问题讨论】:

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


    【解决方案1】:

    为了真正获得onMapReady 回调,需要创建映射。现在,您只是在创建一个 MapFragment 对象,然后什么都不做。正如您在问题中指出的那样,在您将其添加到屏幕之前,地图的加载不会开始。我不确定你的布局 XML 是如何设置的,但我在测试中的做法是这样的:

    您希望片段出现的位置的布局 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 覆盖它,因此看不到正在加载的地图可能并不重要,但这只是我的看法。 Hopfeully 这将按预期工作!

    编辑:第一个答案不起作用,用新方法修改。

    【讨论】:

    • 我试过了,但如果视图被隐藏,似乎地图不会加载。在这种情况下,不会调用 onMapLoaded 回调。即使我在 onMapReady 中设置 Vew 可见。
    • 嗯,奇怪......今天晚些时候有机会我会稍微弄乱一下,看看我能为你想出什么!
    • 我在我的应用程序中玩了一下它并修改了我的答案。这似乎对我有用,如果有用,请告诉我!
    • 非常感谢您的时间和帮助,它运作良好。我将使用FrameLayout 做一个启动画面
    猜你喜欢
    • 2016-09-13
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多