iT邦幫忙

0

(android) google MAP 地圖更新問題( 能夠正確更改最新經緯度 但需要退出activity重新進入才會是新的地點)

簡單的說就是 請問 我該如何 讀取資料庫上儲存的經緯度後
顯示在MAP上的標示 就會跟著變動
------------------service
https://ithelp.ithome.com.tw/upload/images/20190513/20116358VgKoTuZaoS.jpg
https://ithelp.ithome.com.tw/upload/images/20190513/20116358iIaLqIYIXo.jpg
---------MAP
https://ithelp.ithome.com.tw/upload/images/20190513/20116358vrEhFCRDYr.jpg
https://ithelp.ithome.com.tw/upload/images/20190513/20116358BzbT2pxl6c.jpg
不好意思 請問 我這樣寫後 目前位置是能正確地抓取到現在最新的位置
但是地圖標示 都要重新進入這個Activity後才能夠更新 請問目前該怎麼解決?

(我使用SharedPreferences 去接收firebase儲存的經緯度 然後再轉成Double型態

LatLng sydney = new LatLng(latitude,longitude);//緯度,經度
這裡寫入SharedPreferences的資料 我用LOG看過的 有正確的改變

但是就只差地圖標示問題 都需要重新進入這個Activity )

原本想說 寫一個判斷 如果我的經緯度資料有改變的話 就重新進入
Intent intent =new Intent();
intent.setClass(MapsActivity.this,MapsActivity.class);
startActivity(intent);
但是寫下去後 無法開啟這個頁面 然後 debug模式 就看到他 自己一直跑一直跑

1 個回答

0
小魚-Aria
iT邦新手 5 級 ‧ 2019-05-14 02:27:36

稍微看了一下 ~
你的 addMarker 方法只有在 onMapReady 這個方法中有寫 (如果我沒漏看的話)
也就是說 addMarker 只會在 onMapReady 這個方法執行的時候觸發
( 也就是在你進入 Activity 時 Map 準備好並執行 onMapReady 這個方法的時候 )
所以如果你希望你的 Marker 會跟著你的資料更新
就要在你讀取新資料時再執行一次 addMarker 這個方法
( 這時候若你希望原本的 Marker 不要再顯示~記得要移除原本的 Marker )

另外 googleMap 本身有提供一個方法
public void setMyLocationEnabled (boolean enabled)
若設

mMap.setMyLocationEnabled(true)

googleMap 上就會有一個隨著你的手機定位移動的小藍點
可以參考 官方文件

若有說錯的話歡迎其他大大指正 ~ 感謝 :)

看更多先前的回應...收起先前的回應...

感謝大大
我把SupportMapFragment mapFragment =(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync(MapsActivity.this); 寫到持續監聽資料庫那裡面 已經可以正確的執行我想要的功能了 感謝

getMapAsync 是用來初始化 GoogleMap 並設置 Callback 的方法
你的改法會達到效果是因為每次變化都初始化一次 GoogleMap 並觸發 MapReady
因此 MapReady 裡面的內容都會全部執行一次
但這樣做其實有點不太好 ~
因為初始化 GoogleMap 這件事及 MapReady 裡的內容其實並不需要每次監聽到變化時就全部都重新執行一次
( 通常只會讓他執行一次:初始化一個 GoogleMap 並做一些基本設置 )
( 重複執行不僅吃效能且有點多餘 )
應該只將你想要重複觸發的事情 (例如 addMarker 這個方法) 加到監聽變化的地方

以上是我的小小建議

若有說錯的話歡迎其他大大指正 ~ 感謝 :)

不好意思 我問題裡面忘記說了
我目前這樣做 是為了 :
A先生 B先生
我需要讓A先生知道 B先生目前在哪個位置 隨時注意他的位子
所以 我才需要 在B先生那邊寫個service 讀取B先生 所在位置然後儲存進去firebase
然後 A先生 要查看B先生的位置 就到 firebase 去撈資料 然後在寫進去map裡面 所以A先生地圖裡面的地標圖示就代表B先生的所在位置這樣

上面的建議一樣適用於您的情境唷 ~
也就是說 A 先生那邊去 firebase 撈到資料取得經緯度後
只要在 map 上依取得的座標位置執行 addMarker 方法就可以了 ~
並不需要重新初始化整個 GoogleMap 也不用重新執行 MapReady 裡的所有內容
( MapReady 裡通常會是 GoogleMap 初始化完成後想要做的一些基礎設置,例如設定縮放係數、取得 GoogleMap 實體等等,而這些事情通常只會執行一次,也就是在 GoogleMap 初始化完成後執行。
當然 addMarker 也是可以的,但這個 addMarker 的意義是說"我要在 GoogleMap 初始化完成後加一個 Marker 在某個點"。)
不知道這樣解釋有沒有比較清楚 ~
提供給你參考 ~

我要發表回答

立即登入回答