最近在項目中遇到一個奇葩問題,花了很長時間,在這里記錄下。
問題描述:我的主界面是ViewPager+Fragment,並且設置緩存了我的4個ViewPager頁面。左側是一個側滑菜單,點擊相應按鈕打開不同的Activity。右邊的大片區域用的是FrameLayout將自定義地圖和百度地圖疊加全屏顯示。左下角有一個按鈕用於切換自定義地圖和百度地圖的顯示,其實就是MapView的visibility="gone"和visibility="visible"的操作。簡單畫了下效果圖:
問題來了,我進入該主界面,只要我點擊btn進行地圖顯示的切換過,也就是說百度地圖曾經顯示過(visible),當我再打開其他activity,Back鍵返回到該Fragment時,百度地圖就顯示了,下面的按鈕btn也被遮蓋掉了,無論我之前是否將它隱藏(gone)掉過。在兩個真機Android4.4的設備上運行沒有這個情況,在其他Android4.0,4.1的設備上有這個問題,但是將gone換成invisible也不會有這個問題,但是這樣的話就達不到我想要的效果了。
解決:
思路一:打印從進入到該Fragment,點擊按鈕,打開activity,back鍵返回該Fragment這一過程的log:
在onStop()中記住百度地圖的顯示狀態(控件MapView),在onResume()中根據保存的值去控制百度地圖的顯示,獲取到的值是正確的,但是控制MapView隱藏的代碼卻沒有效果。
思路二:前面說過的4.4的設備運行沒有問題,難道是版本問題?雖說gone,是讓控件不占空間,但是這並不是問題的關鍵,真不知從何下手。
思路三:在百度地圖Android API上找到問題原因,這應該是百度地圖自身的一個bug(以后還是得細看文檔啊)
但是即使知道了這個問題,還是不能完美的解決我的問題,最后我的onResume()中延遲了較短的時間,再將百度地圖(MapView)隱藏或者顯示。
@Override public void onResume() { mMapView.setVisibility(View.VISIBLE); // MapView的生命周期與Activity同步,當activity恢復時需調用MapView.onResume() mMapView.onResume(); super.onResume(); Log.i("yanqiong", "onResume===="+remBaiduMap); baiduMapHandler.postDelayed(baiduMapRunnable, 900); }
Handler baiduMapHandler=new Handler(); Runnable baiduMapRunnable=new Runnable() { @Override public void run() { if(isShowBaiduMap){ webView.setVisibility(View.GONE); mMapView.setVisibility(View.VISIBLE); }else{ webView.setVisibility(View.VISIBLE); mMapView.setVisibility(View.GONE); } baiduMapHandler.removeCallbacks(this); } };