<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenHarmony開發實例:【新聞客戶端】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-16 16:09 ? 次閱讀

介紹

本篇Codelab我們將教會大家如何構建一個簡易的OpenHarmony新聞客戶端(JS版本)。應用包含兩級頁面,分別是主頁面和詳情頁面,兩個頁面都展示了豐富的UI組件,其中詳情頁的實現邏輯中還展示了如何通過調用相應接口,實現跨設備拉起FA。本教程將結合以下內容進行講解:

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

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

3.布局及頁面跳轉

4.設備發現以及跨設備拉起FA

最終效果預覽如下圖所示:

搭建OpenHarmony環境

完成本篇Codelab我們首先要完成開發環境的搭建,本示例以Hi3516DV300開發板為例,參照以下步驟進行:

  1. [獲取OpenHarmony系統版本]:標準系統解決方案(二進制)。
  2. 搭建燒錄環境:
    1. [完成DevEco Device Tool的安裝]
    2. [完成Hi3516開發板的燒錄]
    3. 鴻蒙開發指導文檔:[qr23.cn/AKFP8k]
  3. 搭建開發環境:
    1. 開始前請參考[工具準備] ,完成DevEco Studio的安裝和開發環境配置。
    2. 開發環境配置完成后,請參考[使用工程向導] 創建工程(模板選擇“Empty Ability”),選擇JS或者eTS語言開發。
    3. 工程創建完成后,選擇使用[真機進行調測] 。

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

分布式組網

完成本篇Codelab我們還需要完成開發板的分布式組網,本示例以Hi3516DV300開發板為例,參照以下步驟進行:

  1. 硬件準備:準備兩臺燒錄相同的版本系統的Hi3516DV300開發板A、B。

  2. 兩個開發板A、B配置在同一個WiFi網絡之下。
    打開設置-->WLAN-->點擊右側WiFi開關-->點擊目標WiFi并輸入密碼。

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

    • 找到系統應用“音樂”。

    • 設備A打開音樂,點擊左下角帶箭頭的流轉按鈕,彈出列表框,在列表中會展示遠端設備的id。
    • 選擇遠端設備B的id,另一臺開發板(設備B)會彈出驗證的選項框。
    • 設備B點擊允許,設備B將會彈出隨機PIN碼,將設備B的PIN碼輸入到設備A的PIN碼填入框中。

    配網完畢。

代碼結構解讀

本篇Codelab只對核心代碼進行講解,對于完整代碼,我們會在最后的參考中提供下載方式,接下來我們會用一小節來講解整個工程的代碼結構:

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

添加主頁新聞類型

首先為我們的應用添加頂部新聞類型,用于切換不同類別的新聞。這里會使用到tabs、tab-bar控件,同時使用for循環對新聞的title進行遍歷,新聞的標題有All、Health、Finance、Technology、Sport、Internet、Game七大類。圖片示例和代碼如下:

< 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 >

添加主頁頂部新聞類型

  1. 我們需要實現一個新聞item的布局,其樣式包含左邊的新聞標題、右邊的新聞圖片以及下方的新聞分割線,圖片示例和代碼如下:
    < 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. 我們需要實現一個新聞列表,也就是將上方的新聞item進行一個循環的展示,這需要用到list、list-item的相關知識點。我們需要將newsList新聞列表數據進行循環,所以新聞item的布局外層需要嵌套一個list和list-item,圖片示例和代碼如下:
    < list class="list" >
        < list-item for="{{ news in newsList }}" onclick="itemClick(news)" >
               // 新聞item的布局代碼填充到這里         
        < /list-item >
    < /list >
    
  3. 我們需要實現新聞類型的切換,每一條新聞都會有一個新聞類型,當選擇All的時候默認展示所有類型的新聞,當選擇具體的新聞類型時,如選擇Health,則需要篩選出屬于Health類型的新聞進行展示。添加一個自定義函數changeNewsType,代碼如下所示:
    // 選擇新聞類型
    changeNewsType: function (e) {
      const type = titles[e.index].name;
      this.newsList = [];
      if (type === 'All') {
        // 展示全部新聞
        this.newsList = newsData;
      } else {
        // 分類展示新聞
        const newsArray = [];
        for (var news of newsData) {
           if (news.type === type) {
              newsArray.push(news);
          }
        }
        this.newsList = newsArray;
      }
    }
    

詳情頁頁面布局

詳情頁面包含新聞標題、閱讀量和喜好數、新聞圖片、新聞文字以及下方的狀態欄。狀態欄包括1個可輸入文本框和4個功能按鍵,圖片示例和代碼如下:

< 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 >
    < !-- 詳情頁底部-- >
    < 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只是展示了頁面的布局結構,其具體的布局樣式需要參考detail.css文件。

跳轉詳情頁

完成新聞列表頁面和詳情頁的布局后,需要實現頁面跳轉的功能。新聞列表頁面中綁定一個list-item的點擊事件itemClick,其中傳入的參數是news(新聞的詳細數據)。

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

在JS中頁面跳轉需要在JS文件的頭部引入如下一行代碼:

import router from '@system.router';

實現list-item的點擊事件itemClick,其代碼如下所示:

itemClick(news) {
  // 跳轉到詳情頁面
  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
    }
  });
}

設備發現

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

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

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

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

toShare() {
    // 創建設備管理實例
    deviceManager.createDeviceManager('com.huawei.codelab', (err, data) = > {
      if (err) {
        return;
      }
      this.deviceMag = data;
      // 獲取所有可信設備的列表
      this.deviceList = this.deviceMag.getTrustedDeviceListSync();
    });
    // 循環遍歷設備列表,獲取設備名稱和設備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彈窗顯示所有可信設備,代碼如下所示:

< dialog id="showDialog" class="select-device-dialog" >
    < div class="select-device-wrapper" >
        < text class="select-device-title" >選擇設備< /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 >

最終實現的效果如下所示:

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

分布式拉起

彈出設備列表后,選擇設備并點擊“確定”按鈕,將會分布式拉起另外一臺設備,其具體實現代碼如下所示:

chooseComform() {
    this.$element('showDialog').close();
    for (let i = 0; i < this.deviceList.length; i++) {
      // 判斷設備是否被選中
      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');
      }
    }
}

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    55

    文章

    1769

    瀏覽量

    42153
  • HarmonyOS
    +關注

    關注

    79

    文章

    1878

    瀏覽量

    29335
  • OpenHarmony
    +關注

    關注

    23

    文章

    3380

    瀏覽量

    15194
收藏 人收藏

    評論

    相關推薦

    labview TCP客戶端

    最近在做一個labview 客戶端測試小程序,服務器采用MFC編寫,客戶端采用TCP偵聽函數,通信可以連接,數據也正確,但是服務器檢測發送判斷失敗,個人推測是不是客戶端建立連接后關閉
    發表于 06-30 23:15

    一個服務器,多個客戶端,怎么向指定的客戶端發數據

    我用labview做服務器,單片機做客戶端,客戶端幾百個,怎么區分客戶端,給指定的客戶發發數據
    發表于 06-01 09:26

    Windows如何安裝ssh客戶端

    迅為IMX6ULL開發板Windows安裝ssh客戶端
    發表于 12-28 07:01

    如何使用Socket實現TCP客戶端?

    本教程介紹了如何編寫一個基于 socket 編程實現的 TCP 客戶端。我們先將 socket 編程的流程列出來,然后給出具體的實例。
    發表于 03-30 07:07

    如何使用Socket實現UDP客戶端?

    本教程介紹了如何利用socket 編程來實現一個 UDP 客戶端,與服務器進行通信。與開發 TCP 客戶端一樣,我們先將 socket 編程的流程列出來,然后給出具體的實例。
    發表于 03-30 07:39

    基于Socket開發TCP傳輸客戶端

    1 程序界面設計 TCP客戶端在上位機開發中應用很廣,大多數情況下,上位機軟件都是作為一個TCP客戶端來與PLC或其他服務器進行通信的。TCP客戶端的主要功能就是連接服務器、發送數據、
    發表于 07-02 06:33

    stm32f107vc lwip tcp客戶端

    stm32f107vc lwip tcp客戶端 服務器數據傳輸第一篇TCP客戶端模式簡單數據收發 ----控制開發板LED燈概要建立LWIP客戶端模式,科星F107
    發表于 08-06 09:17

    線程多客戶端設置

    客戶端設置,每個客戶端與服務器可視為一個線程。利用多線程在ucosiii下設置。一個線程設置服務器,一個線程創建客戶端(可多次創建),一個線程管理客戶端的連接與斷開。通訊管理還需要改
    發表于 08-24 06:08

    Labview客戶端狀態獲取

    求助,目前只有5積分,哪位大佬給點幫助:采用TCP傳輸數據,一個服務器多個客戶端,通過一個按鈕控制,點動按鈕將服務器中的一個文件發給4個客戶端,目前已實現發送文件和讀取連接客戶端數量,不過客戶
    發表于 11-15 15:02

    監控系統客戶端及服務設計

    項目開發報告1 項目簡介1.1 概述1.2 開發環境1.3 其他支持1.4 應用界面1.4.1 服務器1.4.2 客戶端1.5 程序使用2 項目
    發表于 12-21 07:02

    使用Arduino編程和esp32的開發板,多個客戶端連接服務器時怎么判斷是哪個客戶端發送過來的數據?

    我使用的是Arduino編程和esp32的開發板,當多個客戶端連接服務器的時候,服務器怎么判斷是哪個客戶端發送過來的數據
    發表于 05-23 15:39

    CH32V307VCT6的TCP客戶端例程,燒到開發板上ping不通,客戶端也連接不上是為什么?

    CH32V307VCT6的TCP客戶端例程,燒到開發板上ping不通,客戶端也連接不上,網口燈也是亮的。這是為什么?
    發表于 06-22 06:57

    OpenHarmony開發之MQTT講解

    速度”信息轉發給訂閱了該主題的手機和電腦客戶端。以上實例中,汽車是“汽車速度”主題的發布者,而手機和電腦則是該主題的訂閱者。值得注意的是,MQTT客戶端在通訊時,往往角色不是單一的。它既可以作為信息發布者
    發表于 11-16 12:05

    使用uIP TCP/IP堆疊的TCP客戶端實例

    應用程序:使用 uIP TCP/IP 堆疊的 TCP 客戶端實例 BSP 版本: M480系列 BSP CMSIS v3.03.001 硬件: NuMaker-PFM-M487 VER 3.0
    發表于 08-22 07:47

    AT32基于FreeRTOS的AWS MQTT客戶端

    AT32基于FreeRTOS的AWS MQTT客戶端建立一個MQTT客戶端與 AWS IoT Core進行通訊,用戶可以基于這個范例去開發屬于自己的應用。
    發表于 10-26 06:03
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>