鴻蒙HarmonyOS之AbilitySlice間導航

2021-01-12 51cto

想了解更多內容,請訪問:

51CTO和華為官方戰略合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

Page模板(以下簡稱「Page」)是FA唯一支持的模板,用於提供與用戶交互的能力。一個Page可以由一個或多個AbilitySlice構成,AbilitySlice是指應用的單個頁面及其控制邏輯的總和。

當一個Page由多個AbilitySlice共同構成時,這些AbilitySlice頁面提供的業務能力應具有高度相關性。例如,新聞瀏覽功能可以通過一個Page來實現,其中包含了兩個AbilitySlice:一個AbilitySlice用於展示新聞列表,另一個AbilitySlice用於展示新聞詳情。

本節主要演示,在一個Page包含多個AbilitySlice時,這些AbilitySlice之間是如何路由和導航的。

創建應用

採用Car設備類型,創建一個AbilitySliceNavigation應用。該應用主要用於測試AbilitySlice之間的路由和導航。

創建多個AbilitySlice

在初始化應用時,AbilitySliceNavigation應用已經包含了一個主AbilitySlice,即為

public class MainAbilitySlice extends AbilitySlice {  @Override  public void onStart(Intent intent) {  super.onStart(intent);  super.setUIContent(ResourceTable.Layout_ability_main);  }  @Override  public void onActive() {  super.onActive();  }  @Override  public void onForeground(Intent intent) {  super.onForeground(intent);  }  } 

因此,還需要再新增一個AbilitySlice。我們複製MainAbilitySlice的代碼,創建了一個PayAbilitySlice。目前,MainAbilitySlice和PayAbilitySlice的代碼是完全相同的。

新增PayAbilitySlice樣式布局

為了體現MainAbilitySlice和PayAbilitySlice的不同,我們需要在「面子」上「整容」一下。我們在layout目錄下,新建了一個ability_pay.xml,如下圖所示


ability_pay.xml內容如下:

xmlns:ohos="http://schemas.huawei.com/res/ohos"  ohos:height="match_parent"  ohos:width="match_parent"  ohos:orientation="vertical">   ohos:id="$+id:text_pay"  ohos:height="match_parent"  ohos:width="match_content"  ohos:background_element="$graphic:background_ability_main"  ohos:layout_alignment="horizontal_center"  ohos:text="Pay me the money"  ohos:text_size="50"  />  ability_pay.xml基本上是從ability_main.xml上複製過去的。主要的差異點是:  l id設置為了$+id:text_pay  l text設置為了Pay me the money 

設置PayAbilitySlice樣式布局

設置了ability_pay.xml之後,如來來使用這個樣式布局呢?參考如下代碼,在通過super.setUIContent()來指定新增的樣式布局即可:

public class PayAbilitySlice extends AbilitySlice {  @Override  public void onStart(Intent intent) {  super.onStart(intent);  // 指定UI  super.setUIContent(ResourceTable.Layout_ability_pay);  }  @Override  public void onActive() {  super.onActive();  }  @Override  public void onForeground(Intent intent) {  super.onForeground(intent);  }  } 

如何實現AbilitySlice之間的路由和導航

設置路由

在MainAbility中,通過addActionRoute方法來添加到PayAbilitySlice的路由。

public class MainAbility extends Ability {  @Override  public void onStart(Intent intent) {  super.onStart(intent);  // 指定默認顯示的AbilitySlice  super.setMainRoute(MainAbilitySlice.class.getName());  // 使用addActionRounte方法添加路由。  addActionRoute("action.pay", PayAbilitySlice.class.getName());  }  } 

在config.json的actions數組中沒添加"action.pay",配置如下:

"abilities": [  {  "skills": [  {  "entities": [  "entity.system.home"  ],  "actions": [  "action.system.home",  "action.pay"  ]  }  ],  "orientation": "landscape",  "name": "com.waylau.hmos.abilityslicenavigation.MainAbility",  "icon": "$media:icon",  "description": "$string:mainability_description",  "label": "AbilitySliceNavigation",  "type": "page",  "launchType": "standard"  }  ] 

設置點擊事件觸發導航

在MainAbilitySlice中,為文本設置了點擊事件,已觸發導航到PayAbilitySlice,代碼如下:

package com.waylau.hmos.abilityslicenavigation.slice;  import com.waylau.hmos.abilityslicenavigation.ResourceTable;  import ohos.aafwk.ability.AbilitySlice;  import ohos.aafwk.content.Intent;  import ohos.agp.colors.RgbColor;  import ohos.agp.components.Button;  import ohos.agp.components.DirectionalLayout;  import ohos.agp.components.Text;  import ohos.agp.components.element.ShapeElement;  public class MainAbilitySlice extends AbilitySlice {  @Override  public void onStart(Intent intent) {  super.onStart(intent);  // 指定UI  super.setUIContent(ResourceTable.Layout_ability_main);  // 添加點擊事件來觸發導航  Text text = (Text) findComponentById(ResourceTable.Id_text_helloworld);  text.setClickedListener(listener ->  present(new PayAbilitySlice(), new Intent()));  }  @Override  public void onActive() {  super.onActive();  }  @Override  public void onForeground(Intent intent) {  super.onForeground(intent);  }  } 

同理,在PayAbilitySlice中,為文本設置了點擊事件,已觸發導航到MainAbilitySlice,代碼如下:

package com.waylau.hmos.abilityslicenavigation.slice;  import com.waylau.hmos.abilityslicenavigation.ResourceTable;  import ohos.aafwk.ability.AbilitySlice;  import ohos.aafwk.content.Intent;  import ohos.agp.colors.RgbColor;  import ohos.agp.components.Button;  import ohos.agp.components.DirectionalLayout;  import ohos.agp.components.Text;  import ohos.agp.components.element.ShapeElement;  public class PayAbilitySlice extends AbilitySlice {  @Override  public void onStart(Intent intent) {  super.onStart(intent);  // 指定UI  super.setUIContent(ResourceTable.Layout_ability_pay);  // 添加點擊事件來觸發導航  Text text = (Text) findComponentById(ResourceTable.Id_text_pay);  text.setClickedListener(listener ->  present(new MainAbilitySlice(), new Intent()));  }  @Override  public void onActive() {  super.onActive();  }  @Override  public void onForeground(Intent intent) {  super.onForeground(intent);  }  } 

運行

運行應用,點擊文本"Hello World"後,可以切換到「Pay me the money」,再點擊文本「Pay me the money」,可以切換到「Hello World」。至此實現了多個AbilitySlice之間的路由和導航。

源碼

源碼見 https://github.com/waylau/harmonyos-tutorial

©著作權歸作者和HarmonyOS技術社區共同所有,如需轉載,請註明出處,否則將追究法律責任

想了解更多內容,請訪問:

51CTO和華為官方戰略合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

【編輯推薦】

點讚 0

相關焦點

  • 2020徵文-手機圖解鴻蒙Feature Ability和AbilitySlice的關係
    2020徵文-手機圖解鴻蒙Feature Ability和AbilitySlice的關係 當我們在DevEco Studio中創建一個鴻蒙項目時,如果選擇的設備是手機,並且選擇的模板是Empty Feature Ability(Java),如下圖所示,那麼自動生成的Hello World
  • 鴻蒙應用開發入門(六):頁面間跳轉
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz1.此時,當其他Page實例期望導航到這些AbilitySlice時,可以通過AbilitySlice之間的跳轉,顯示出這張頁面。
  • 《全面解讀鴻蒙HarmonyOS分布式數據管理平臺》直播答疑(第一彈)
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz《全面解讀HarmonyOS分布式數據管理平臺》直播過後,我們收集了一批開發者們的問題,並分批做出公示,希望能能幫到各位開發者們。
  • 跟阿斌一起學鴻蒙(2). Ability vs App?
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz在進一步實踐之前,需要先弄明白一個概念:Ability。
  • 鴻蒙HarmonyOS開發板訊飛平臺+語音控制開關燈
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz參考連老師博文:https://harmonyos©著作權歸作者和HarmonyOS技術社區共同所有,如需轉載,請註明出處,否則將追究法律責任想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz【編輯推薦】 點讚 0
  • 鴻蒙OS倉庫連登GitHub榜首,華為鴻蒙手機或將年底上市!
    該帳號只關注了harmonyos這一個帳號。harmonyos是7月14日註冊的,沒有任何動態。對比兩個帳號的名稱:harmonyos vs Awesome-HarmonyOS,以及更新的內容來看,猜測未來可能會在Awesome-HarmonyOS帳號下第一時間更新所有鴻蒙OS相關的內容,包括發布更新、源碼文件、文檔等。
  • 鴻蒙應用開發入門(一):鴻蒙系統的概述
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz1.1 鴻蒙系統是一個什麼樣的系統,亮點在哪裡官網首頁上一句話告訴了我們鴻蒙系統是一個什麼樣的系統
  • 2020徵文-TV10分鐘鴻蒙應用實戰開發:鴻蒙手繪板 (含原始碼)
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz前言:本篇旨在通過實踐一些樣例,讓開發者們快速提高腎上腺素,歡樂的加入鴻蒙應用開發之旅。整篇就是一個完整的實操樣例,我也儘量在一片中把內容都講清楚。
  • 2020徵文-手機【乾貨】鴻蒙應用程式流轉的實現!
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz大家好!!歡迎您來到51CTO鴻蒙專區。但是鴻蒙的分布式特性還是存在兩點特別的優勢:(1)蘋果的應用接力開發非常繁瑣。鴻蒙的流轉卻非常簡單,易學。(2)蘋果設備的接力難以實現協同功能。那麼什麼是協同呢?例如,我用手機看新聞列表,用智慧屏瀏覽新聞。而手機上和智慧屏上都運行著同樣一個應用程式,如下圖所示。
  • 鴻蒙HarmonyOS開發Java並發-final關鍵字
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz 【編輯推薦】 點讚 0
  • 【圖解鴻蒙】使用繪圖組件Canvas繪製柱狀圖
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz一、運行效果在頁面中分別使用紅色、黃色和藍色顯示三組柱狀圖,如下圖所示:
  • 【鴻蒙開發板試用報告】OneNet平臺+開發板實時監控溫溼度(一)
    【鴻蒙開發板試用報告】OneNet平臺+開發板實時監控溫溼度(一) OneNET是由中國移動打造的PaaS物聯網開放平臺。平臺能夠幫助開發者輕鬆實現設備接入與設備連接,快速完成產品開發部署,為智能硬體、智能家居產品提供完善的物聯網解決方案。
  • 鴻蒙HarmonyOS2.0發布會現場回憶錄
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz北京時間12月16日上午10點,華為在北京舉行了發布會上,一些與華為合作的知名企業代言人也從人們的密切生活、工作等場景出發,進一步解讀鴻蒙OS帶來的全新創新互動,加之華為技術專家對於鴻蒙OS特有技術的講解,讓在場人士不僅從視、聽、感等多方面體會鴻蒙OS的魅力,也大大滿足熱衷技術的大咖們的求知慾。
  • 【開發實錄】在鴻蒙開發板上使用Websocket(移植自librws庫)
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zzlibrws: Tiny, cross platformwebsocket client C library相關代碼可在下面下載,也可進入librws: 將librws移植到鴻蒙Hi_3861開發板上 (gitee.com)查看技術有限,如有錯誤還望不吝賜教。
  • 鴻蒙Harmony 應用開發view-binding 插件,和findComponentById說再見
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zzharmony-view-binding- view-binding for harmony- 鴻蒙應用開發view-binding插件,消除findComponentById模版代碼- 無註解、編譯期間生成Binding類文件怎麼用?1.
  • 2020徵文-開發板鴻蒙liteos-a如何啟動第一個用戶進程Init_lite
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz1.鴻蒙OS編譯知識OpenHarmony源碼編譯系統使用了google開發的gn工具以及ninjia。這二者結合起來比傳統的makefile編譯系要高效,尤其適合大系統的並行編譯。對開發者而言,如果要參與OpenHarmony的開發,需要對gn的語法有些了解。
  • 華為鴻蒙手機,12月發布!
    鴻蒙官網: harmonyos.com 鴻蒙 OS 開源項目: openatom.org/openharmony 鴻蒙 OS 代碼倉庫: openharmony.gitee.com
  • 華為鴻蒙 為什麼是劃時代的作業系統
    支持各種終端設備的鴻蒙作業系統,正沿著華為規劃的節奏快速成長——9月10日起,華為陸續面向應用開發者發布大屏、手錶、車機的Beta版本;12月發布手機Beta版本,並提供SDK(軟體開發工具包)、開發文檔、開發工具和模擬器,供手機開發者鴻蒙創作手機應用;預計明年,華為的智慧型手機將會升級支持鴻蒙2.0。
  • 鴻蒙系統新進展,解讀HarmonyOS 2.0手機開發者beta版的變化
    aoMEETC-電子工程專輯從華為開發者文檔來看,這裡的「Ability」是HarmonyOS引入的一種應用可提供功能的抽象,Ability類是HarmonyOS應用的基礎組件,是不同設備間系統最小遷移單元,Ability可彼此間聯合或者單獨部署。aoMEETC-電子工程專輯
  • 2020徵文-鴻蒙開發板 Onenet平臺+開發板開關燈控制
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zzOneNET是由中國移動打造的PaaS物聯網開放平臺想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz【編輯推薦】 點讚 0