最近比較不忙,就做一個用百度地圖SDK做一個demo玩玩,遇到的最大的坑就是自己給自己設計的UI,滑動TAB+Fragment切換不同的方式去目的地..於是切換的時候諾大黑邊已閃瞎……..
國際慣例先來GIF
於是在百度這類問題,發現很多人都是困擾,百度論壇裏管理員官方有回覆說,mapview正在努力適配fragment,請各位開發和設計儘量避免這種設計…..一萬隻草泥馬而過,那你們百度地圖的app 也是這樣的設計爲什麼沒有黑邊,肯定有解決方案…..
所以我只能改變了自己的實現套路,…..把之前的分類別的fragment全部刪除了,變成一個fragment.這樣就只有一個mapview 存在,不會出現疊加的問題.也就不會出現論壇裏說的那個,因爲 聲明週期 銷燬 重繪怎麼怎麼滴的 具體大家百度 fragment 黑邊 即可,
此篇博客只是記錄下,我邏輯不是特別複雜的情況下用一個fragment解決的方案…也感謝羣友提供的思路!
先分析界面”
這張圖是我們輸入出發地和目的地的UI
同樣是fragment,點擊上面的Tab,給fragment傳入不同的TYPE值
標記當前是哪種方式出行
這裏是具體的接口回調界面,根據選擇的當前出行方式,
mapview展示路線圖,
在解決問題之前,我每個TAB 頁籤對應一個不同類型的fragment,
爲了擴展不同的界面展示和需求,,但是寫完,切換的時候,發現了可惡的黑邊, 具體原因不清楚,論壇版主說是 mapview 疊加繪製,
最早的嘗試解決的思路就是在fragment的聲明週期,初始化完畢view後把mapview隱藏.然後給個延時,後再顯示出來,當這樣寫完去打斷點看的時候回發現,
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//代碼執行到這裏的時候,view還沒填充出來,界面已經顯示出baidu地圖的logo和mapview全部的黑框了,mapview 是用glsurfacview寫的
//所以在執行完畢inflate方法後再去隱藏已經晚了
View view = inflater.inflate(R.layout.fragment_route_line_bus, container, false);
init(view);
return view;
}
所以解決的辦法就是保證只有一個mapview實例不疊加,於是我把查詢路線的方法加入了一個tab頁籤的flag,點擊頁籤由原來的replace fragment變成現在的調用更改路線的方法,刷新mapview
// 每次調用之前記得清除下上次的地圖規劃路徑
public void differentRoutePlan(int tabType) {
mLoadingDialog.show();
mBaiduMap.clear();
switch (tabType) {
case RouteLineActivity.TAB_TYPE._BUS:
mRroutePlanSearch.transitSearch((new TransitRoutePlanOption())
.from(mRoutLinePlanots.getStartPlanNode())
.city(mRoutLinePlanots.getTargetPlanNode().getCity())
.to(mRoutLinePlanots.getTargetPlanNode()));
break;
case RouteLineActivity.TAB_TYPE._CAR:
mRroutePlanSearch.drivingSearch((new DrivingRoutePlanOption())
.from(mRoutLinePlanots.getStartPlanNode())
.to(mRoutLinePlanots.getTargetPlanNode()));
break;
case RouteLineActivity.TAB_TYPE._WALK:
mRroutePlanSearch.walkingSearch(new WalkingRoutePlanOption()
.from(mRoutLinePlanots.getStartPlanNode())
.to(mRoutLinePlanots.getTargetPlanNode()));
break;
}
}
還有就是一個有黑邊的地方,我從第一個界面輸完地點後 點擊搜索的時候,跳轉到 路線規劃界面有黑邊閃現,這個問題,用一個延時就搞定了,
我們開頭看的GIF是沒問題的,因爲已經解決了,代碼如下
@Override
public void initView(View view) {
ButterKnife.bind(this, view);
mMapView.setVisibility(View.INVISIBLE);
mLoadingDialog.show();
// 這裏在初始化view的時候,給一個一秒的延時先把mapview隱藏然後一秒後再展現即可,這回地圖已經覆蓋完畢,黑邊不會在出現,用一個loading模擬網絡耗時即可
Observable.interval(1, 5, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Long>() {
@Override
public void onCompleted() {
mLoadingDialog.dismiss();
mMapView.setVisibility(View.VISIBLE);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Long aLong) {
if (0 == aLong.intValue()) {
onCompleted();
this.unsubscribe();
}
}
});
}
這樣就解決了 切換fragment 帶來的黑邊問題,其實就是曲線救國,並沒真正的解決兩個mapview存在兩個不同的fragment中的問題,希望有大神看見或者有方案,提點下謝謝!!!