鴻蒙地址選擇庫(ArkTs UI)

功能點:支持三級聯動、點擊確認返回省市區code及name(安心)、布局可以高度自定義

實現:TextPicker+讀取本地json(也可用第三方的json 不過需要自行調整了)
先上圖吧、廢話下面再說:

湊和看吧、(可能是虛擬機卡、或者動畫原因、聯動會慢一些)

調用:
?

  方式一 1、//注意調用處是在ets @Component 組件中let areaData = await AreaDataUtil.loadJsonFile(getContext())GlobalAreaPicker.show(this.getUIContext(),{areaData: areaData,onConfirm: (province, city, county,addr) => {//或者直接用addrconsole.log(`選中:${province.name} ${city.name} ${county.name}`);},onCancel: () => {console.log('取消選擇');}})方式二 2、//調用注意調用處是在ets @Component 組件中showAreaPicker(this.getUIContext(), (province, city, county,addr) => {// this.companyAddress = `${province.name} ${city.name} ${county.name}`;})

1、主要類說明看截圖

補充代碼截圖

2、上代碼 :
2.1 GlobalAreaPicker.ets(核心實現類)

// GlobalAreaPicker.ets
import { JsonAddr } from '../utils/AreaDataUtil';
import { ComponentContent } from '@kit.ArkUI';
import { FontDiy, TextStyleModifier } from './style/TextStyles';
import { IS_PREVIEW } from 'models';
import { DIVIDER_COLOR } from '../constant/ColorConstant';//地址選擇器參數傳遞
export interface AreaSelectOption {areaData: JsonAddr[],onConfirm?: (province: JsonAddr, city: JsonAddr, county: JsonAddr,addressInfo:string) => void,//addressInfo 拼接好的地址 默認空格隔開onCancel?: () => void// 反正我沒用著、留著唄
}//全局彈窗封裝、不依賴沙雕Pager
export class GlobalAreaPicker {static contentNode?: ComponentContent<Object>static show(uiContext: UIContext, options: AreaSelectOption) {GlobalAreaPicker.contentNode = new ComponentContent(uiContext,wrapBuilder(buildAreaPicker),options);uiContext.getPromptAction().openCustomDialog(GlobalAreaPicker.contentNode, {alignment: DialogAlignment.Bottom,autoCancel: true,});}static close(uiContext: UIContext) {if (GlobalAreaPicker.contentNode !== null) {uiContext.getPromptAction().closeCustomDialog(GlobalAreaPicker.contentNode)}}
}//全局彈窗需要、甲魚的屁股-》規定
@Builder
function buildAreaPicker(params: AreaSelectOption) {AreaPickerContent({areaData: params.areaData,onConfirm: params.onConfirm,onCancel: params.onCancel})
}// 彈窗內容組件(開業)
// @Preview 需要虛擬機運行才行、
@Component
struct AreaPickerContent {@Prop areaData: JsonAddr[] = [];@State selectedProvince: JsonAddr | null = null;@State selectedCity: JsonAddr | null = null;@State selectedCounty: JsonAddr | null = null;@State provinceIndex: number = 0;@State cityIndex: number = 0;@State countyIndex: number = 0;// TextPicker 數據@State provinceNames: string[] = [];@State cityNames: string[] = [];@State countyNames: string[] = [];onConfirm?: (province: JsonAddr, city: JsonAddr, county: JsonAddr,addressInfo:string) => void;onCancel?: () => void;aboutToAppear() {this.provinceNames = this.areaData.map(p => p.name);this.initDefaultSelection();}initDefaultSelection() {if (this.areaData.length > 0) {this.selectedProvince = this.areaData[0];this.provinceIndex = 0;this.updateCities();}}updateCities() {if (this.selectedProvince?.children && this.selectedProvince.children.length > 0) {this.cityNames = this.selectedProvince.children.map(c => c.name);this.selectedCity = this.selectedProvince.children[0];this.cityIndex = 0;this.updateCounties();}}updateCounties() {if (this.selectedCity?.children && this.selectedCity.children.length > 0) {this.countyNames = this.selectedCity.children.map(c => c.name);this.selectedCounty = this.selectedCity.children[0];this.countyIndex = 0;}}build() {Column() {// 頂部操作欄Row() {Text('取消').attributeModifier(new TextStyleModifier(16, '#999999', FontDiy.MEDIUM, IS_PREVIEW)).onClick(() => {GlobalAreaPicker.close(this.getUIContext());this.onCancel?.();})Blank()Text('確認').attributeModifier(new TextStyleModifier(16, '#1778FF', FontDiy.MEDIUM, IS_PREVIEW)).onClick(() => {if (this.selectedProvince && this.selectedCity && this.selectedCounty) {this.onConfirm?.(this.selectedProvince,this.selectedCity,this.selectedCounty,`${this.selectedProvince.name}${this.selectedCity.name.includes('市轄區')?' ':` ${this.selectedCity.name} `}${this.selectedCounty.name}`//拼接字符串地址(過濾掉市轄區));}GlobalAreaPicker.close(this.getUIContext());})}.width('100%').height(44).padding({ left: 16, right: 16 })Divider().color('#f0f0f0')Row() {// 省份TextPicker({ range: this.provinceNames, selected: this.provinceIndex }).width('33.33%').height(250).canLoop(false).selectTextStyle()//往下扒拉扒拉 能找到.onChange((value: string | string[], index: number | number[]) => {if (typeof index === 'number') {this.provinceIndex = index;this.selectedProvince = this.areaData[index];this.updateCities();}})// 城市TextPicker({ range: this.cityNames, selected: this.cityIndex }).width('33.33%').height(250).canLoop(false).selectTextStyle().onChange((value: string | string[], index: number | number[]) => {if (typeof index === 'number' && this.selectedProvince?.children) {this.cityIndex = index;this.selectedCity = this.selectedProvince.children[index];this.updateCounties();}})// 區縣TextPicker({ range: this.countyNames, selected: this.countyIndex }).width('33.33%').height(250).canLoop(false).selectTextStyle().onChange((value: string | string[], index: number | number[]) => {if (typeof index === 'number' && this.selectedCity?.children) {this.countyIndex = index;this.selectedCounty = this.selectedCity.children[index];}})}}.backgroundColor(Color.White).borderRadius({ topLeft: 12, topRight: 12 })}
}
//擴展屬性
@Extend(TextPicker)
function selectTextStyle() {.selectedTextStyle({color: '#333333', font: {size: 18, family:$r('[base].media.pf_medium')}})//報錯 刪了family就行、自定義字體.textStyle({color: '#999999', font: {size: 16, family:$r('[base].media.pf_regular')}}).disappearTextStyle({color: '#999999', font: {size: 14, family:$r('[base].media.pf_regular')}}).divider({color: DIVIDER_COLOR,//#d5d5d5} as DividerOptions)
}/*
// 使用方式
GlobalAreaPicker.show({areaData: yourAreaData,onConfirm: (province, city, county) => {console.log(`選中:${province.name} ${city.name} ${county.name}`);},onCancel: () => {console.log('取消選擇');}
});*/

2.2 AreaDataUtil.ts(讀取地址json)

import { logger } from "../../../mock/baseMock";
import { Context } from "@kit.AbilityKit";
import { util } from "@kit.ArkTS";// utils/AreaDataUtil.ets
export class AreaDataUtil {private static JsonAddr: JsonAddr[] = []//讀取本地json文件static async loadJsonFile(context: Context): Promise<JsonAddr[]> {if (this.JsonAddr.length > 0) {logger.info('loadJsonFile stop read reason: has address '+AreaDataUtil.JsonAddr.length)return AreaDataUtil.JsonAddr}try {logger.info('開始讀取地址 ')const mgr = context.resourceManager;const value = await mgr.getRawFileContent('newprovince.json');const textDecoder = util.TextDecoder.create('utf-8');const jsonStr = textDecoder.decodeWithStream(value);logger.info('地址讀取完成 ')let ja = JSON.parse(jsonStr) as JsonAddr[]AreaDataUtil.JsonAddr = jareturn ja;} catch (error) {console.error('讀取JSON失敗', error);return null;}}
}//地址選擇
/*export interface AreaList {province_list: Record<string, string>city_list: Record<string, string>county_list: Record<string, string>test: CascaderOption[]
}*///映射第三庫的地址
export interface CascaderOption {text: stringvalue: stringchildren?: CascaderOption[]
}//本地地址json newprovince.json
export interface JsonAddr {name: stringcode: stringchildren?: JsonAddr[]
}

2.3 TextStyleModifier.ets 自定義字體 (不重要、可以不用加、只需要刪除text中的.attributeModifier(xxxxx)屬性即可)

export class TextStyleModifier implements AttributeModifier<TextAttribute> {fontSize?: number | string | ResourcefontColor?: ResourceColorfontFamily?: string | Resource | FontDiy = FontDiy.UNSETisPreview :boolean = falseconstructor(fontSize: number | string | Resource,fontColor?: ResourceColor,fontFamily?: string | Resource| FontDiy,isPreview:boolean = false) {this.fontSize = fontSizethis.fontColor = fontColorthis.fontFamily = fontFamilythis.isPreview = isPreview}applyNormalAttribute(instance: TextAttribute): void {if (this.fontSize !== undefined) {instance.fontSize(this.fontSize)}if (this.fontColor !== undefined) {instance.fontColor(this.fontColor)}if (this.fontFamily !== undefined) {//枚舉類型if (this.isFontDiy(this.fontFamily)) {if(this.isPreview) {return}switch (this.fontFamily) {case FontDiy.REGULAR:// 處理 REGULARinstance.fontFamily($r('[base].media.pf_regular'))breakcase FontDiy.MEDIUM:instance.fontFamily($r('[base].media.pf_medium'))// 處理 MEDIUMbreakcase FontDiy.SEMI_BOLD:instance.fontFamily($r('[base].media.pf_semibold'))// ...breakdefault:// 默認處理instance.fontFamily($r('[base].media.youshebiaotihei'))break}} else {//不確定是否有問題instance.fontFamily(`${this.fontFamily}`)}}}// 類型守衛函數isFontDiy(value: string | Resource | FontDiy): boolean {return Object.values(FontDiy).includes(value as FontDiy);}
}export enum FontDiy {UNSET,REGULAR,MEDIUM,SEMI_BOLD,YOU_SHE_BIAO_TIHEI
}

2.4?PickerGlobalFun.ets

//地址選擇器
export async function showAreaPicker(uiContext: UIContext, call?: (province: JsonAddr, city: JsonAddr,county: JsonAddr,addressInfo:string) => void) {//去讀本地數據數據let areaData = await AreaDataUtil.loadJsonFile(getContext())GlobalAreaPicker.show(uiContext, {areaData: areaData,onConfirm:call,})
}

相關代碼基本就這么多、加到自己工程里、需要自己稍微調整下 部分變量如IS_PREVIEW找不到可以使用false代替

別大意=》(注意文件類型、注意文件類型、注意文件類型 如ets/ts

3、json地址文件

文件地址:https://download.csdn.net/download/BirdEatBug/91801354

至此基本over

擴展:

1、環境

硬件環境:DevEco Studio 5.0.0

鴻蒙sdk版本(Compatible Sdk):12?

2、json數據源是否可以自定義?

可以
放心目前用的也就是最近兩三年的地址json、當然有的需求不一樣需要用自己的服務器的地址json

只需要調整JsonAddr 就行了(同時修改AreaPickerContent 所涉及的JsonAddr 字段即可)

修改JsonAddr參考AreaDataUtils 中

let ja = JSON.parse(jsonStr) as JsonAddr[]//改成自己定義的接口就行。
//原來數據源定義如下、可按照需求調整
export interface JsonAddr {name: string// 省市區 名稱code: string//對應如上的地址編碼children?: JsonAddr[]//市區/市縣
}

3、是否有推薦的第三方地址json庫

這個:OpenHarmony三方庫中心倉?

github:https://github.com/ibestservices/area-data?這兩個是同一個庫、地址維護比較新? ? ? ??
?

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

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

相關文章

YOLO 目標檢測:數據集構建(LabelImg 實操)、評估指標(mAP/IOU)、 NMS 后處理

文章目錄基本知識介紹1.視覺處理三大任務2.訓練、驗證、測試、推理3.數據集3.1 數據集格式3.2 數據集標注4.上游任務和下游任務YOLO指標1.真實框&#xff08;Ground Truth Box&#xff09;與邊界框&#xff08;Bounding Box&#xff09;2.交并比&#xff08;IOU&#xff09;3.置…

進程狀態 —— Linux內核(Kernel)

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄進…

計算機視覺與深度學習 | 低照度圖像處理算法綜述:發展、技術與趨勢

文章目錄 一、發展歷程:從傳統模型到智能融合 (一)傳統模型構建階段(1970s-2016) (二)深度學習應用階段(2017-2020) (三)硬件-算法協同階段(2021至今) 二、技術分類與性能對比 (一)傳統方法體系 (二)深度學習方法 1. 監督學習模型 2. 無監督/自監督方法 3. 混…

責任鏈模式實踐-開放銀行數據保護及合規

責任鏈模式介紹什么是責任鏈模責任鏈模式是一種行為設計模式&#xff0c; 允許你將請求沿著處理者鏈進行發送。 收到請求后&#xff0c; 每個處理者均可對請求進行處理&#xff0c; 或將其傳遞給鏈上的下個處理者。責任鏈模式結構偽代碼基于責任鏈的開放銀行數據保護及合規實踐…

npm install --global @dcloudio/uni-cli 時安裝失敗

這個日志顯示在執行 npm install --global dcloudio/uni-cli 時安裝失敗&#xff0c;核心錯誤是 UNABLE_TO_GET_GET_ISSUER_CERT_LOCALLY&#xff08;無法獲取本地頒發者證書&#xff09;&#xff0c;屬于 HTTPS 證書驗證失敗 問題。錯誤原因npm 訪問官方 registry&#xff08;…

吱吱企業通訊軟件可私有化部署,構建安全可控的通訊辦公平臺

在當今激烈的市場競爭環境中&#xff0c;企業通訊已成為制勝的關鍵因素。吱吱作為一款專為企業管理設計的IM即時辦公通訊軟件&#xff0c;提供了高度安全的通訊辦公環境&#xff0c;確保信息在內部流通的安全性與高效性&#xff0c;為企業數字化轉型奠定了堅實的基礎。 一、私有…

暄桐:唯有認真思考過死亡,才足以應對日常

暄桐是一間傳統美學教育教室&#xff0c;創辦于2011年&#xff0c;林曦是創辦人和授課老師&#xff0c;教授以書法為主的傳統文化和技藝&#xff0c;皆在以書法為起點&#xff0c;親近中國傳統之美&#xff0c;以實踐和所得&#xff0c;滋養當下生活。初聽莊子在妻子離世后“鼓…

目標檢測領域基本概念

基于提議的方法&#xff0c;也常被稱為兩階段 (Two-stage) 方法&#xff0c;是目標檢測領域的經典范式。它們將目標檢測任務分解為兩個主要步驟&#xff1a;階段一&#xff1a;區域提議 (Region Proposal Generation) 目標&#xff1a; 在圖像中生成一系列可能包含物體的候選區…

【開題答辯全過程】以 基于SpringBoot的流浪貓狗領養系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

扣子(coze)實踐指南進階篇——創建工作流,并將工作流接入智能體

大家好&#xff0c;歡迎閱讀這份《智能體&#xff08;AIAgent&#xff09;開發指南》&#xff01; 在大模型和智能體快速發展的今天&#xff0c;很多朋友希望學習如何從零開始搭建一個屬于自己的智能體。本教程的特點是 完全基于國產大模型與火山推理引擎實現&#xff0c;不用翻…

【STM32】外部中斷(上)

【STM32】外部中斷前言一、中斷系統1.1 什么是中斷1.2 中斷優先級1.3 中斷嵌套1.4 中斷執行流程二、NVIC2.1NVIC基本結構2.2 NVIC優先級分組三、EXTI3.1 EXTI 外部中斷&#xff08;Extern Interrupt&#xff09;3.2 EXTI基本結構3.3 AFIO復用IO口3.4 EXTI內部框圖前言 【STM32…

TimeDP Learning to Generate Multi-Domain Time Series with Domain Prompts論文閱讀筆記

TimeDP Learning to Generate Multi-Domain Time Series with Domain Prompts 摘要 在跨域時序數據生成任務中&#xff0c;提出使用”時間序列語義原型“模塊定義時間序列原型來表示時間序列基&#xff0c;每個原型向量作為“詞”表示一些基本的時間序列特征。應用原型分配模塊…

Ubuntu安裝NVIDIA顯卡驅動

清理舊驅動 sudo apt purge nvidia* libnvidia* sudo apt autoremovesudo find /etc -name *nvidia* -exec sudo rm -rf {} sudo rm -rf /usr/local/cuda*禁用 nouveau echo blacklist nouveau options nouveau modeset0 | sudo tee /etc/modprobe.d/blacklist-nouveau.conf…

硬件工程師成長之路:從入門到精通的技術旅程

文章目錄前言第一階段&#xff1a;基礎知識的積累理論知識儲備動手實踐第二階段&#xff1a;專業技能的提升PCB設計嵌入式系統開發第三階段&#xff1a;專業方向的選擇射頻&#xff08;RF&#xff09;工程電源設計高速數字電路FPGA/ASIC設計第四階段&#xff1a;工程管理與視野…

PyTorch 張量(Tensor)詳解:從基礎到實戰

1. 引言在深度學習和科學計算領域&#xff0c;張量&#xff08;Tensor&#xff09; 是最基礎的數據結構。PyTorch 作為當前最流行的深度學習框架之一&#xff0c;其核心計算單元就是張量。與 NumPy 的 ndarray 類似&#xff0c;PyTorch 張量支持高效的數值計算&#xff0c;但額…

CPTS---Hospital

端口掃描 nmap -A -p- -n -Pn -T4 10.10.11.241 22/tcp open ssh OpenSSH 9.0p1 Ubuntu 1ubuntu8.5 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 256 e1:4b:4b:3a:6d:18:66:69:39:f7:aa:74:b3:16:0a:aa (ECDSA) |_ 256 96:c1:dc:d8:97:20:95:e7:01:5…

【貪心算法】day5

&#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的貪心算法學習以及LeetCode刷題記錄&#xff0c;按專題劃分每題主要記錄&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代碼&#xff1b;&#xff08;2&#xff09;優質解法 優質代碼&#xff1b;&#xff…

軟考中級【網絡工程師】第6版教材 第4章 無線通信網 (上)

考點分析: 重要程度:??? 選擇題考查1 ~ 3分,案例分析可能考查填空和簡答 高頻考點:802.11信道與頻段、CSMA/CA、無線網絡優化、無線認證、無線配置步驟 新教材變化:新增4G/5G、刪除無線城域網 本章將詳述蜂窩移動通信系統、無線局域網以及無線個人網的體系結構和實用技…

vscode+EIDE+Clangd環境導入keil C51以及MDK工程

我最近一直在使用vscodeclangd的編譯環境替代了vscode自帶的c/c插件。感覺clangd的環境更加優秀&#xff0c;能夠更好找到函數、全局變量等定義調用等。如果使用keil C51以及MDK環境開發51單片機或者STM32單片機就需要使用到了EIDE這個插件這個插件現在能夠自動生成compile_com…

FTP - 學習/實踐

1.應用場景 主要用于學習和使用FTP服務&#xff0c;同時研究其架構實現, 以及日常開發中的使用。 FTP&#xff08;文件傳輸協議&#xff09;是一種用于網絡文件傳輸的標準協議&#xff0c;基于客戶端-服務器模型運行&#xff0c;通過控制通道&#xff08;端口21&#xff09;和…