【鴻蒙開發(fā)細枝末節(jié)】自定義彈窗實現(xiàn)

前言

鴻蒙官方的文檔寫得很詳細,也有Demo示例代碼脯厨,但從《構(gòu)建更加豐富的界面》這個章節(jié)起铅祸,大段大段地省略重要內(nèi)容,包括但不限于“在代碼片段里寫一大堆省略號”合武、“只貼代碼片段不說貼在什么位置”临梗、“對另一個先前教學中沒有提到過的內(nèi)容只字不提或一筆帶過”等情況,導致學習時不得不去翻文檔看Demo自己試錯稼跳。而Demo也做得非常復雜盟庞,根本不適合初學者閱讀。
這個《細枝末節(jié)》系列算是作為官方教學的補充汤善,給初學者看的什猖,專門補充官方教學文檔沒說的細節(jié)。

本文是對《構(gòu)建更加豐富的頁面》中《自定義窗口》部分的補充

本文對應的API版本是9
開發(fā)工具版本
DevEco Studio 3.1.1 Release
Build Version: 3.1.0.501, built on June 20, 2023
Build #DS-223.8617.56.36.310501
Runtime version: 17.0.6+10-b829.5 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1024M
Cores: 16
Registry:
external.system.auto.import.disabled=true

Non-Bundled Plugins:
com.intellij.marketplace (223.8617.59)
izhangzhihao.rainbow.brackets (2023.3.7)

實現(xiàn)效果

原文的自定義窗口寫得非常復雜红淡,甚至用到了先前教程未提及的數(shù)據(jù)部分不狮。

本文直接換用一個簡單的例子虹蓄。我們來實現(xiàn)第一部分《管理組件狀態(tài)》那個界面下面的“添加子目標”彈窗煤墙。

效果.PNG

編寫自定義彈窗類

創(chuàng)建一個新文件顺囊,我這里起名叫OkCancelInputDialog

然后聲明如下:

@CustomDialog
export default struct OkCancelInputDialog {
  
  build() {
    
  }
}

@CustomDialog這個注解表示這個控件是對話框
export default如果不寫這個的話箕般,無法被其他文件調(diào)用

接下來我們在build里面寫界面,先分析一下效果圖:
一個輸入框TextInput搁吓,兩個按鈕Button水平排列抹缕,輸入框和按鈕豎直排列安接。
最外層使用Column排列輸入框和按鈕俊嗽,兩個按鈕使用Row包起來橫排雾家,按鈕中間用Blank填充空隙。

補全界面代碼如下:

build() {
  Column() {
    TextInput({ placeholder: '請輸入內(nèi)容' }) //輸入框
      .onChange((str) => {
        //TODO:更新輸入內(nèi)容
      })
      .margin({ left: 16, right: 16 })

    Row() {
      Button("取消", { type: ButtonType.Capsule })
        .onClick(() => {
          //TODO:點擊取消按鈕的事件
        })
        .backgroundColor(Color.White)
        .fontColor(Color.Blue)
        .width("45%")

      Blank()

      Button("確定", { type: ButtonType.Capsule })
        .onClick(() => {
          //TODO:點擊確定按鈕的事件
        })
        .backgroundColor(Color.Blue)
        .fontColor(Color.White)
        .width("45%")
    }
    .width('100%')
    .margin({ top: 16, bottom: 16, left: 32, right: 32 })
  }
  .margin({ left: 16, right: 16 })
  .padding({ top: 24, bottom: 24 })
}

然后再創(chuàng)建一個變量來保存輸入的值绍豁,創(chuàng)建兩個方法對應兩個按鈕的點擊事件芯咧。最終這個類的代碼如下:

@CustomDialog
export default struct OkCancelInputDialog {
  inputValue: string//存放輸入內(nèi)容的變量
  controller: CustomDialogController
  cancel: () => void//取消按鈕對應事件
  confirm: (string) => void//確定按鈕對應事件

  build() {
    Column() {
      TextInput({ placeholder: '請輸入內(nèi)容' }) //輸入框
        .onChange((str) => {
          this.inputValue = str
        })
        .margin({ left: 16, right: 16 })

      Row() {
        Button("取消", { type: ButtonType.Capsule })
          .onClick(() => {
            this.cancel();
          })
          .backgroundColor(Color.White)
          .fontColor(Color.Blue)
          .width("45%")

        Blank()

        Button("確定", { type: ButtonType.Capsule })
          .onClick(() => {
            this.confirm(this.inputValue);
          })
          .backgroundColor(Color.Blue)
          .fontColor(Color.White)
          .width("45%")
      }
      .width('100%')
      .margin({ top: 16, bottom: 16, left: 32, right: 32 })
    }
    .margin({ left: 16, right: 16 })
    .padding({ top: 24, bottom: 24 })
  }
}

調(diào)用彈窗

來到要調(diào)用彈窗的界面,在文件頭import自定義彈窗類竹揍,然后聲明一個CustomDialogController
(這個寫法我是照著Demo抄的敬飒,我目前還不知道Controller到底是什么,只知道這玩意可以操作自定義彈窗對象芬位。猜測是類似于 Android 的 Service 和 Binder 的關系无拗。)

import OkCancelInputDialog from './OkCancelInputDialog';

@Entry
@Component
struct Index {

  dialogController: CustomDialogController = new CustomDialogController({
    builder: OkCancelInputDialog({
      confirm: (str): void => this.onAccept(str),
      cancel: (): void => this.onCancel(),
    })
  });

  build() {
    Column() {
      //點擊顯示彈窗
      Button('點擊添加', { type: ButtonType.Capsule, stateEffect: true })
        .borderRadius(8)
        .backgroundColor("#ff0078d2")
        .onClick(() => {
          if (this.dialogController != undefined) {
            this.dialogController.open()//顯示彈窗
          }
        })
        .fontSize(20)
        .padding({ left: 32, right: 32, top: 16, bottom: 16 })
        .margin({ bottom: 32 })
    }
    .width('100%')
    .height('100%')
    .backgroundColor("#ffe0e0e0")
  }

  onAccept(str) {
    console.log(str); //打印輸入的值
    this.dialogController.close();//關閉彈窗
  }

  onCancel() {
    this.dialogController.close();//關閉彈窗
  }

}

這里的confirmcancel是自定義彈窗類中定義的函數(shù)名,在自定義彈窗類中昧碉,括號里的 string 是參數(shù)的類型英染。此處調(diào)用的地方,括號里的 str 是參數(shù)的名字被饿。有點類似于 Android 的 Listener 的寫法四康。

注意這里不能這樣寫

cancel:this.oncancel//編譯能過,但會報運行時異常狭握。
或者
cancel:this.oncancel()//編譯能過闪金,但會報運行時異常。

也可以不引用一個函數(shù)论颅,而是直接寫函數(shù)體

cancel: (): void => this.dialogController.close()//關閉彈窗
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哎垦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恃疯,更是在濱河造成了極大的恐慌撼泛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澡谭,死亡現(xiàn)場離奇詭異愿题,居然都是意外死亡,警方通過查閱死者的電腦和手機蛙奖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門潘酗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雁仲,你說我怎么就攤上這事仔夺。” “怎么了攒砖?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵缸兔,是天一觀的道長日裙。 經(jīng)常有香客問我,道長惰蜜,這世上最難降的妖魔是什么昂拂? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮抛猖,結(jié)果婚禮上格侯,老公的妹妹穿的比我還像新娘。我一直安慰自己财著,他們只是感情好联四,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撑教,像睡著了一般朝墩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伟姐,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天收苏,我揣著相機與錄音,去河邊找鬼玫镐。 笑死倒戏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的恐似。 我是一名探鬼主播杜跷,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼矫夷!你這毒婦竟也來了葛闷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤双藕,失蹤者是張志新(化名)和其女友劉穎淑趾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忧陪,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡扣泊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘶摊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片延蟹。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叶堆,靈堂內(nèi)的尸體忽然破棺而出阱飘,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布沥匈,位于F島的核電站蔗喂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏高帖。R本人自食惡果不足惜缰儿,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棋恼。 院中可真熱鬧返弹,春花似錦锈玉、人聲如沸爪飘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽师崎。三九已至,卻和暖如春椅棺,著一層夾襖步出監(jiān)牢的瞬間犁罩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工两疚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留床估,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓诱渤,卻偏偏與公主長得像丐巫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勺美,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容