0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony開(kāi)發(fā)實(shí)例:【新聞客戶(hù)端】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-16 16:09 ? 次閱讀

介紹

本篇Codelab我們將教會(huì)大家如何構(gòu)建一個(gè)簡(jiǎn)易的OpenHarmony新聞客戶(hù)端(JS版本)。應(yīng)用包含兩級(jí)頁(yè)面,分別是主頁(yè)面和詳情頁(yè)面,兩個(gè)頁(yè)面都展示了豐富的UI組件,其中詳情頁(yè)的實(shí)現(xiàn)邏輯中還展示了如何通過(guò)調(diào)用相應(yīng)接口,實(shí)現(xiàn)跨設(shè)備拉起FA。本教程將結(jié)合以下內(nèi)容進(jìn)行講解:

1.頂部tabs以及新聞列表list的使用

2.每條新聞的文本框以及圖像

3.布局及頁(yè)面跳轉(zhuǎn)

4.設(shè)備發(fā)現(xiàn)以及跨設(shè)備拉起FA

最終效果預(yù)覽如下圖所示:

搭建OpenHarmony環(huán)境

完成本篇Codelab我們首先要完成開(kāi)發(fā)環(huán)境的搭建,本示例以Hi3516DV300開(kāi)發(fā)板為例,參照以下步驟進(jìn)行:

  1. [獲取OpenHarmony系統(tǒng)版本]:標(biāo)準(zhǔn)系統(tǒng)解決方案(二進(jìn)制)。
  2. 搭建燒錄環(huán)境:
    1. [完成DevEco Device Tool的安裝]
    2. [完成Hi3516開(kāi)發(fā)板的燒錄](méi)
    3. 鴻蒙開(kāi)發(fā)指導(dǎo)文檔:[qr23.cn/AKFP8k]
  3. 搭建開(kāi)發(fā)環(huán)境:
    1. 開(kāi)始前請(qǐng)參考[工具準(zhǔn)備] ,完成DevEco Studio的安裝和開(kāi)發(fā)環(huán)境配置。
    2. 開(kāi)發(fā)環(huán)境配置完成后,請(qǐng)參考[使用工程向?qū) 創(chuàng)建工程(模板選擇“Empty Ability”),選擇JS或者eTS語(yǔ)言開(kāi)發(fā)。
    3. 工程創(chuàng)建完成后,選擇使用[真機(jī)進(jìn)行調(diào)測(cè)] 。

搜狗高速瀏覽器截圖20240326151344.png

分布式組網(wǎng)

完成本篇Codelab我們還需要完成開(kāi)發(fā)板的分布式組網(wǎng),本示例以Hi3516DV300開(kāi)發(fā)板為例,參照以下步驟進(jìn)行:

  1. 硬件準(zhǔn)備:準(zhǔn)備兩臺(tái)燒錄相同的版本系統(tǒng)的Hi3516DV300開(kāi)發(fā)板A、B。

  2. 兩個(gè)開(kāi)發(fā)板A、B配置在同一個(gè)WiFi網(wǎng)絡(luò)之下。
    打開(kāi)設(shè)置-->WLAN-->點(diǎn)擊右側(cè)WiFi開(kāi)關(guān)-->點(diǎn)擊目標(biāo)WiFi并輸入密碼。

  3. 將設(shè)備A、B設(shè)置為互相信任的設(shè)備。

    • 找到系統(tǒng)應(yīng)用“音樂(lè)”。

    • 設(shè)備A打開(kāi)音樂(lè),點(diǎn)擊左下角帶箭頭的流轉(zhuǎn)按鈕,彈出列表框,在列表中會(huì)展示遠(yuǎn)端設(shè)備的id。
    • 選擇遠(yuǎn)端設(shè)備B的id,另一臺(tái)開(kāi)發(fā)板(設(shè)備B)會(huì)彈出驗(yàn)證的選項(xiàng)框。
    • 設(shè)備B點(diǎn)擊允許,設(shè)備B將會(huì)彈出隨機(jī)PIN碼,將設(shè)備B的PIN碼輸入到設(shè)備A的PIN碼填入框中。

    配網(wǎng)完畢。

代碼結(jié)構(gòu)解讀

本篇Codelab只對(duì)核心代碼進(jìn)行講解,對(duì)于完整代碼,我們會(huì)在最后的參考中提供下載方式,接下來(lái)我們會(huì)用一小節(jié)來(lái)講解整個(gè)工程的代碼結(jié)構(gòu):

  • images:存放工程使用到的圖片資源。
  • index:構(gòu)成新聞列表頁(yè)面,包括index.hml布局文件、index.css樣式文件、index.js邏輯處理文件。
  • detail:構(gòu)成新聞詳情頁(yè)面,包括detail.hml布局文件、detail.css樣式文件、detail.js邏輯處理文件。
  • config.json:配置文件。

添加主頁(yè)新聞?lì)愋?/h1>

首先為我們的應(yīng)用添加頂部新聞?lì)愋?,用于切換不同類(lèi)別的新聞。這里會(huì)使用到tabs、tab-bar控件,同時(shí)使用for循環(huán)對(duì)新聞的title進(jìn)行遍歷,新聞的標(biāo)題有All、Health、Finance、Technology、Sport、Internet、Game七大類(lèi)。圖片示例和代碼如下:

< div class="container" >
    < tabs index="0" vertical="false" onchange="changeNewsType" >
        < tab-bar class="tab-bar" mode="scrollable" >
            < text class="tab-text" for="{{ title in titleList }}" >{{ title.name }} < /text >
        < /tab-bar >
    < /tabs >
< /div >

添加主頁(yè)頂部新聞?lì)愋?/h1>
  1. 我們需要實(shí)現(xiàn)一個(gè)新聞item的布局,其樣式包含左邊的新聞標(biāo)題、右邊的新聞圖片以及下方的新聞分割線,圖片示例和代碼如下:
    < div style="flex-direction : column" >
        < div style="flex-direction : row" >
              < text class="text" >
                  {{ news.title }}
              < /text >
              < image class="image" src="{{ news.imgUrl }}" >
                  < /image >
              < /div >
         < div style="height : 2px; width : 100%; background-color : #97d2d4d4;" >
         < /div >
     < /div >
    
  2. 我們需要實(shí)現(xiàn)一個(gè)新聞列表,也就是將上方的新聞item進(jìn)行一個(gè)循環(huán)的展示,這需要用到list、list-item的相關(guān)知識(shí)點(diǎn)。我們需要將newsList新聞列表數(shù)據(jù)進(jìn)行循環(huán),所以新聞item的布局外層需要嵌套一個(gè)list和list-item,圖片示例和代碼如下:
    < list class="list" >
        < list-item for="{{ news in newsList }}" onclick="itemClick(news)" >
               // 新聞item的布局代碼填充到這里         
        < /list-item >
    < /list >
    
  3. 我們需要實(shí)現(xiàn)新聞?lì)愋偷那袚Q,每一條新聞都會(huì)有一個(gè)新聞?lì)愋?,?dāng)選擇All的時(shí)候默認(rèn)展示所有類(lèi)型的新聞,當(dāng)選擇具體的新聞?lì)愋蜁r(shí),如選擇Health,則需要篩選出屬于Health類(lèi)型的新聞進(jìn)行展示。添加一個(gè)自定義函數(shù)changeNewsType,代碼如下所示:
    // 選擇新聞?lì)愋?/span>
    changeNewsType: function (e) {
      const type = titles[e.index].name;
      this.newsList = [];
      if (type === 'All') {
        // 展示全部新聞
        this.newsList = newsData;
      } else {
        // 分類(lèi)展示新聞
        const newsArray = [];
        for (var news of newsData) {
           if (news.type === type) {
              newsArray.push(news);
          }
        }
        this.newsList = newsArray;
      }
    }
    

詳情頁(yè)頁(yè)面布局

詳情頁(yè)面包含新聞標(biāo)題、閱讀量和喜好數(shù)、新聞圖片、新聞文字以及下方的狀態(tài)欄。狀態(tài)欄包括1個(gè)可輸入文本框和4個(gè)功能按鍵,圖片示例和代碼如下:

< div class="container" >
    < text class="text-title" >{{ title }}< /text >
    < text class="text-reads" >reads: {{ reads }}   likes: {{ likes }}< /text >
    < image class="image" src="{{ imgUrl }}" >< /image >
    < text class="text-content" >
        {{ content }}
    < /text >
    < !-- 詳情頁(yè)底部-- >
    < div class="bottom" >
        < textarea class="textarea" placeholder="Enter a comment." >< /textarea >
        < image class="image-bottom" src="/common/images/icon_message.png" >< /image >
        < image class="image-bottom" src="/common/images/icon_star.png" >< /image >
        < image class="image-bottom" src="/common/images/icon_good.png" >< /image >
        < image class="image-bottom" src="/common/images/icon_share.png" onclick="toShare" >< /image >
    < /div >
< /div >

需要注意的是detail.hml只是展示了頁(yè)面的布局結(jié)構(gòu),其具體的布局樣式需要參考detail.css文件。

跳轉(zhuǎn)詳情頁(yè)

完成新聞列表頁(yè)面和詳情頁(yè)的布局后,需要實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的功能。新聞列表頁(yè)面中綁定一個(gè)list-item的點(diǎn)擊事件itemClick,其中傳入的參數(shù)是news(新聞的詳細(xì)數(shù)據(jù))。

< list-item for="{{ news in newsList }}" onclick="itemClick(news)" >

在JS中頁(yè)面跳轉(zhuǎn)需要在JS文件的頭部引入如下一行代碼:

import router from '@system.router';

實(shí)現(xiàn)list-item的點(diǎn)擊事件itemClick,其代碼如下所示:

itemClick(news) {
  // 跳轉(zhuǎn)到詳情頁(yè)面
  router.push({
    uri: 'pages/detail/detail',
    params: {
      'title': news.title,
      'type': news.type,
      'imgUrl': news.imgUrl,
      'reads': news.reads,
      'likes': news.likes,
      'content': news.content
    }
  });
}

設(shè)備發(fā)現(xiàn)

首先給分享按鈕添加一個(gè)分享事件toShare,代碼如下所示:

< image class="image-bottom" src="/common/images/icon_share.png" onclick="toShare" >< /image >

然后調(diào)用getTrustedDeviceListSync(),獲取所有可信設(shè)備的列表,代碼如下所示:

import deviceManager from '@ohos.distributedHardware.deviceManager';

toShare() {
    // 創(chuàng)建設(shè)備管理實(shí)例
    deviceManager.createDeviceManager('com.huawei.codelab', (err, data) = > {
      if (err) {
        return;
      }
      this.deviceMag = data;
      // 獲取所有可信設(shè)備的列表
      this.deviceList = this.deviceMag.getTrustedDeviceListSync();
    });
    // 循環(huán)遍歷設(shè)備列表,獲取設(shè)備名稱(chēng)和設(shè)備Id
    for (let i = 0; i < this.deviceList.length; i++) {
      this.deviceList[i] = {
        deviceName: this.deviceList[i].deviceName,
        deviceId: this.deviceList[i].deviceId,
        checked: false
      };
    }
    this.$element('showDialog').show();
  }

最后自定義dialog彈窗顯示所有可信設(shè)備,代碼如下所示:

< dialog id="showDialog" class="select-device-dialog" >
    < div class="select-device-wrapper" >
        < text class="select-device-title" >選擇設(shè)備< /text >
        < list class="select-device-list" >
            < list-item class="select-device-item" for="{{ deviceList }}" id="list" >
                < text class="select-device-item-left" >{{ $item.deviceName }}
                < /text >
                < input class="select-device-item-right" type="checkbox" name="Device" value="{{$idx}}"
                       @change="selectDevice({{$idx}})" checked="{{$item.checked}}" >
                < /input >
            < /list-item >
        < /list >
        < div class="choose-ok-or-not" >
            < text class="select-device-btn" @click="chooseCancel" >取消< /text >
            < text class="select-device-btn" @click="chooseComform" >確定< /text >
         < /div >
    < /div >
< /dialog >

最終實(shí)現(xiàn)的效果如下所示:

說(shuō)明: 本工程項(xiàng)目包含getTrustedDeviceListSync()獲取所有可信設(shè)備的列表方法,請(qǐng)選擇API 7或以上版本。

分布式拉起

彈出設(shè)備列表后,選擇設(shè)備并點(diǎn)擊“確定”按鈕,將會(huì)分布式拉起另外一臺(tái)設(shè)備,其具體實(shí)現(xiàn)代碼如下所示:

chooseComform() {
    this.$element('showDialog').close();
    for (let i = 0; i < this.deviceList.length; i++) {
      // 判斷設(shè)備是否被選中
      if (this.deviceList[i].checked) {
      const params = {
        url: 'pages/detail/detail',
        title: this.title,
        type: this.type,
        imgUrl: this.imgUrl,
        reads: this.reads,
        likes: this.likes,
        content: this.content,
      };

      const wantValue = {
        bundleName: 'com.huawei.newsdemooh',
        abilityName: 'com.huawei.newsdemooh.MainAbility',
        deviceId: this.deviceList[i].deviceId,
        parameters: params
      };

      featureAbility.startAbility({
        want: wantValue
      }).then((data) = > {
        console.info('featureAbility.startAbility finished, ' + JSON.stringify(data));
      });
      console.info('featureAbility.startAbility want=' + JSON.stringify(wantValue));
      console.info('featureAbility.startAbility end');
      }
    }
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2352

    瀏覽量

    42863
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1975

    瀏覽量

    30213
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3722

    瀏覽量

    16323
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS開(kāi)發(fā)實(shí)例:【分布式新聞客戶(hù)端

    基于柵格布局、設(shè)備管理和多端協(xié)同,實(shí)現(xiàn)一次開(kāi)發(fā),多端部署的分布式新聞客戶(hù)端頁(yè)面。
    的頭像 發(fā)表于 04-17 15:57 ?877次閱讀
    HarmonyOS<b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>實(shí)例</b>:【分布式新聞<b class='flag-5'>客戶(hù)端</b>】

    如何使用Socket實(shí)現(xiàn)UDP客戶(hù)端?

    本教程介紹了如何利用socket 編程來(lái)實(shí)現(xiàn)一個(gè) UDP 客戶(hù)端,與服務(wù)器進(jìn)行通信。與開(kāi)發(fā) TCP 客戶(hù)端一樣,我們先將 socket 編程的流程列出來(lái),然后給出具體的實(shí)例。
    發(fā)表于 03-30 07:39

    基于Socket開(kāi)發(fā)TCP傳輸客戶(hù)端

    1 程序界面設(shè)計(jì) TCP客戶(hù)端在上位機(jī)開(kāi)發(fā)中應(yīng)用很廣,大多數(shù)情況下,上位機(jī)軟件都是作為一個(gè)TCP客戶(hù)端來(lái)與PLC或其他服務(wù)器進(jìn)行通信的。TCP客戶(hù)端的主要功能就是連接服務(wù)器、發(fā)送數(shù)據(jù)、
    發(fā)表于 07-02 06:33

    監(jiān)控系統(tǒng)客戶(hù)端及服務(wù)設(shè)計(jì)

    項(xiàng)目開(kāi)發(fā)報(bào)告1 項(xiàng)目簡(jiǎn)介1.1 概述1.2 開(kāi)發(fā)環(huán)境1.3 其他支持1.4 應(yīng)用界面1.4.1 服務(wù)器1.4.2 客戶(hù)端1.5 程序使用2 項(xiàng)目開(kāi)
    發(fā)表于 12-21 07:02

    用Delphi開(kāi)發(fā)OPC客戶(hù)端工具的方法研究

    本文通過(guò)介紹OPC 技術(shù)的工作原理,結(jié)合OPC 客戶(hù)端的工作機(jī)制,給出OPC 客戶(hù)端開(kāi)發(fā)方法及在的Delphi 的具體實(shí)現(xiàn),提出了OPC 客戶(hù)端開(kāi)
    發(fā)表于 06-15 10:37 ?35次下載

    基于USB的加密視頻客戶(hù)端的設(shè)計(jì)與實(shí)現(xiàn)

    針對(duì)USB無(wú)線視頻實(shí)時(shí)接收裝置的開(kāi)發(fā),論文介紹了在Windows視頻客戶(hù)端通過(guò)USB數(shù)據(jù)接口來(lái)接收數(shù)據(jù),并且通過(guò)在Linux服務(wù)器將采集的視頻和音頻數(shù)據(jù)加密,在客戶(hù)端進(jìn)行解密從而保
    發(fā)表于 08-31 16:04 ?23次下載

    CoolpyCould客戶(hù)端

    一款開(kāi)源的物聯(lián)網(wǎng)服務(wù)器平臺(tái),利用nodejs寫(xiě)成,此文件是CoolpyCould客戶(hù)端
    發(fā)表于 11-06 17:00 ?18次下載

    CSDN博客客戶(hù)端源碼

    CSDN博客客戶(hù)端源碼CSDN博客客戶(hù)端源碼CSDN博客客戶(hù)端源碼
    發(fā)表于 11-18 10:22 ?1次下載

    Delphi教程之?dāng)?shù)據(jù)查詢(xún)Web服務(wù)客戶(hù)端開(kāi)發(fā)數(shù)據(jù)查詢(xún)Web服務(wù)

    Delphi教程之?dāng)?shù)據(jù)查詢(xún)Web服務(wù)客戶(hù)端開(kāi)發(fā)數(shù)據(jù)查詢(xún)Web服務(wù)客戶(hù)端開(kāi)發(fā),很好的Delphi資料,快來(lái)下載學(xué)習(xí)吧。
    發(fā)表于 04-11 15:59 ?5次下載

    Android 仿QQ客戶(hù)端及服務(wù)源碼

    Android 仿QQ客戶(hù)端及服務(wù)源碼
    發(fā)表于 03-19 11:23 ?3次下載

    細(xì)說(shuō)inchat系統(tǒng)客戶(hù)端開(kāi)發(fā)之路

    Inchat系統(tǒng)客戶(hù)端開(kāi)發(fā)客戶(hù)端完成以后,我們將可以進(jìn)行簡(jiǎn)單的交流?!?薇芯bba1887 〗開(kāi)發(fā)完成的程序只是一個(gè)很簡(jiǎn)單的雛形,在本系統(tǒng)完成以后,InChatter系統(tǒng)
    發(fā)表于 08-29 20:36 ?451次閱讀

    iOS淘寶客戶(hù)端應(yīng)用名稱(chēng)發(fā)生變化 Android客戶(hù)端應(yīng)用名稱(chēng)尚未更改

    iOS淘寶客戶(hù)端應(yīng)用名稱(chēng)發(fā)生變化 Android客戶(hù)端應(yīng)用名稱(chēng)尚未更改
    發(fā)表于 04-18 15:37 ?936次閱讀

    HTTP客戶(hù)端快速入門(mén)指南

    HTTP客戶(hù)端快速入門(mén)指南
    發(fā)表于 01-12 18:45 ?0次下載
    HTTP<b class='flag-5'>客戶(hù)端</b>快速入門(mén)指南

    MQTT中服務(wù)客戶(hù)端

    MQTT 是一種基于客戶(hù)端-服務(wù)架構(gòu)(C/S)的消息傳輸協(xié)議,所以在 MQTT 協(xié)議通信中,有兩個(gè)最為重要的角色,它們便是服務(wù)客戶(hù)端。 1)服務(wù)
    的頭像 發(fā)表于 07-30 14:55 ?2652次閱讀

    服務(wù)如何控制客戶(hù)端之間的信息通訊

    服務(wù)如何通過(guò)“主題”來(lái)控制客戶(hù)端之間的信息通訊,看下圖實(shí)例: 在以上圖示中一共有三個(gè) MQTT 客戶(hù)端,它們分別是開(kāi)發(fā)板、手機(jī)和電腦。MQ
    的頭像 發(fā)表于 07-30 15:10 ?816次閱讀
    服務(wù)<b class='flag-5'>端</b>如何控制<b class='flag-5'>客戶(hù)端</b>之間的信息通訊