欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解DevEco Studio項(xiàng)目構(gòu)建講解、編寫頁面、布局介紹、頁面跳轉(zhuǎn)

 更新時(shí)間:2020年09月22日 10:27:29   作者:初學(xué)者-Study  
這篇文章主要介紹了詳解DevEco Studio項(xiàng)目構(gòu)建講解、編寫頁面、布局介紹、頁面跳轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

首先要知道鴻蒙的APP是怎么構(gòu)成的?

  HarmonyOS的應(yīng)用軟件包以APP Pack(Application Package)形式發(fā)布,它是由一個(gè)或多個(gè)HAP(HarmonyOS Ability Package)以及描述每個(gè)HAP屬性的pack.info組成。HAP是Ability的部署包,HarmonyOS應(yīng)用代碼圍繞Ability組件展開。
一個(gè)HAP是由代碼、資源、第三方庫及應(yīng)用配置文件組成的模塊包,可分為entry和feature兩種模塊類型,如下圖所示。

在這里插入圖片描述

一、項(xiàng)目目錄

首先來看一張圖,很普通,我相信每一個(gè)人一開始新建使用Java語言的鴻蒙項(xiàng)目都是這樣的目錄結(jié)構(gòu),前面我們說到HUAWEI DevEco Studio是基于IntelliJ IDEA Community開源版本所打造出來的。那么它就會(huì)跟IDEA 和Android Studio 會(huì)有點(diǎn)像,那么同樣的項(xiàng)目結(jié)構(gòu)也比較像,同樣的我在AS中也新建了一個(gè)項(xiàng)目,下面是對(duì)比圖。
打開我之前創(chuàng)建的鴻蒙HelloWorld項(xiàng)目

在這里插入圖片描述在這里插入圖片描述

左邊的是DS,右邊是AS?;旧喜畈惶?,但是還有點(diǎn)點(diǎn)差點(diǎn),下面說一下
DS的主模塊是entry,AS的主模塊是app,對(duì)于功能中兩個(gè)build.gradle的功能是類似的,entry/app下面的build.gradle對(duì)當(dāng)前模塊進(jìn)行控制,而工程根目錄下的工程級(jí)build.gradle用于工程的全局設(shè)置。其中我們對(duì)AS中AndroidManifest.xml是很熟悉的,但是對(duì)于DS中用了另一種文件,那就是config.json,這是一個(gè)應(yīng)用清單文件,用于描述應(yīng)用的全局配置信息、在具體設(shè)備上的配置信息和HAP的配置信息。它的地位就相當(dāng)于AS中的AndroidManifest.xml。

在這里插入圖片描述

打開這個(gè)文件來看看里面有什么內(nèi)容:截圖截不全,所以我就直接把里面的代碼貼出來了:

1. config.json (配置文件)

{
 "app": {
  "bundleName": "com.llw.helloworld",
  "vendor": "llw",
  "version": {
   "code": 1,
   "name": "1.0"
  },
  "apiVersion": {
   "compatible": 3,
   "target": 3
  }
 },
 "deviceConfig": {},
 "module": {
  "package": "com.llw.helloworld",
  "name": ".HelloWorld",
  "reqCapabilities": [
   "video_support"
  ],
  "deviceType": [
   "wearable"
  ],
  "distro": {
   "deliveryWithInstall": true,
   "moduleName": "entry",
   "moduleType": "entry"
  },
  "abilities": [
   {
    "skills": [
     {
      "entities": [
       "entity.system.home"
      ],
      "actions": [
       "action.system.home"
      ]
     }
    ],
    "orientation": "landscape",
    "formEnabled": false,
    "name": "com.llw.helloworld.MainAbility",
    "icon": "$media:icon",
    "description": "$string:mainability_description",
    "label": "HelloWorld",
    "type": "page",
    "launchType": "standard"
   }
  ]
 }
}

它的數(shù)據(jù)結(jié)構(gòu)是JSON格式的,這和我們平時(shí)通過接口請(qǐng)求返回的數(shù)據(jù)比較的類,然后收縮一下,就比較清晰了。

在這里插入圖片描述

可以看到主要的分為三個(gè)部分:app、deviceConfig、module,你可以理解為三個(gè)對(duì)象。

app 表示應(yīng)用的全局配置信息。同一個(gè)應(yīng)用的不同HAP包的“app”配置必須保持一致。(簡單說就是你所有模塊里面的config.json中的app對(duì)象都要一模一樣)

deviceConfig 表示應(yīng)用在具體設(shè)備上的配置信息。(目前的設(shè)備有TV、智能手表、運(yùn)動(dòng)手表)

module 表示HAP包的配置信息。該標(biāo)簽下的配置只對(duì)當(dāng)前HAP包生效。(簡單說就是你當(dāng)前模塊的配置信息)

在這里插入圖片描述

是不是覺得清晰了那么一丟丟,好繼續(xù)往里面看,下面我們展開這個(gè)app對(duì)象,看一下里面可以配置哪些屬性。

在這里插入圖片描述

下面也是一個(gè)個(gè)說明:

  • bundleName 表示應(yīng)用的包名,用于標(biāo)識(shí)應(yīng)用的唯一性。采用反域名形式的字符串表示(例如,com.llw.helloworld)。建議第一級(jí)為域名后綴“com”,第二級(jí)為廠商/個(gè)人名,第三級(jí)為應(yīng)用名,也可以采用多級(jí)。支持的字符串長度為7~127字節(jié)。不可省缺。
  • vendor 表示對(duì)應(yīng)用開發(fā)廠商的描述。字符串長度不超過255字節(jié)。可以省缺,省缺值為空。
  • version 這是一個(gè)對(duì)象,表示應(yīng)用的版本信息。它里面有兩個(gè)參數(shù),codename,code 表示應(yīng)用的版本號(hào),僅用于HarmonyOS管理該應(yīng)用,對(duì)用戶不可見。取值為大于零的整數(shù)。name表示應(yīng)用的版本號(hào),用于向用戶呈現(xiàn)。取值可以自定義。兩個(gè)參數(shù)都不可省缺。
  • apiVersion 這也是一個(gè)對(duì)象,表示應(yīng)用依賴的HarmonyOS的API版本。它里面也有兩個(gè)參數(shù),compatibletargetcompatible 表示應(yīng)用運(yùn)行需要的API最小版本。取值為大于零的整數(shù)。不可省缺target 表示應(yīng)用運(yùn)行需要的API目標(biāo)版本。取值為大于零的整數(shù)。可缺省,缺省值為應(yīng)用所在設(shè)備的當(dāng)前API版本。

app對(duì)象就說完了,下面說deviceConfig。

在這里插入圖片描述

  從圖片上來看,里面是個(gè)空的,空的你說個(gè)錘子?。±潇o、冷靜,現(xiàn)在是空的不代表以后就是空的,其實(shí)它是由參數(shù)的,這個(gè)需要看官網(wǎng)上的文檔了。

  介紹是這樣的deviceConfig包含在具體設(shè)備上的應(yīng)用配置信息,可以包含default、car、tv、wearable、liteWearable、smartVision等屬性。default標(biāo)簽內(nèi)的配置是適用于所有設(shè)備通用,其他設(shè)備類型如果有特殊的需求,則需要在該設(shè)備類型的標(biāo)簽下進(jìn)行配置。雖然它目前支持的模擬設(shè)備只有tv、wearable、liteWearable,但是具體的設(shè)備還有一些其他的。下面也來介紹一下,先來看一下里面的內(nèi)容有哪些

"deviceConfig": {
  "default": {
   "process": "com.llw.helloworld.hiworld",
   "directLaunch": false,
   "supportBackup": false,
   "network": {
    "usesCleartext": true,
    "securityConfig": {
     "domainSettings": {
      "cleartextPermitted": true,
      "domains": [
       {
        "subDomains": true,
        "name": "example.ohos.com"
       }
      ]
     }
    }
   }
  }
 }

然后收縮一下,如下:

在這里插入圖片描述

之前提到deviceConfig中有default、car、tvwearable、liteWearablesmartVision。這六個(gè)對(duì)象,但是圖片上只有一個(gè),你仿佛你在騙我!我翻譯一下

在這里插入圖片描述

default代表的就是所有設(shè)備,而其他的五個(gè),和這個(gè)default對(duì)象里面的內(nèi)容時(shí)一模一樣的,只是名字不一樣,比如你把這個(gè)default改成car,那就是對(duì)應(yīng)汽車的設(shè)備配置,改成tv就是對(duì)應(yīng)電視的設(shè)備配置。比如:

在這里插入圖片描述

所以自由度很高,可以根據(jù)自己的實(shí)際需求,你想怎么玩就怎么玩。下面講一下里面具體的對(duì)象屬性:

  • process 表示應(yīng)用或者Ability的進(jìn)程名。如果在“deviceConfig”標(biāo)簽下配置了“process”標(biāo)簽,則該應(yīng)用的所有Ability都運(yùn)行在這個(gè)進(jìn)程中。 如果在“abilities”標(biāo)簽下也為某個(gè)Ability配置了“process”標(biāo)簽,則該Ability就運(yùn)行在這個(gè)進(jìn)程中。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)??扇笔?,缺省為應(yīng)用的軟件包名。
  • directLaunch 表示應(yīng)用是否支持在設(shè)備未解鎖狀態(tài)直接啟動(dòng)。如果配置為“true”,則表示應(yīng)用支持在設(shè)備未解鎖狀態(tài)下啟動(dòng)。使用場(chǎng)景舉例:應(yīng)用支持在設(shè)備未解鎖情況下接聽來電??扇笔?,缺省為“false”。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。
  • supportBackup 表示應(yīng)用是否支持備份和恢復(fù)。如果配置為“false”,則不支持為該應(yīng)用執(zhí)行備份或恢復(fù)操作。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)??扇笔?,缺省為“false”。
  • compressNativeLibs 表示libs庫是否以壓縮存儲(chǔ)的方式打包到HAP包。如果配置為“false”,則libs庫以不壓縮的方式存儲(chǔ),HAP包在安裝時(shí)無需解壓libs,運(yùn)行時(shí)會(huì)直接從HAP內(nèi)加載libs庫。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)??扇笔?,缺省為“true”。
  • network 表示網(wǎng)絡(luò)安全性配置。該標(biāo)簽允許應(yīng)用通過配置文件的安全聲明來自定義其網(wǎng)絡(luò)安全,無需修改應(yīng)用代碼。

先看看network里面有什么

在這里插入圖片描述

  • usesCleartext 表示是否允許應(yīng)用使用明文網(wǎng)絡(luò)流量(例如,明文HTTP)。true:允許應(yīng)用使用明文流量的請(qǐng)求。false:拒絕應(yīng)用使用明文流量的請(qǐng)求。可缺省,缺省為“false”。
  • securityConfig 表示應(yīng)用的網(wǎng)絡(luò)安全配置信息。可缺省,缺省為空。

然后再展開securityConfig,如下

在這里插入圖片描述

  • domainSettings 表示自定義的網(wǎng)域范圍的安全配置,支持多層嵌套,即一個(gè)domainSettings對(duì)象中允許嵌套更小網(wǎng)域范圍的domainSettings對(duì)象??扇笔?,缺省為空。它里面有cleartextPermitted屬性和domains對(duì)象。
  • cleartextPermitted表示自定義的網(wǎng)域范圍內(nèi)是否允許明文流量傳輸。當(dāng)useCleartextsecurityConfig同時(shí)存在時(shí),自定義網(wǎng)域是否允許明文流量傳輸以cleartextPermitted的取值為準(zhǔn)。true:允許明文流量傳輸。false:拒絕明文流量傳輸。不可省缺。
  • domains 表示域名配置信息,包含兩個(gè)參數(shù):subDomainsnamesubDomains(布爾類型):表示是否包含子域名。如果為 “true”,此網(wǎng)域規(guī)則將與相應(yīng)網(wǎng)域及所有子網(wǎng)域(包括子網(wǎng)域的子網(wǎng)域)匹配。否則,該規(guī)則僅適用于精確匹配項(xiàng)。
  • name(字符串):表示域名名稱。不可省缺。

說是說deviceConfig里面沒有東西,但是這么一頓操作下來,我人都傻了。好了,清醒一點(diǎn),還有一個(gè)module沒說呢?

下面來看module對(duì)象的內(nèi)部結(jié)構(gòu)。

"module": {
  "package": "com.llw.helloworld",
  "name": ".HelloWorld",
  "reqCapabilities": [
   "video_support"
  ],
  "deviceType": [
   "wearable"
  ],
  "distro": {
   "deliveryWithInstall": true,
   "moduleName": "entry",
   "moduleType": "entry"
  },
  "abilities": [
   {
    "skills": [
     {
      "entities": [
       "entity.system.home"
      ],
      "actions": [
       "action.system.home"
      ]
     }
    ],
    "orientation": "landscape",
    "formEnabled": false,
    "name": "com.llw.helloworld.MainAbility",
    "icon": "$media:icon",
    "description": "$string:mainability_description",
    "label": "HelloWorld",
    "type": "page",
    "launchType": "standard"
   }
  ]
 }

媽耶,這個(gè)module里面的東西比appdeviceConfig兩個(gè)對(duì)象里面加起來還要多。(555555~ 我不想學(xué)鴻蒙了,我放棄了,現(xiàn)在下車還來得及嗎?別想了,車門我已經(jīng)焊死了,雅蠛蝶!?。。?br /> 收縮一下,這么一看好像內(nèi)容也不是很多,對(duì)吧!畫外音:對(duì)個(gè)屁!

在這里插入圖片描述

  • package 表示HAP的包結(jié)構(gòu)名稱,在應(yīng)用內(nèi)應(yīng)保證唯一性。采用反向域名格式(建議與HAP的工程目錄保持一致)。字符串長度不超過127字節(jié)。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。不可省缺。
  • name 表示HAP的類名。采用反向域名方式表示,前綴需要與同級(jí)的package標(biāo)簽指定的包名一致,也可采用“.”開頭的命名方式。字符串長度不超過255字節(jié)。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。不可省缺。
  • reqCapabilities 表示需要的技術(shù)支持,這是一個(gè)字符串?dāng)?shù)組,里面可以看到有一個(gè)video_support,表示視頻支持。
  • deviceType 表示允許Ability運(yùn)行的設(shè)備類型。系統(tǒng)預(yù)定義的設(shè)備類型包括:tv(智慧屏)、car(車機(jī))、wearable(智能穿戴)、liteWearable(輕量級(jí)智能穿戴)等。不可省缺。

在這里插入圖片描述

distro 表示HAP發(fā)布的具體描述。這是一個(gè)對(duì)象,該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。不可省缺。它里面還有

  • deliveryWithInstall 表示當(dāng)前HAP是否支持隨應(yīng)用安裝。true:支持隨應(yīng)用安裝。false:不支持隨應(yīng)用安裝。不可省缺。
  • moduleName 表示當(dāng)前HAP的名稱。不可省缺。
  • moduleType 表示當(dāng)前HAP的類型,包括兩種類型:entry和feature。不可省缺。

abilities 表示當(dāng)前模塊內(nèi)的所有Ability。采用對(duì)象數(shù)組格式,其中每個(gè)元素表示一個(gè)Ability對(duì)象??扇笔?,缺省值為空。下面來看看里面有哪些屬性

在這里插入圖片描述

可以看到這個(gè)里面有一個(gè)對(duì)象數(shù)組skills,其余就是就是一些配置的屬性了。skills 里面還有兩個(gè)字符串?dāng)?shù)組entitiesactiions,下面先從這個(gè)skills 來分析。

skills 打過游戲的都知道,這是技能的意思。不過在這里是表示Ability能夠接收的Intent的特征。 這個(gè)Intent的用法其實(shí)和Android里面是比較像的,比如我們跳轉(zhuǎn)到手機(jī)的短信頁面就可以通過Intent,還有打電話也可以通過Intent,類似這樣的特征??扇笔?,缺省值為空。從上圖我們知道里面還有兩個(gè)字符串對(duì)象。

  • actions 表示能夠接收的Intent的action值,可以包含一個(gè)或多個(gè)action。取值通常為系統(tǒng)預(yù)定義的action值,可缺省,缺省值為空。
  • entities 表示能夠接收的Intent的Ability的類別(如視頻、桌面應(yīng)用等),可以包含一個(gè)或多個(gè)entity。取值通常為系統(tǒng)預(yù)定義的類別,可缺省,缺省值為空。

看到這里你會(huì)很奇怪,因?yàn)槟阒繟ndroid里面除了有Intent幫我們實(shí)現(xiàn)之外還有Uri可以實(shí)現(xiàn),那么上面的截圖中也沒有這個(gè)屬性,是為什么?答案就是這個(gè)屬性屬于開發(fā)者自行去做配置。這里就補(bǔ)充一下這個(gè)屬性,它其實(shí)一個(gè)對(duì)象數(shù)組。它就是uris

uris 表示能夠接收的Intent的uri,可以包含一個(gè)或者多個(gè)uri??扇笔?,缺省值為空。它里面的數(shù)據(jù)如下:

"uris": [
      {
         "scheme": "http",
         "host": "www.hefeng.com",
         "port": "8080",
         "path": "query/goodweather/today",
         "type": "text"
       }
     ]

  里面的對(duì)象屬性值就是字面意思,都是可以省缺的,省缺值為空。你可以根據(jù)不同的Uri配置不同的對(duì)象,都放到這個(gè)對(duì)象數(shù)組里面就可以了。下面看abilities中的其他屬性。

在這里插入圖片描述

orientation 表示該Ability的顯示模式。該標(biāo)簽僅適用于page類型的Ability。取值范圍如下:unspecified:由系統(tǒng)自動(dòng)判斷顯示方向。landscape:橫屏模式。portrait:豎屏模式。followRecent:跟隨棧中最近的應(yīng)用??扇笔。笔≈禐椤皍nspecified”。

formEnabled 表示FA類型的Ability是否提供卡片(form)能力。該標(biāo)簽僅適用于page類型的Ability。true:提供卡片能力。false:不提供卡片能力。可缺省,缺省值為“false”。

name 表示Ability名稱。取值可采用反向域名方式表示,由包名和類名組成,如“com.llw.helloworld.MainAbility”;也可采用“.”開頭的類名方式表示,如“.MainAbility”。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。不可省缺。

icon 表示Ability圖標(biāo)資源文件的索引。取值示例:$media:ability_icon。如果在該Ability的“skills”屬性中,“actions”的取值包含 “action.system.home”,“entities”取值中包含“entity.system.home”,則該Ability的icon將同時(shí)作為應(yīng)用的icon。如果存在多個(gè)符合條件的Ability,則取位置靠前的Ability的icon作為應(yīng)用的icon??扇笔?,缺省值為空。

description 表示對(duì)Ability的描述。取值可以是描述性內(nèi)容,也可以是對(duì)描述性內(nèi)容的資源索引,以支持多語言??扇笔。笔≈禐榭?。

label 表示Ability對(duì)用戶顯示的名稱。取值可以是Ability名稱,也可以是對(duì)該名稱的資源索引,以支持多語言。如果在該Ability的“skills”屬性中,“actions”的取值包含 “action.system.home”,“entities”取值中包含“entity.system.home”,則該Ability的label將同時(shí)作為應(yīng)用的label。如果存在多個(gè)符合條件的Ability,則取位置靠前的Ability的label作為應(yīng)用的label??扇笔。笔≈禐榭?。

type 表示Ability的類型。取值范圍如下:page:表示基于Page模板開發(fā)的FA,用于提供與用戶交互的能力。service:表示基于Service模板開發(fā)的PA,用于提供后臺(tái)運(yùn)行任務(wù)的能力。data:表示基于Data模板開發(fā)的PA,用于對(duì)外部提供統(tǒng)一的數(shù)據(jù)訪問抽象。不可省缺。

launchType 表示Ability的啟動(dòng)模式,支持“standard”和“singleton”兩種模式:standard:表示該Ability可以有多實(shí)例。“standard”模式適用于大多數(shù)應(yīng)用場(chǎng)景。singleton:表示該Ability只可以有一個(gè)實(shí)例。例如,具有全局唯一性的呼叫來電界面即采用“singleton”模式。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)??扇笔。笔≈禐椤皊tandard”。

至此,這個(gè)config.json的基本信息我們就都知道了,不得不說看起來比AS 的AndroidManifest.xml要復(fù)雜一些,看得我是頭皮發(fā)麻??赡苡玫氖煜ち司秃昧恕D阏f呢?

2. entry (應(yīng)用的主模塊)

應(yīng)用的主模塊,類似與AS的app模塊,一個(gè)APP中,對(duì)于同一設(shè)備類型必須有且只有一個(gè)entry類型的HAP,可獨(dú)立安裝運(yùn)行。它里面的內(nèi)容如下:

在這里插入圖片描述

從圖片上來看是和AS的app里面的內(nèi)容差不多,那就來看看不同的地方在哪里。

首先當(dāng)然是資源文件夾resources,其實(shí)和ASres是差不多的,只不過DS這里用了全拼。(AS指Android Studio,DS 指DevEco Studio),展開resources如下:

在這里插入圖片描述

可以看到有兩個(gè)文件夾,

baserawfile,首先從單詞的字面意思來看是基礎(chǔ)和原始文件。官方的意思是 base目錄和 限定詞目錄。按照兩級(jí)目錄形式來組織,目錄命名必須符合規(guī)范,以便根據(jù)設(shè)備狀態(tài)去匹配相應(yīng)目錄下的資源文件。聽起來是不是云里霧里,我都不知道你在說啥,下面我說一下我的個(gè)人理解,你可以把這個(gè)文件夾理解為AS的values文件下,我們之前一些樣式、顏色、尺寸、文字都是放在里面的,基本上一個(gè)values就夠了,但是如果要做國際化或者多語言的話,我們會(huì)新建一個(gè)values-en的文件夾,這個(gè)里面的的資源文件就是切換語言之后使用的。那么你就可以把這個(gè)限定詞目錄理解為values-en。當(dāng)然我也不知道對(duì)不對(duì)啊,先這么理解再說吧。限定詞目錄可以由一個(gè)或多個(gè)表征應(yīng)用場(chǎng)景或設(shè)備特征的限定詞組合而成,包括語言、文字、國家或地區(qū)、橫豎屏、設(shè)備類型和屏幕密度等六個(gè)維度,限定詞之間通過下劃線(_)或者中劃線(-)連接。開發(fā)者在創(chuàng)建限定詞目錄時(shí),需要掌握限定詞目錄的命名要求以及與限定詞目錄與設(shè)備狀態(tài)的匹配規(guī)則。當(dāng)然這個(gè)限定詞還是有命名規(guī)范的。

限定詞目錄的命名要求

限定詞的組合順序:語言_文字_國家或地區(qū)-橫豎屏-設(shè)備類型-屏幕密度。開發(fā)者可以根據(jù)應(yīng)用的使用場(chǎng)景和設(shè)備特征,選擇其中的一類或幾類限定詞組成目錄名稱。

限定詞的連接方式:語言、文字、國家或地區(qū)之間采用下劃線(_)連接,除此之外的其他限定詞之間均采用中劃線(-)連接。例如:zh_Hant_CN、zh_CN-car-ldpi

限定詞的取值范圍:每類限定詞的取值必須符合表2中的條件,否則,將無法匹配目錄中的資源文件。

 表2 限定詞取值要求

限定詞類型

含義與取值說明

語言

表示設(shè)備使用的語言類型,由2個(gè)小寫字母組成。例如:zh表示中文,en表示英語。

詳細(xì)取值范圍,參見ISO 639-1(ISO制定的語言編碼標(biāo)準(zhǔn))。

文字

表示設(shè)備使用的文字類型,由1個(gè)大寫字母(首字母)和3個(gè)小寫字母組成。例如:Hans表示簡體中文,Hant表示繁體中文。

詳細(xì)取值范圍,參見ISO 15924(ISO制定的文字編碼標(biāo)準(zhǔn))。

國家或地區(qū)

表示用戶所在的國家或地區(qū),由2~3個(gè)大寫字母或者3個(gè)數(shù)字組成。例如:CN表示中國,GB表示英國。

詳細(xì)取值范圍,參見ISO 3166-1(ISO制定的國家和地區(qū)編碼標(biāo)準(zhǔn))。

橫豎屏

表示設(shè)備的屏幕方向,取值如下:

  • vertical:豎屏
  • horizontal:橫屏

設(shè)備類型

表示設(shè)備的類型,取值如下:

  • car:車機(jī)
  • tv:智慧屏
  • wearable:智能穿戴

屏幕密度

表示設(shè)備的屏幕密度(單位為dpi),取值如下:

  • sdpi:表示小規(guī)模的屏幕密度(Small-scale Dots Per Inch),適用于120dpi及以下的設(shè)備。
  • mdpi:表示中規(guī)模的屏幕密度(Medium-scale Dots Per Inch),適用于120dpi~160dpi的設(shè)備。
  • ldpi:表示大規(guī)模的屏幕密度(Large-scale Dots Per Inch),適用于160dpi~240dpi的設(shè)備。
  • xldpi:表示特大規(guī)模的屏幕密度(Extra Large-scale Dots Per Inch),適用于240dpi~320dpi的設(shè)備。
  • xxldpi:表示超大規(guī)模的屏幕密度(Extra Extra Large-scale Dots Per Inch),適用于320dpi~480dpi的設(shè)備。
  • xxxldpi:表示超特大規(guī)模的屏幕密度(Extra Extra Extra Large-scale Dots Per Inch),適用于480dpi~640dpi的設(shè)備。

資源組目錄

base目錄與限定詞目錄下面可以創(chuàng)建資源組目錄(包括element、media、animation、layout、graphic、profile),用于存放特定類型的資源文件

表3 資源組目錄 說明

資源組目錄

目錄說明

資源文件

element

表示元素資源,以下每一類數(shù)據(jù)都采用相應(yīng)的JSON文件來表征。

  • boolean,布爾型
  • color,顏色
  • float,浮點(diǎn)型
  • intarray,整型數(shù)組
  • integer,整型
  • pattern,樣式
  • plural,復(fù)數(shù)形式
  • strarray,字符串?dāng)?shù)組
  • string,字符串

element目錄中的文件名稱建議與下面的文件名保持一致。每個(gè)文件中只能包含同一類型的數(shù)據(jù)。

  • boolean.json
  • color.json
  • float.json
  • intarray.json
  • integer.json
  • pattern.json
  • plural.json
  • strarray.json
  • string.json

media

表示媒體資源,包括圖片、音頻、視頻等非文本格式的文件。

文件名可自定義,例如:icon.png。

animation

表示動(dòng)畫資源,采用XML文件格式。

文件名可自定義,例如:zoom_in.xml。

layout

表示布局資源,采用XML文件格式。

文件名可自定義,例如:home_layout.xml。

graphic

表示可繪制資源,采用XML文件格式。

文件名可自定義,例如:notifications_dark.xml。

profile

表示其他類型文件,以原始文件形式保存。

文件名可自定義。

rawfile 這個(gè)文件是干嘛的呢?支持創(chuàng)建多層子目錄,目錄名稱可以自定義,文件夾內(nèi)可以自由放置各類資源文件。rawfile目錄的文件不會(huì)根據(jù)設(shè)備狀態(tài)去匹配不同的資源。這個(gè)里面就是一個(gè)綜合體,相當(dāng)于包含了AS的drawable和mipmap以及其他的一些文件,只不過它沒有做尺寸上的細(xì)分,需要開發(fā)者自行細(xì)分做不同設(shè)備的適配,不過既然是華為里面的東西,我相信到時(shí)候會(huì)有一個(gè)系統(tǒng)的關(guān)于這方面的講解的。

系統(tǒng)資源文件

系統(tǒng)資源文件說明

系統(tǒng)資源名稱

含義

類型

ic_app

表示HarmonyOS應(yīng)用的默認(rèn)圖標(biāo)。

媒體

request_location_reminder_title

表示“請(qǐng)求使用設(shè)備定位功能”的提示標(biāo)題。

字符串

request_location_reminder_content

表示“請(qǐng)求使用設(shè)備定位功能”的提示內(nèi)容,即:請(qǐng)?jiān)谙吕旖輽诖蜷_"位置信息"開關(guān)。

字符串

二、編寫頁面

右鍵點(diǎn)擊“base”文件夾,選擇“New > Directory”,命名為“l(fā)ayout”。

在這里插入圖片描述

在這里插入圖片描述

點(diǎn)擊OK,然后右鍵點(diǎn)擊“l(fā)ayout”文件夾,選擇“New >Layout Resources File”,命名為“main_layout.xml”。

在這里插入圖片描述

在這里插入圖片描述

單擊Finish,完成布局創(chuàng)建。
布局如下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos"
          ohos:width="match_parent"
          ohos:height="match_parent"
          ohos:orientation="vertical">
  
</DirectionalLayout>

這都是什么鬼東西,我咋看不懂呢?你可能會(huì)問ohos是個(gè)啥?我就這么告訴你,你把它當(dāng)成AS中布局文件中的android就可以了。ohos我估計(jì)是鴻蒙系統(tǒng)對(duì)于布局的一個(gè)屬性標(biāo)識(shí)。除了這個(gè),還有DirectionalLayout是什么布局呢?這位朋友你的問題咋這么多呢?嗯?

DirectionalLayout是方向布局,聞所未聞?那么還有沒有其他的一些布局呢?當(dāng)然有,如下圖所示:

在這里插入圖片描述

我們創(chuàng)建xml的時(shí)候默認(rèn)的是DirectionalLayout,這個(gè)布局表用于單一方向排列,你可以理解為AS的線性布局,還有五種布局分別是什么呢?AdaptiveBoxLayout(自適應(yīng)盒式布局)、DependentLayout(相關(guān)布局,你可以理解為是AS的相對(duì)布局)、PositionLayout(位置布局,相當(dāng)于絕對(duì)布局)、StackLayout(堆疊布局)、TableLayout(表格布局)。

好了,上面看你裝逼是裝完了,會(huì)用嗎?這個(gè)問題問得好,不是全會(huì)!哎,先別動(dòng)手,放下手中的刀,作為剛學(xué)的哪能都會(huì)啊,而且我現(xiàn)在只是簡單的講解一下,到時(shí)候具體的使用肯定也是要大費(fèi)周章才能講完,這個(gè)解釋怎么樣?講真的,你信我,只要我都會(huì)使用之后,我絕對(duì)會(huì)另寫一篇文章來單獨(dú)講這個(gè)布局,好不好?回到剛才的布局頁面。修改一下后如下所示:

<?xml version="1.0" encoding="utf-8"?>
<DependentLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:width="match_parent"
    ohos:height="match_parent"
    ohos:background_element="#000000">
  <Text
      ohos:id="$+id:text"
      ohos:width="match_content"
      ohos:height="match_content"
      ohos:center_in_parent="true"
      ohos:text="Hello World"
      ohos:text_color="white"
      ohos:text_size="32fp"/>
  <Button
      ohos:id="$+id:button"
      ohos:width="match_content"
      ohos:height="match_content"
      ohos:text_size="19fp"
      ohos:text="Next"
      ohos:top_padding="8vp"
      ohos:bottom_padding="8vp"
      ohos:right_padding="80vp"
      ohos:left_padding="80vp"
      ohos:text_color="white"
      ohos:background_element="$graphic:button_element"
      ohos:center_in_parent="true"
      ohos:align_parent_bottom="true"/>
</DependentLayout>

可以看到,我把DirectionalLayout改成DependentLayout之后再里面放了一個(gè)Text和一個(gè)Button,
首先來看我們不熟悉的屬性值:

ohos:width="match_content"
ohos:height="match_content"

寬高為match_content,表示組件大小與它的內(nèi)容占據(jù)的大小范圍相適應(yīng),簡單說,就是自適應(yīng)大小,類似于AS的wrap_content,這么一說就好理解了。

ohos:center_in_parent="true"

這個(gè)從字面意思看是在父布局內(nèi)居中的意思。

ohos:text_size="32fp"

文字大小使用fp,尺寸大小使用vp

ohos:background_element="$graphic:button_element"

背景,里面的值通過引用“button_element”來顯示的,你可能會(huì)奇怪,為什么要加一個(gè)element,單獨(dú)用background不行嗎?你別忘了,開發(fā)語言是支持JS的,所以你知道為啥有一個(gè)element了嗎?
可以看到它引用graphic下面的button_element,沒有就來創(chuàng)建一個(gè),需要在“base”目錄下創(chuàng)建“graphic”文件夾,在“graphic”文件夾中新建一個(gè)“button_element.xml”文件。
代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:shape="oval">
  <solid
      ohos:color="#007DFF"/>
</shape>

那么布局就已經(jīng)寫好了。下面打開MainAbilitySlice.java

在這里插入圖片描述

里面的代碼如下:

package com.llw.helloworld.slice;

import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;

import ohos.agp.components.DirectionalLayout;
import ohos.agp.components.DirectionalLayout.LayoutConfig;
import ohos.agp.components.Text;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.element.ShapeElement;
import ohos.agp.utils.Color;
import ohos.agp.utils.TextAlignment;

public class MainAbilitySlice extends AbilitySlice {

  private DirectionalLayout myLayout = new DirectionalLayout(this);

  @Override
  public void onStart(Intent intent) {
    super.onStart(intent);
    LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT);
    myLayout.setLayoutConfig(config);
    ShapeElement element = new ShapeElement();
    element.setRgbColor(new RgbColor(255, 255, 255));
    myLayout.setBackground(element);

    Text text = new Text(this);
    text.setLayoutConfig(config);
    text.setText("Hello World");
    text.setTextColor(new Color(0xFF000000));
    text.setTextSize(50);
    text.setTextAlignment(TextAlignment.CENTER);
    myLayout.addComponent(text);
    super.setUIContent(myLayout);
  }

  @Override
  public void onActive() {
    super.onActive();
  }

  @Override
  public void onForeground(Intent intent) {
    super.onForeground(intent);
  }
}

只要看里面的onStart方法里面的代碼,因?yàn)槲覀円婚_始運(yùn)行項(xiàng)目就會(huì)有一個(gè)Hello World!但是之前里面沒有布局啊,所以默認(rèn)的項(xiàng)目是在代碼中創(chuàng)建布局的,

在這里插入圖片描述

下面來看看這個(gè)代碼的意思,注釋已經(jīng)寫在里面了

在這里插入圖片描述

下面清理掉onStart中的方法,增加

super.setUIContent(ResourceTable.Layout_main_layout); // 加載XML布局

在這里插入圖片描述

添加我們剛才創(chuàng)建的布局。然后運(yùn)行到遠(yuǎn)程模擬器上面,這個(gè)確實(shí)也比較煩就是需要登錄才能行。運(yùn)行出來的效果如下:

在這里插入圖片描述

三、頁面跳轉(zhuǎn)

APP只有一個(gè)頁面可不行啊,下面來新建一個(gè)頁面。

1. 創(chuàng)建Feature Ability

右鍵點(diǎn)擊“com.example.myapplication”文件夾,選擇“New > Ability > Empty Feature Ability(Java)”。

在這里插入圖片描述

改一下Ability的名字

在這里插入圖片描述

點(diǎn)擊finish,然后你打開這個(gè)SecondAbilitySlice.java之后你會(huì)發(fā)現(xiàn)里面的代碼也幫你生成好了,也是Hello World。首先把它的待刪掉。

在這里插入圖片描述

刪除之后,如下所示:

package com.llw.helloworld.slice;


import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;

public class SecondAbilitySlice extends AbilitySlice {

  @Override
  protected void onStart(Intent intent) {
    super.onStart(intent);
  }

  @Override
  protected void onActive() {
    super.onActive();
  }

  @Override
  protected void onForeground(Intent intent) {
    super.onForeground(intent);
  }
}

添加代碼后如下所示:每一行添加的代碼都有注釋:

package com.llw.helloworld.slice;


import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.DependentLayout;
import ohos.agp.components.Text;
import ohos.agp.components.element.ShapeElement;
import ohos.agp.utils.Color;

import java.math.MathContext;

import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_CONTENT;
import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_PARENT;

public class SecondAbilitySlice extends AbilitySlice {

  @Override
  protected void onStart(Intent intent) {
    super.onStart(intent);

    /*  使用代碼設(shè)置布局  */

    //聲明一個(gè)相關(guān)布局
    DependentLayout myLayout = new DependentLayout(this);
    //設(shè)置布局的大小 寬高占滿屏幕
    myLayout.setWidth(MATCH_PARENT);
    myLayout.setHeight(MATCH_PARENT);
    //創(chuàng)建一個(gè)形狀元素對(duì)象
    ShapeElement element = new ShapeElement();
    //設(shè)置顏色
    element.setRgbColor(new RgbColor(0,0,0));
    //設(shè)置布局的背景
    myLayout.setBackground(element);

    //創(chuàng)建一個(gè)文本組件
    Text text = new Text(this);
    //設(shè)置文本組件顯示的內(nèi)容
    text.setText("How are you?");
    //設(shè)置寬度占滿父布局
    text.setWidth(MATCH_PARENT);
    //設(shè)置文字大小
    text.setTextSize(55);
    //設(shè)置文字顏色
    text.setTextColor(Color.WHITE);
    //設(shè)置文本的布局 寬高自適應(yīng)
    DependentLayout.LayoutConfig textConfig = new DependentLayout.LayoutConfig(MATCH_CONTENT,MATCH_CONTENT);
    //添加顯示規(guī)則 顯示在布局的中央
    textConfig.addRule(DependentLayout.LayoutConfig.CENTER_IN_PARENT);
    //給Text組件設(shè)置布局配置
    text.setLayoutConfig(textConfig);
    //然后把Text組件添加到布局中
    myLayout.addComponent(text);
    //最后加載布局
    super.setUIContent(myLayout);
  }

  @Override
  protected void onActive() {
    super.onActive();
  }

  @Override
  protected void onForeground(Intent intent) {
    super.onForeground(intent);
  }
}

2. 跳轉(zhuǎn)邏輯

打開第一個(gè)頁面的“MainAbilitySlice.java”文件,重寫onStart()方法添加按鈕的響應(yīng)邏輯,實(shí)現(xiàn)點(diǎn)擊按鈕跳轉(zhuǎn)到下一頁。

package com.llw.helloworld.slice;

import com.llw.helloworld.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;

import ohos.aafwk.content.Operation;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.components.DirectionalLayout;
import ohos.agp.components.DirectionalLayout.LayoutConfig;
import ohos.agp.components.Text;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.element.ShapeElement;
import ohos.agp.utils.Color;
import ohos.agp.utils.TextAlignment;

/** @author llw
 * @noinspection All */
public class MainAbilitySlice extends AbilitySlice {

  @Override
  public void onStart(Intent intent) {
    super.onStart(intent);
    // 加載XML布局
    super.setUIContent(ResourceTable.Layout_main_layout);

    //這一步就類似與findViewById 初始化組件
    Button button = (Button) findComponentById(ResourceTable.Id_button);
    if(button != null){
      //設(shè)置點(diǎn)擊監(jiān)聽
      button.setClickedListener(new Component.ClickedListener() {
        @Override
        public void onClick(Component component) {
          // 還是通過Intent來跳轉(zhuǎn)
          Intent secondIntent = new Intent();
          // 指定待啟動(dòng)FA的bundleName和abilityName
          Operation operation = new Intent.OperationBuilder()
              // 設(shè)備id
              .withDeviceId("")
              // 應(yīng)用的包名 怎么跳轉(zhuǎn)個(gè)頁面搞得這么麻煩呢?
              .withBundleName("com.llw.helloworld")
              // 跳轉(zhuǎn)目標(biāo)的路徑名 通常是包名+類名 或者 . + 類名
              .withAbilityName("com.llw.helloworld.SecondAbility")
//              .withAbilityName(".SecondAbility")
              .build();
          // 設(shè)置操作方式
          secondIntent.setOperation(operation);
          // 通過AbilitySlice的startAbility接口實(shí)現(xiàn)啟動(dòng)另一個(gè)頁面
          startAbility(secondIntent);
        }
      });
    }
  }

  @Override
  public void onActive() {
    super.onActive();
  }

  @Override
  public void onForeground(Intent intent) {
    super.onForeground(intent);
  }
}

運(yùn)行效果如下:用手機(jī)拍的,莫要見怪呀。

在這里插入圖片描述

OK,現(xiàn)在就比只寫一個(gè)HelloWorld來說要進(jìn)步一些了

到此這篇關(guān)于詳解DevEco Studio項(xiàng)目構(gòu)建講解、編寫頁面、布局介紹、頁面跳轉(zhuǎn)的文章就介紹到這了,更多相關(guān)DevEco Studio項(xiàng)目構(gòu)建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論