1. 程式人生 > >Android路由機制下Tab頁跳轉解決方案

Android路由機制下Tab頁跳轉解決方案

        使用過路由框架的人應該知道,使用url的形式進行頁面跳轉是一種很不錯的方式。在不需要import對應頁面引用的情況下,通過url可以開啟頁面,並且可以進行傳遞引數,設定flag等等操作。但是當一個頁面中有viewpager+fragment或者fragmelayout+Fragments的情況下,我們如何通過url進行精準的Tab頁跳轉呢?

1.涉及框架

        路由框架(ARouter)。我現在的專案使用了阿里的Arouter,其他的路由框架也是可以的,跳轉Tab頁也只是一個思路而已。

2.路由降級策略

        在基於路由框架的專案中,一般情況下,當遇到有Tab頁的頁面,若要指定跳轉對應的Tab頁的話,我們可能需要給頁面傳遞一個引數,來告訴頁面我們要跳轉的具體頁面。在頁面中,會根據傳遞過來的引數,如int型別引數,把引數作為碎片集合的角標去把對應tab頁展示出來。這樣一來的話,就無法僅通過一個單一的url來進行精準的跳轉,還需要伴隨一個引數才可以。

        我的思路呢,是僅僅只通過url就可以精確定位要跳轉的Tab頁,那麼這裡就必須要路由框架的降級策略來處理。何為降級策略?

        使用系統自帶的StartActivity()啟動後就無法插手其中任何環節了,只能交給系統管理,這就導致了在跳轉失敗的情況下無法降級,而是會直接丟擲運營級的異常,甚至導致崩潰,這個給使用者的感覺就不是很好。ARouter的降級策略就允許我們在自定義降級服務,在跳轉失敗的時候可以自行處理,比如可以載入H5頁面來處理這種錯誤情況。(此段為轉載內容,詳細可以通過連結來檢視。連結:https://www.jianshu.com/p/008bd4fa9dc0

        也就是通過url並未找到對應邏輯的情況下會走路由的降級處理,這也是思路的關鍵。我們先看一下不通過降級策略進行Tab頁展示的呼叫方式和弊端。

ARouter.getInstance().build("/testModule/dataBaseActivity").withInt("tab_index",2).navigation();

        通過常規方式進行Tab頁跳轉,需要url和tab_index兩個引數才可以進行跳轉。這樣多了一步withInt的資料傳遞,這個倒是不痛不癢,關鍵點是這樣不太適合專案的靈活配置。我的專案呢,因為有多種角色,每種角色在頁面上會有不同的許可權,所以呢,我們的頁面跳轉url都是由後臺傳遞給前端的,前端會在資料庫儲存和重新整理不同許可權的不同跳轉規則。又因為有的頁面就是一個普通的單頁面,但是有的頁面是有Tab的頁面,為了在許可權資料裡能統一,就只以url作為唯一的跳轉資訊。這樣一來,整個移動端的許可權就可以通過後臺進行管理,很靈活和方便。

        算是吐槽了一下常規方式,讚了一下我的方式吧,慚愧慚愧。也有可能我還沒有深挖到路由框架的可以實現Tab跳轉機制,如有了解的朋友,可以告訴我哈。

        好,下面我就通過程式碼的方式來講解一下如何通過路由降級策略來進行Tab頁的跳轉。

        首先我們需要建立降級策略類,實現DegradeService介面。DegradeService是ARouter的一個介面,繼承於IProvider。

看註釋Provide degrade service for router,you can do something when route has lost.也就是當路由失敗的時候會走這裡的邏輯。

/**
 * Provide degrade service for router, you can do something when route has lost.
 *
 * @author Alex <a href="mailto:[email protected]">Contact me.</a>
 * @version 1.0
 * @since 2016/9/22 14:51
 */
public interface DegradeService extends IProvider {

    /**
     * Router has lost.
     *
     * @param postcard meta
     */
    void onLost(Context context, Postcard postcard);
}

        建立DegradeServiceImpl類並實現DegradeService。

@Route(path = "/service/DegradeServiceImpl")
public class DegradeServiceImpl implements DegradeService {
    @Override
    public void onLost(Context context, Postcard postcard) {
        
    }

    @Override
    public void init(Context context) {

    }
}

        建立完畢之後,我來講一下,如何只通過url來確定要跳轉的頁面。一般情況下,頁面的url一般都為“/app/TestPage”,那麼在url中加一點東西。比如有個帶TAb頁的頁面,共有三個Tab,那麼可以定義出三個url來,“/app/TestPage#0”,"/app/TestPage#1","/app/TestPage#2"。當然,帶有Tab頁的頁面的url還是“/app/TestPage”。還是上一部分程式碼吧。

帶有Tab頁的activity的url為“/app/TestPage”。index為接收角標的成員變數,changePage用於根據角標進行Tab頁展示。

@Route(path = "/app/TestPage")
public class TestActivity extends BaseActivity {
        @AutoWired(name = "index")
        public int index;

        //輸入角標index,跳轉到對應Page
        public void changePage(int index){
               ......
        }

    準備好了之後,我們就需要做一下降級策略類中的邏輯,在onLost方法中。當使用Arouter對“/app/TestPage#0”,"/app/TestPage#1","/app/TestPage#2"等url進行navigation時,框架會發現並沒有這幾個url的定義,所以必然會執行路由降級策略,因為路由未找到,所以會執行onLost方法,那麼只需要在onLost中對url做一個拆分,用常規邏輯跳過去,就可以實現僅有url的情況下也可以跳轉到對應頁面的對應Tab頁。

        首先獲取到執行的url,然後判斷url中是否有“#”,如果有,說明此url就是要跳轉Tab頁的,把url以“#”拆分開來,前一部分就是對應頁面的url,後一部分作為一個角標引數來進行一個傳參,然後重新執行這個新路由,便實現了url跳轉Tab頁。

    @Override
    public void onLost(Context context, Postcard postcard) {
        String path = postcard.getPath();
        // path 為空或不包含#號,不做處理
        if (TextUtils.isEmpty(path)){
            return;
        }
        if (!path.contains("#")){
            return;
        }
        // 包含 #,如 /manage/event/eventmanage#tobehandle
        // 需要把 # 號後的部分當作引數傳遞
        String[] str = path.split("#");
        Postcard myPostcard = ARouter.getInstance().build(str[0]);
        for (int i = 1; i < str.length; i++) {
            if (!TextUtils.isEmpty(str[i])) {
                myPostcard.withString("index", str[i]);
            }
        }
        myPostcard.navigation();
    }
        開發者在使用的時候,就不需要再傳參了,只需要使用url就可以了。這樣一來,後臺伺服器也可以根據url來管理移動端所有頁面的跳轉了,很方便。希望能夠幫助到你。

相關推薦

Android路由機制Tab解決方案

        使用過路由框架的人應該知道,使用url的形式進行頁面跳轉是一種很不錯的方式。在不需要import對應頁面引用的情況下,通過url可以開啟頁面,並且可以進行傳遞引數,設定flag等等操作。但是當一個頁面中有viewpager+fragment或者fragmela

使用session處理用戶搜索後數據的上一

sset 上一頁 ade 下拉 soc page arr cat 下拉列表 搜索語句界面: /*單一檢索:此處為一個下拉列表的檢索*/ if(isset($_POST[‘submit‘]) && $_POST[‘submit‘] == ‘點擊搜索‘) {

jeecg 從一個Tab到另一個Tab

方法: <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-undo',plain:true" onclick="self.parent.addOneTa

JavaScript原生程式碼編寫選項卡Tab功能

        本文主要介紹使用 JavaScript 原生程式碼編寫選項卡Tab頁的跳轉功能。 一、先來看看效果圖 二、準備文字素材         文字素材選擇詩經裡面的三首古詩,分別是關雎、蒹葭和采薇         《關雎》         關關雎鳩, 在河之洲

jquery編寫選項卡Tab功能

       前面寫過用JavaScript原生程式碼寫選項卡tab頁的跳轉的方法,在後來的學習工作過程中,發現並不是很實用,這裡分享一個jquery的寫法,比較簡單,也比較容易修改套用,適合初學者學習和使用。 1、首先是選單tab標籤         使用ul-li列出選

location.href頁面不解決方案,附加加兩個小案例

關於window.location.href 不跳轉做了一些小總結 首先說跳轉的條件,在<a>標籤中 首先要要求  a 標籤如下: <a onclick="函式名()" href="javascript:void(0)"></a> 而 a 標

HighCharts中URL在頁面之間傳引數及解決方案

HighCharts中柱狀圖,餅圖等可以實現點選圖表資料來實現頁面之間的跳轉,跳轉到重定向的頁面,並且把對應圖表的資料傳遞到要跳轉到的頁面 下面使用一個簡單的例項進行演示: 這裡使用HighCharts的Cloumn柱狀圖 1.首先,需要在頁面的<script>

WebApp-mui列表上拉載入拉重新整理 詳情

列表頁 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=de

Android EditText 輸入回車符自動一個EditText

在輸入資訊時,在EditText控制元件輸入回車鍵,常常不是換行二十讓游標直接跳轉到下一個編輯框。該功能主要用到了文字監聽器藉口TextWatcher,主要監聽使用者是否輸入回車符,如果監聽到已輸入回車符,就自動將焦點移動到下一個控制元件,從而實現回車符自動跳轉的要求 對T

Android基礎--程式第一次啟動從歡迎到引導,下次再啟動直接從歡迎到主頁

這個在很多的開發中,都會用到,具體的實現方式就是在本地儲存一個標記值。用Handler進行延時操作,在onCreate()裡面,程式碼如下: new Handler(new Handler.Callb

Android 詳情購物車

   1.新增依賴: //recyclerView獲取資料 compile 'com.squareup.okhttp3:logging-interceptor:3.9.0' // fresco圖片載入 compile 'com.facebook.fresco:fre

Android實現真正的ViewPager【平滑過渡】+【迴圈滾動】!!!順帶還有【末】。

實現真正的ViewPager【平滑過渡】+【迴圈滾動】!!!順帶還有【末頁跳轉】。 首先呢, 我要對網上常見的3種ViewPager的迴圈滾動方法做個概述。急需看真正實現方法的同志請選擇性忽略下面這一長段。不過有時間精力的話還是看看,尤其後兩者,我的方法是基於這兩者的:

thinkCMF----列表

field sign request php private render mode his dex thinkCMF列表循環有個:用來循環文章列表。 <php> $where=[ ‘post.create_time‘=>[‘egt‘,0

樂優商城從商品詳情問題

因為商品詳情頁面是通過leyou-goods-web微服務渲染得到,所以在地址字首中就有item: 所以在此頁面進行跳轉的話,必須將原來的路徑替換,因為如果路徑中還有item的話,又回到了leyou-goods-web中的Controller裡,跳轉失敗。 這個導航條是單獨的一個

Android 應用在後臺時, Activity 會自動切換應用至前臺

本部落格 demo 見:demo。 平常用手機的時候經常碰到這種情況,用首屏廣告舉個栗子~很多應用都會有首屏廣告 activity A,假設此應用是 app C,如果此時要使用別的應用,就會使得 app C 在後臺執行。可是當 

使用Charles請求可作為線上和線環境的

調試 訪問 too 接口 代碼 inf com 本地服務 連接 舉個例子: 1.後端拿測試環境的客戶端調試本地的代碼 2.連接後端本地服務測試客戶端和後端的交互 這樣就可以改變客戶端請求的測試環境換成其他的環境 一、配置 tools--Map remot...

webapp 使用者登入,登入完返回重新整理使用者

mui專案:我有兩種方案: 1.window.opener.reload() 2.登入頁以彈出層的方式載入,登入完只需重新整理當前就ok created(){       //判斷是否已登入 } vue-cli專案 當前使用 /

Android學習筆記——Activity之間的(五)

1:使用Intent(意圖)的方式實現Activity跳轉 (1)MainActivity.java: public class MainActivity extends Activity { private Button startOther; @Override pro

Android開發之Activity的建立及傳值

在Android系統的江湖中有四大元件:活動(Activity), 服務(Service), 廣播接收器(Broadcast Reciver)和內容提供者(Content Provider)。今天所介紹的就是Android開發中的四大元件之一:Activity,其他那三大元件

vue 解決addRoutes動態新增路由後重新整理失效問題(“404”頁面)

這篇文章主要介紹了vue 解決addRoutes動態新增路由後重新整理失效問題,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 前言 某些場景下我們需要利用addRoutes動態新增路由,但是重新整理後就會失效,前段時間專案裡剛好遇到了這個應用場景,所以就花時間研究了一下,做下