想了解更多內容,請訪問:
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