社区首页 >问答首页 >android - ProgressDialog加载谷歌地图

android - ProgressDialog加载谷歌地图
EN

Stack Overflow用户
提问于 2013-06-06 02:33:32
回答 3查看 4.1K关注 0票数 0

我有一个活动,实现谷歌地图我启动它,该活动停止了几秒钟,直到地图完全加载。我希望在地图不加载之前使用ProgressDialog,但我不能在后台线程中启动它,因为地图必须在主线程中加载,如this link中所述。

不用AsyncTask怎么做?

否则,有没有办法像Google Maps应用程序那样立即启动活动并以灰色背景显示未加载的地图?

这是onCreate方法的代码:

代码语言:javascript
代码运行次数:0
复制
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mappa);
    databaseHelper = new MyDatabaseHelper(this);
    Bundle b = getIntent().getExtras();
    String placeAddress= "";
    if(b != null)
        placeAddress= b.getString("indirizzo");

    setUpMapIfNeeded();
    gMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    gMap.setMyLocationEnabled(true);
    UiSettings settings = gMap.getUiSettings();
    settings.setMyLocationButtonEnabled(true);

    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);
    double lat = location.getLatitude();
    double lng = location.getLongitude();
    position = new LatLng(lat, lng);

    if(!placeAddress.equals("")){
        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        List<Address> indirizzi = null;
        try {
            indirizzi = geocoder.getFromLocationName(placeAddress, 1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        double latLuogo = indirizzi.get(0).getLatitude();
        double lngLuogo = indirizzi.get(0).getLongitude();
        LatLng luogo = new LatLng(latLuogo, lngLuogo);
        CameraPosition cameraPosition = new CameraPosition.Builder()
            .target(luogo)
            .zoom(15)
            .build();
        gMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    }
    else{
        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(position)
                .zoom(15)
                .build();
        gMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    }

    LocationListener listener = new LocationListener() {
            public void onLocationChanged(Location location){
                //makeUseOfNewLocation(location);
            }

            @Override
            public void onProviderDisabled(String arg0) {}

            @Override
            public void onProviderEnabled(String arg0) {}

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    locationManager.requestLocationUpdates(provider, 0, 10, listener);

    ConnectivityManager connMngr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo netInfo = connMngr.getActiveNetworkInfo();

    if(checkConnection(netInfo) == true ){
    loadFromDatabase();   //load markers

    gMap.setInfoWindowAdapter(new InfoWindowAdapter(){

        @Override
        public View getInfoWindow(Marker marker) {
            return null;
        }

        @Override
        public View getInfoContents(Marker marker) {
            String nome = marker.getTitle();
            String indirizzo = marker.getSnippet();
            View v = getLayoutInflater().inflate(R.layout.info_window_layout, null);
            TextView title = (TextView)v.findViewById(R.id.titleInfoWindow);
            title.setText(nome);
            TextView snippet = (TextView)v.findViewById(R.id.snippetInfoWindow);
            snippet.setText(indirizzo);
            ImageView imView = (ImageView)v.findViewById(R.id.info_windowImageView);
            impostaImmagine(imView, nome);
            return v;
        }
    });

    gMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {

        @Override
        public void onInfoWindowClick(Marker marker) {
            final String nome = marker.getTitle();
            final String indirizzo = marker.getSnippet();
            startLuogoActivity(nome, indirizzo);
        }
    });

    final Geocoder geocoder = new Geocoder(this, Locale.getDefault());

    gMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {

        @Override
        public void onMapLongClick(LatLng point) {
            List<Address> addresses = null;
            if(checkConnection(netInfo) == true){
                try {
                    addresses = geocoder.getFromLocation(point.latitude, point.longitude, 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if(addresses!=null){
                    String address = addresses.get(0).getAddressLine(0);
                    String city = addresses.get(0).getAddressLine(1);
                    String country = addresses.get(0).getAddressLine(2);
                    String indirizzo = address + ", " + city + ", " + country;
                    final Dialog addByClickDialog = onCreateDialogADDByClick(getBaseContext(), indirizzo);
                    addByClickDialog.show();
                    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                    v.vibrate(50);
                }else{
                    final Dialog nessunaConnessioneDialog = onCreateDialogNessunaConnessione(getBaseContext());
                    nessunaConnessioneDialog.show();
                    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                    v.vibrate(50);
                }
            }
            else{
                final Dialog nessunaConnessioneDialog = onCreateDialogNessunaConnessione(getBaseContext());
                nessunaConnessioneDialog.show();
                Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(50);
            }
        }
    });

    Button addButton = (Button)findViewById(R.id.addButton);
    final Dialog addDialog;
    if(checkConnection(netInfo) == false){
        addDialog = onCreateDialogADD(getBaseContext(), false);
    }else{
        addDialog = onCreateDialogADD(getBaseContext(), true);
    }
    addButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            addDialog.show();
        }
    });

    Button deleteButton = (Button)findViewById(R.id.deleteButton);
    final Dialog deleteDialog;
    if(checkConnection(netInfo) == false){
        deleteDialog = onCreateDialogDELETE(getBaseContext(), false);
    }else{
        deleteDialog = onCreateDialogDELETE(getBaseContext(), true);
    }
    deleteButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            deleteDialog.show();
        }
    });
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-09 01:43:15

我终于解决了这个问题!我使用了this tutorial中的代码。

我所要做的就是在这段代码中出现"setContentView(R.layout.main);“调用的地方加载地图和标记。

票数 0
EN

Stack Overflow用户

发布于 2013-06-06 02:46:13

通过@commonsware查看ProgressDialog not shown in UIThread问题的答案。将ProgressDialog用于MapActivity可能不是一个好主意,因为显示MapView所需的时间主要取决于返回到Google Maps服务器的互联网连接。您无法知道MapView何时完成加载,因此您无法知道何时关闭对话框。但是,如果您仍然非常确定它将始终加载,并将花费更少的时间,那么您可以阅读更多的here。您可能还想查看指向同一链接的相关问题:Android : showDialog when setContentView loading

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2018-05-02 11:16:58

遵循以下步骤:

1)实现GoogleMap.OnMapLoadedCallback.

地图准备就绪时的回调接口。

2) onCreate方法中的ProgressDialog代码。

//显示进度

3)onMapReady方法

代码语言:javascript
代码运行次数:0
复制
@Override
    public void onMapReady(GoogleMap googleMap) {
        Log.d(TAG, "OnMapReady");
        mMap = googleMap;
        mMap.setOnMapLoadedCallback(this);

3)地图加载时调用onMapLoaded()。

代码语言:javascript
代码运行次数:0
复制
public void onMapLoaded() {
       // hide progress

    }

请检查第3点,这很重要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16952830

复制
相关文章
android 自定义progressdialog,自定义ProgressDialog
最近工作中需要用到progressDialog,可是系统自带的黑色progressDialog又是其丑无比,无奈只能自己自定义了,在网上查看别人的例子,并自己整理了一份Demo:
全栈程序员站长
2022/09/14
7460
android 自定义progressdialog,自定义ProgressDialog
Android点击button弹出ProgressDialog,响应结束后ProgressDialog消失
  使用背景:项目中需要使用几个机器学习模型,由于加载很缓慢,所以考虑用ProgressDialog来进行提示,预测结束后dialog自动消失。   效果如下:
全栈程序员站长
2022/09/14
1.1K0
Android点击button弹出ProgressDialog,响应结束后ProgressDialog消失
Android之ProgressDialog的使用
ProgressDialog 继承自AlertDialog,AlertDialog继承自Dialog,实现DialogInterface接口。
全栈程序员站长
2022/09/06
4790
tableau server 离线加载自定义谷歌地图瓦片
然而tableau只要联机就可以自动加载openstreetmap的地图,这对于国内用户而言还是不太方便,同时虽然它也提供了对WMS,MAPBOX等服务的地图加载,然而这两种方式相对还是不方便。
sparkexpert
2022/05/07
1.2K0
tableau server 离线加载自定义谷歌地图瓦片
Android-ProgressDialog进度对话框
使用方法: 如果只是普通进度对话框 直接调用ProgressDialog静态方法 show() 即可 创建ProgressDialog 调用方法进行具体设置 setIndeterminate(false); 设置进度条是否显示进度 setMax(MAX_PROGRESS); 设置进度条的最大值 setMessage("..."); 设置对话框执行内容 setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) 设置对话框进度条风格 setProgress() 设置 进
圆号本昊
2021/09/24
7730
Android-ProgressDialog进度对话框
谷歌离线地图开发_谷歌实时在线街景地图
离线地图开发主要有两部分组成:1、获取离线地图数据;因为离线地图一般都是局域网,所以需要离线地图数据放在内网中使用;2、离线地图服务器搭建以及二次开发接口提供,离线地图是一种服务,就像我们Apache提供的WEB服务器一样,他是一种准们的地图服务:提供了包括 WEB服务、TMS服务、WMTS服务等等。
全栈程序员站长
2022/11/08
1.7K0
谷歌离线地图开发_谷歌实时在线街景地图
【Android从零单排系列十六】《Android视图控件——ProgressDialog》
小伙伴们,在上文中我们介绍了Android视图组件AlertDialog,本文我们继续盘点,介绍一下视图控件的ProgressDialog。
再见孙悟空_
2023/07/17
1.1K0
ProgressDialog总结
ProgressDialog 继承自AlertDialog,AlertDialog继承自Dialog,实现DialogInterface接口。
全栈程序员站长
2022/09/14
3540
leaflet加载天地图
leaflet是一个轻量级的并且开源的地图框架,是由esri发起的,由于其轻量、简单而被大家喜欢,本文带你学习如何在leaflet中加载天地图。
牛老师讲GIS
2018/10/23
4.4K0
ProgressDialog 使用
[功能] ProgressDialog 也是一种Dialog 一般 在出现ProgressDialog 后台都会再开辟Thread 来做一些耗时的工作 我演示的是从100数到0 这段时间既不太长 不用浪费时间等待 同时 也能明显地看出效果
全栈程序员站长
2022/09/14
2530
Android ListView下拉/上拉刷新:设计原理与实现「建议收藏」
Android上ListView的第三方开源的下拉刷新框架很多,应用场景很多很普遍,几乎成为现在APP的通用设计典范,甚至谷歌官方都索性在Android SDK层面支持下拉刷新,我之前写了一篇文章《Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新》专门介绍过(链接地址:http://blog.csdn.net/zhangphil/article/details/46965377 )。 每一种ListView下拉刷新的开源框架,基本功能相同,设计原理大同小异,下拉刷新的功能实现,其中一个设计实现的的方案核心要点大多集中在ListView的OnScrollListener()等事件的重写上。但是,常见的一些下拉刷新开源框架中,有些缺乏上拉刷新的功能。上拉刷新的功能在一些应用场景中也是需要的,比如,当用户的设备屏幕由于数据需要从网络中加载,但一次网络请求根本不可能把全部数据都加载完,因此在初始化阶段只喂全部数据中的一部分数据。当用户在一个ListView中翻到最底时候,“加载更多”,注意!此处出现另外一种设计方案,比如在ListView的footer view中设计一个按钮,假设按钮就叫做“加载更多”,当用户翻到ListView最后见底时候,点击该按钮后才“加载更多”再次发起数据请求加载更多数据,然后刷新ListView,这种设计方案也比较常见。本文则介绍一个可以自动感知ListView下拉到底、然后可自动加载更多的支持下拉/上拉刷新的ListView。
全栈程序员站长
2022/09/15
9770
Android ListView下拉/上拉刷新:设计原理与实现「建议收藏」
ProgressDialog不显示
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159117.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
3270
Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/37936275
全栈程序员站长
2022/09/14
2.1K0
Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
Openlayers离线加载天地图
经过一个春节的休整,今天终于开始了!不论什么时候,都不要忘记学习,学习是一辈子的事情!今天,我来说说如何实现天地图的离线以及Openlayers加载离线数据实现天地图数据的展示。
牛老师讲GIS
2018/10/23
3K0
Openlayers离线加载天地图
谷歌地图地理解析
地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程。
全栈程序员站长
2022/09/07
1.5K0
Arcgis for js加载天地图
天地图的切片地图可以通过esri.layers.TiledMapServiceLayer来加载,在此将之进行了一定的封装,如下:
牛老师讲GIS
2018/10/23
7.7K0
Arcgis for js加载天地图
progressdialog进度框_ProgressDialog进度对话框「建议收藏」
ProgressDialog是AlertDialog类的一个扩展,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。
全栈程序员站长
2022/09/15
6750
点击加载更多

相似问题

Android:如何加载谷歌地图

22

谷歌地图未加载android

41

android谷歌地图没有加载地图

31

Android :加载谷歌地图的错误

11

android studio -谷歌地图无法加载

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档