Android_Fragment遇到BaiduMap

最近比較不忙,就做一個用百度地圖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中的問題,希望有大神看見或者有方案,提點下謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章