HarmonyOS4.0從零開始的開發教程11給您的應用添加彈窗

HarmonyOS(十)給您的應用添加彈窗

概述

在我們日常使用應用的時候,可能會進行一些敏感的操作,比如刪除聯系人,這時候我們給應用添加彈窗來提示用戶是否需要執行該操作,如下圖所示:

點擊放大

彈窗是一種模態窗口,通常用來展示用戶當前需要的或用戶必須關注的信息或操作。在彈出框消失之前,用戶無法操作其他界面內容。ArkUI為我們提供了豐富的彈窗功能,彈窗按照功能可以分為以下兩類:

  • 確認類:例如警告彈窗AlertDialog。
  • 選擇類:包括文本選擇彈窗TextPickerDialog 、日期滑動選擇彈窗DatePickerDialog、時間滑動選擇彈窗TimePickerDialog等。

您可以根據業務場景,選擇不同類型的彈窗。部分彈窗效果圖如下:

點擊放大

此外,如果上述彈窗還不能滿足您的需求,或者需要對彈窗的布局和樣式進行自定義,您還可以使用自定義彈窗CustomDialog。

下文將分別介紹AlertDialog 、TextPickerDialog 、DatePickerDialog以及CustomDialog的使用。

警告彈窗

警告彈窗AlertDialog由以下三部分區域構成,對應下面的示意圖:

  1. 標題區:為可選的。
  2. 內容區:顯示提示消息。
  3. 操作按鈕區:用戶做”確認“或者”取消“等操作。

點擊放大

以下示例代碼,演示了如何使用AlertDialog 實現上圖所示的警告彈窗。AlertDialog可以設置兩個操作按鈕,示例代碼中分別使用primaryButton和secondaryButton實現了“取消”和“刪除”操作按鈕,操作按鈕可以通過action響應點擊事件。

Button('點擊顯示彈窗').onClick(() => {AlertDialog.show({title: '刪除聯系人', // 標題message: '是否需要刪除所選聯系人?', // 內容autoCancel: false, // 點擊遮障層時,是否關閉彈窗。alignment: DialogAlignment.Bottom, // 彈窗在豎直方向的對齊方式offset: { dx: 0, dy: -20 }, // 彈窗相對alignment位置的偏移量primaryButton: {value: '取消',action: () => {console.info('Callback when the first button is clicked');}},secondaryButton: {value: '刪除',fontColor: '#D94838',action: () => {console.info('Callback when the second button is clicked');}},cancel: () => { // 點擊遮障層關閉dialog時的回調console.info('Closed callbacks');}})})

此外,您還可以使用AlertDialog,構建只包含一個操作按鈕的確認彈窗,使用confirm響應操作按鈕回調。

AlertDialog.show({title: '提示',message: '提示信息',autoCancel: true,alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: -20 },confirm: {value: '確認',action: () => {console.info('Callback when confirm button is clicked');}},cancel: () => {console.info('Closed callbacks')}}
)

選擇類彈窗

選擇類彈窗用于方便用戶選擇相關數據,比如選擇喜歡吃的水果、出生日期等等。下面我們以TextPickerDialog和DatePickerDialog為例,來介紹選擇類彈窗的使用。

文本選擇彈窗

TextPickerDialog為文本滑動選擇器彈窗,根據指定的選擇范圍創建文本選擇器,展示在彈窗上,例如下面這段示例代碼使用TextPickerDialog實現了一個水果選擇彈窗。示例代碼中使用selected指定了彈窗的初始選擇項索引為2,對應的數據為“香蕉”。當用戶點擊“確定”操作按鈕后,會觸發onAccept事件回調,在回調中將選中的值,傳遞給宿主中的select變量。

@Entry
@Component
struct TextPickerDialogDemo {@State select: number = 2;private fruits: string[] = ['蘋果', '橘子', '香蕉', '獼猴桃', '西瓜'];build() {Column() {Button("TextPickerDialog").margin(20).onClick(() => {TextPickerDialog.show({range: this.fruits, // 設置文本選擇器的選擇范圍selected: this.select, // 設置初始選中項的索引值。onAccept: (value: TextPickerResult) => { // 點擊彈窗中的“確定”按鈕時觸發該回調。// 設置select為按下確定按鈕時候的選中項index,這樣當彈窗再次彈出時顯示選中的是上一次確定的選項this.select = value.index;console.info("TextPickerDialog:onAccept()" + JSON.stringify(value));},onCancel: () => { // 點擊彈窗中的“取消”按鈕時觸發該回調。console.info("TextPickerDialog:onCancel()");},onChange: (value: TextPickerResult) => { // 滑動彈窗中的選擇器使當前選中項改變時觸發該回調。console.info("TextPickerDialog:onChange()" + JSON.stringify(value));}})})}.width('100%')}
}

效果圖如下:

點擊放大

日期選擇彈窗

下面我們介紹另一種常用的選擇類彈窗DatePickerDialog,它是日期滑動選擇器彈窗,根據指定的日期范圍創建日期滑動選擇器,展示在彈窗上。DatePickerDialog的使用非常廣泛,比如當我們需要輸入個人出生日期的時候,就可以使用DatePickerDialog。下面的示例代碼實現了一個日期選擇彈窗:

@Entry
@Component
struct DatePickerDialogDemo {selectedDate: Date = new Date("2010-1-1")build() {Column() {Button("DatePickerDialog").margin(20).onClick(() => {DatePickerDialog.show({start: new Date("1900-1-1"), // 設置選擇器的起始日期end: new Date("2023-12-31"), // 設置選擇器的結束日期selected: this.selectedDate, // 設置當前選中的日期lunar: false,onAccept: (value: DatePickerResult) => { // 點擊彈窗中的“確定”按鈕時觸發該回調// 通過Date的setFullYear方法設置按下確定按鈕時的日期,這樣當彈窗再次彈出時顯示選中的是上一次確定的日期this.selectedDate.setFullYear(value.year, value.month, value.day)console.info("DatePickerDialog:onAccept()" + JSON.stringify(value))},onCancel: () => { // 點擊彈窗中的“取消”按鈕時觸發該回調console.info("DatePickerDialog:onCancel()")},onChange: (value: DatePickerResult) => { // 滑動彈窗中的滑動選擇器使當前選中項改變時觸發該回調console.info("DatePickerDialog:onChange()" + JSON.stringify(value))}})})}.width('100%')}
}

效果圖如下:

點擊放大

自定義彈窗

自定義彈窗的使用更加靈活,適用于更多的業務場景,在自定義彈窗中您可以自定義彈窗內容,構建更加豐富的彈窗界面。自定義彈窗的界面可以通過裝飾器@CustomDialog定義的組件來實現,然后結合CustomDialogController來控制自定義彈窗的顯示和隱藏。下面我們通過一個興趣愛好的選擇框來介紹自定義彈窗的使用。

點擊放大

從上面的效果圖可以看出,這個選擇框是一個多選的列表彈窗,我們可以使用裝飾器@CustomDialog,結合List組件來完成這個彈窗布局,實現步驟如下:

  1. 初始化彈窗數據。

    先準備好資源文件和數據實體類。其中資源文件stringarray.json創建在resources/base/element目錄下,文件根節點為strarray。

    {"strarray": [{"name": "hobbies_data","value": [{"value": "Soccer"},{"value": "Badminton"},{"value": "Travelling"},... ]}]
    }
    

    實體類HobbyBean用來封裝自定義彈窗中的"興趣愛好"數據。

    export default class HobbyBean {label: string;isChecked: boolean;
    }
    

    然后創建一個ArkTS文件CustomDialogWidget,用來封裝自定義彈窗,使用裝飾器@CustomDialog修飾CustomDialogWidget表示這是一個自定義彈窗。使用資源管理對象manager獲取數據,并將數據封裝到hobbyBeans。

    @CustomDialog
    export default struct CustomDialogWidget {@State hobbyBeans: HobbyBean[] = [];aboutToAppear() {let context: Context = getContext(this);let manager = context.resourceManager;manager.getStringArrayValue($r('app.strarray.hobbies_data'), (error, hobbyResult) => {...hobbyResult.forEach((hobbyItem: string) => {let hobbyBean = new HobbyBean();hobbyBean.label = hobbyItem;hobbyBean.isChecked = false;this.hobbyBeans.push(hobbyBean);});});}build() {...}
    }
    
  2. 創建彈窗組件。

    controller對象用于控制彈窗的控制和隱藏,hobbies表示彈窗選中的數據結果。setHobbiesValue方法用于篩選出被選中的數據,賦值給hobbies。

    @CustomDialog
    export default struct CustomDialogWidget {@State hobbyBeans: HobbyBean[] = [];@Link hobbies: string;private controller: CustomDialogController;aboutToAppear() {...}setHobbiesValue(hobbyBeans: HobbyBean[]) {let hobbiesText: string = '';hobbiesText = hobbyBeans.filter((isCheckItem: HobbyBean) =>isCheckItem?.isChecked).map((checkedItem: HobbyBean) => {return checkedItem.label;}).join(',');this.hobbies = hobbiesText;}build() {Column() {Text($r('app.string.text_title_hobbies'))...List() {ForEach(this.hobbyBeans, (itemHobby: HobbyBean) => {ListItem() {Row() {Text(itemHobby.label)...Toggle({ type: ToggleType.Checkbox, isOn: false })....onChange((isCheck) => {itemHobby.isChecked = isCheck;})}}}, itemHobby => itemHobby.label)}Row() {Button($r("app.string.cancel_button"))....onClick(() => {this.controller.close();})Button($r("app.string.definite_button"))....onClick(() => {this.setHobbiesValue(this.hobbyBeans);this.controller.close();})}}}
    }
    
  3. 使用自定義彈窗。

    在自定義彈窗的使用頁面HomePage中先定義一個變量hobbies,使用裝飾器@State修飾,和自定義彈窗中的@Link 裝飾器修飾的變量進行雙向綁定。然后我們使用alignment和offset設置彈窗的位置在屏幕底部,并且距離底部20vp。最后我們在自定義組件TextCommonWidget(具體實現可以參考《構建多種樣式彈窗》Codelab源碼)的點擊事件中,調用customDialogController的open方法,用于顯示彈窗。

    @Entry
    @Component
    struct HomePage {customDialogController: CustomDialogController = new CustomDialogController({builder: CustomDialogWidget({onConfirm: this.setHobbiesValue.bind(this),}),alignment: DialogAlignment.Bottom,customStyle: true,offset: { dx: 0,dy: -20 }});setHobbiesValue(hobbyArray: HobbyBean[]) {...}build() {...TextCommonWidget({...title: $r("app.string.title_hobbies"),content: $hobby,onItemClick: () => {this.customDialogController.open();}})...}
    }
    

參考

關于更多彈窗,您可以參考:

警告彈窗

列表選擇彈窗

自定義彈窗

日期滑動選擇彈窗

時間滑動選擇彈窗

文本滑動選擇彈窗

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212748.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212748.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI:99-基于深度學習的飛機故障檢測與維修

?? 本文選自專欄:人工智能領域200例教程專欄 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶有在本地跑過的核心代碼,詳細講解供大家學習,希望可以幫到大家。歡迎訂閱支持,正在不斷更新…

【pycharm】Pycharm中進行Git版本控制

本篇文章主要記錄一下自己在pycharm上使用git的操作,一個新項目如何使用git進行版本控制。 文章使用的pycharm版本PyCharm Community Edition 2017.2.4,遠程倉庫為https://gitee.com/ 1.配置Git(File>Settings) 2.去Gitee創建…

記錄一次云原生線上服務數據遷移全過程

文章目錄 背景遷移方案調研遷移過程服務監控腳本定時任務暫停本地副本服務啟動,在線服務下線MySQL 數據遷移Mongo 數據遷移切換新數據庫 ip 本地服務啟動數據庫連接驗證服務打包部署服務重啟前端恢復正常監控腳本定時任務啟動舊服務器器容器關閉 遷移總結 背景 校園…

正確使用React組件緩存

簡介 正常來講的話當我們點擊組件的時候,該組件以及該組件的子組件都會重新渲染,但是如何避免子組件重新渲染呢,我們經常用memo來解決 React.memo配合useCallback緩存組件 父組件沒有傳props const Index ()> {console.log(子組件刷新…

Java14道高頻面試題

面試題 1、JWT ①、JWT(全稱:Json Web Token)是一個開放標準(RFC 7519),它定義了一種緊湊的、自包含的方式,用于作為 JSON 對象在各方之間安全地傳輸信息。 ②、JWT 的原理是,服務器認證以后,生成一個 JSON 對象,發回給用戶 ③、JWT是由頭…

機器學習基本概念介紹 2023

筆記來源于: https://www.youtube.com/watch?vphQK8xZpgoU&t172s https://www.youtube.com/watch?vXLyPFnephpY&t645s Machine/Deep Learning 機器學習概況來說,讓機器具備自動找函式的能力 (Machine Learning 約等于 Looking …

智能優化算法應用:基于飛蛾撲火算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用:基于飛蛾撲火算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用:基于飛蛾撲火算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.飛蛾撲火算法4.實驗參數設定5.算法結果6.…

訂單系統的設計與海量數據處理實戰

概述 訂單系統可以說是整個電商系統中最重要的一個子系統,因此訂單數據可以算作電商企業最重要的數據資產。訂單系統從代碼上來說可分為兩部分:訂單程序和歷史訂單處理程序。數據存儲進行分庫分表。 訂單系統業務分析 對于一個合格的訂單系統&#xf…

如何使用bash寫腳本

本章主要介紹如何使用bash寫腳本。 了解通配符了解變量了解返回值和數值運算數值的對比判斷語句循環語句 grep的用法是“grep 關鍵字 file”,意思是從file中過濾出含有關鍵字的行。 例如,grep root /var/log/messages,意思是從/var/log/me…

基于Html+騰訊云播SDK開發的m3u8播放器

周末業余時間在家無事,學習了一下騰訊的云播放sdk,并制作了一個小demo(m3u8播放器),該在線工具是基于騰訊的云播sdk開發的,云播sdk非常牛,可以支持多種播放格式。 預覽地址 m3u8player.org 源碼…

JVM進程緩存

引言 緩存在日常開發中啟動至關重要的作用,由于是存儲在內存中,數據的讀取速度是非常快的,能大量減少對數據庫的訪問,減少數據庫的壓力。我們把緩存分為兩類: 分布式緩存,例如Redis: 優點&…

Mybatis之簡介、使用操作(安裝、XML、SqlSession、映射的SQL語句、命名空間、作用域和生命周期)

學習的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾。各位小伙伴,如果您: 想系統/深入學習某技術知識點… 一個人摸索學習很難堅持,想組團高效學習… 想寫博客但無從下手,急需…

Java項目-瑞吉外賣Day4

實現文件的上傳下載: 前端代碼: 對文件的操作就是對流的操作。 上傳文件的后端代碼,需要注意MultipartFile的名字必須與前端相對: 為文件存儲位置進行動態設置,配置application.xml 在CommonController中設置屬性讀…

Nodejs后端+express框架

前言 基于vue3Node后臺管理項目,補充nodejs和express相關知識。 文章目錄 一,express 1.官網 Express - 基于 Node.js 平臺的 web 應用開發框架 - Express中文文檔 | Express中文網 2.安裝 npm install express --save 二、MongoDB 特點 非關…

uniapp 藍牙小程序

在 uni-app 中開發藍牙相關的小程序涉及到使用 uni-app 提供的藍牙 API。uni-app 為多端開發提供了統一的 API,這意味著你編寫的代碼可以在不同的平臺上運行,包括微信小程序。 以下是實現藍牙功能的基本步驟和代碼示例: 1. 開啟藍牙適配器 …

java之SpringBoot開發實用篇

MENU SpringBoot開發實用篇KF-1.熱部署KF-1-1.手動啟動熱部署KF-1-2.自動啟動熱部署KF-1-3.參與熱部署監控的文件范圍配置KF-1-4.關閉熱部署 KF-2.配置高級KF-2-1.ConfigurationPropertiesKF-2-2.寬松綁定/松散綁定KF-2-3.常用計量單位綁定KF-2-4.校驗KF-2-5.數據類型轉換 KF-3…

【頭歌系統數據庫實驗】實驗8 SQL的復雜多表查詢-2

目錄 第1關:基于派生表查詢每個隊員解答中超過他平均memory的user_id及題目編號problem_id 第2關:用ANY/ALL實現查詢2019級選手(user_id前4位為2019)滿足比2020級其中一個選手注冊時間早即可的選手 第3關:用聚集查詢…

python zblog API實現類似XMLRPC/發布文章

我發現python對Zblog的XML發布并不友好,雖然也有對應的模塊,但是遠遠沒有XPCRPC更直接方便,但是使用xmlRpc是直接給發布文章帶來了不小的便利,但是對系統也并不友好,但是zblog也開放了Api,但是干部子弟不樂…

UE小:物品拼裝功能

藍圖B1的實現步驟: 獲取玩家控制器和視角:首先獲取玩家控制器,然后使用Deproject Screen to World節點將屏幕上的鼠標位置轉換為世界空間中的一條射線。 射線檢測:使用Line Trace by Channel或Line Trace for Objects節點發射射線…

深度學習測試流程

深度學習模型測試的功能旨在驗證模型在各種情況下的性能和魯棒性。以下是深度學習模型測試的主要功能: 性能評估: 測試模型在任務目標上的整體性能,例如分類準確性、回歸誤差等。評估指標的選擇取決于具體的任務類型。 泛化能力:…