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

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

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

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

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

在這里插入圖片描述

一、項目目錄

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

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

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

在這里插入圖片描述

打開這個文件來看看里面有什么內(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ù)據(jù)比較的類,然后收縮一下,就比較清晰了。

在這里插入圖片描述

可以看到主要的分為三個部分:appdeviceConfig、module,你可以理解為三個對象。

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

下面也是一個個說明:

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

app對象就說完了,下面說deviceConfig

在這里插入圖片描述

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

  介紹是這樣的deviceConfig包含在具體設(shè)備上的應(yīng)用配置信息,可以包含default、car、tv、wearable、liteWearable、smartVision等屬性。default標(biāo)簽內(nèi)的配置是適用于所有設(shè)備通用,其他設(shè)備類型如果有特殊的需求,則需要在該設(shè)備類型的標(biāo)簽下進行配置。雖然它目前支持的模擬設(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中有defaultcar、tvwearable、liteWearable、smartVision。這六個對象,但是圖片上只有一個,你仿佛你在騙我!我翻譯一下

在這里插入圖片描述

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

在這里插入圖片描述

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

  • process 表示應(yīng)用或者Ability的進程名。如果在“deviceConfig”標(biāo)簽下配置了“process”標(biāo)簽,則該應(yīng)用的所有Ability都運行在這個進程中。 如果在“abilities”標(biāo)簽下也為某個Ability配置了“process”標(biāo)簽,則該Ability就運行在這個進程中。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機。可缺省,缺省為應(yīng)用的軟件包名。
  • directLaunch 表示應(yīng)用是否支持在設(shè)備未解鎖狀態(tài)直接啟動。如果配置為“true”,則表示應(yīng)用支持在設(shè)備未解鎖狀態(tài)下啟動。使用場景舉例:應(yīng)用支持在設(shè)備未解鎖情況下接聽來電。可缺省,缺省為“false”。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機。
  • supportBackup 表示應(yīng)用是否支持備份和恢復(fù)。如果配置為“false”,則不支持為該應(yīng)用執(zhí)行備份或恢復(fù)操作。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機??扇笔?,缺省為“false”。
  • compressNativeLibs 表示libs庫是否以壓縮存儲的方式打包到HAP包。如果配置為“false”,則libs庫以不壓縮的方式存儲,HAP包在安裝時無需解壓libs,運行時會直接從HAP內(nèi)加載libs庫。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機??扇笔?,缺省為“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)用使用明文流量的請求。false:拒絕應(yīng)用使用明文流量的請求??扇笔?,缺省為“false”。
  • securityConfig 表示應(yīng)用的網(wǎng)絡(luò)安全配置信息。可缺省,缺省為空。

然后再展開securityConfig,如下

在這里插入圖片描述

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

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

下面來看module對象的內(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"
   }
  ]
 }

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

在這里插入圖片描述

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

在這里插入圖片描述

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

  • 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。采用對象數(shù)組格式,其中每個元素表示一個Ability對象??扇笔?,缺省值為空。下面來看看里面有哪些屬性

在這里插入圖片描述

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

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

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

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

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

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

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

在這里插入圖片描述

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

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

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

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

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

在這里插入圖片描述

可以看到有兩個文件夾,

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

限定詞目錄的命名要求

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

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

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

 表2 限定詞取值要求

限定詞類型

含義與取值說明

語言

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

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

文字

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

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

國家或地區(qū)

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

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

橫豎屏

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

  • vertical:豎屏
  • horizontal:橫屏

設(shè)備類型

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

  • car:車機
  • 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,浮點型
  • intarray,整型數(shù)組
  • integer,整型
  • pattern,樣式
  • plural,復(fù)數(shù)形式
  • strarray,字符串?dāng)?shù)組
  • string,字符串

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

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

media

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

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

animation

表示動畫資源,采用XML文件格式。

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

layout

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

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

graphic

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

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

profile

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

文件名可自定義。

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

系統(tǒng)資源文件

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

系統(tǒng)資源名稱

含義

類型

ic_app

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

媒體

request_location_reminder_title

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

字符串

request_location_reminder_content

表示“請求使用設(shè)備定位功能”的提示內(nèi)容,即:請在下拉快捷欄打開"位置信息"開關(guān)。

字符串

二、編寫頁面

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

在這里插入圖片描述

在這里插入圖片描述

點擊OK,然后右鍵點擊“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>

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

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

在這里插入圖片描述

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

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

<?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之后再里面放了一個Text和一個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"

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

ohos:text_size="32fp"

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

ohos:background_element="$graphic:button_element"

背景,里面的值通過引用“button_element”來顯示的,你可能會奇怪,為什么要加一個element,單獨用background不行嗎?你別忘了,開發(fā)語言是支持JS的,所以你知道為啥有一個element了嗎?
可以看到它引用graphic下面的button_element,沒有就來創(chuàng)建一個,需要在“base”目錄下創(chuàng)建“graphic”文件夾,在“graphic”文件夾中新建一個“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方法里面的代碼,因為我們一開始運行項目就會有一個Hello World!但是之前里面沒有布局啊,所以默認的項目是在代碼中創(chuàng)建布局的,

在這里插入圖片描述

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

在這里插入圖片描述

三、頁面跳轉(zhuǎn)

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

1. 創(chuàng)建Feature Ability

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

在這里插入圖片描述

改一下Ability的名字

在這里插入圖片描述

點擊finish,然后你打開這個SecondAbilitySlice.java之后你會發(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è)置布局  */

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

    //創(chuàng)建一個文本組件
    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)邏輯

打開第一個頁面的“MainAbilitySlice.java”文件,重寫onStart()方法添加按鈕的響應(yīng)邏輯,實現(xià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è)置點擊監(jiān)聽
      button.setClickedListener(new Component.ClickedListener() {
        @Override
        public void onClick(Component component) {
          // 還是通過Intent來跳轉(zhuǎn)
          Intent secondIntent = new Intent();
          // 指定待啟動FA的bundleName和abilityName
          Operation operation = new Intent.OperationBuilder()
              // 設(shè)備id
              .withDeviceId("")
              // 應(yīng)用的包名 怎么跳轉(zhuǎn)個頁面搞得這么麻煩呢?
              .withBundleName("com.llw.helloworld")
              // 跳轉(zhuǎn)目標(biāo)的路徑名 通常是包名+類名 或者 . + 類名
              .withAbilityName("com.llw.helloworld.SecondAbility")
//              .withAbilityName(".SecondAbility")
              .build();
          // 設(shè)置操作方式
          secondIntent.setOperation(operation);
          // 通過AbilitySlice的startAbility接口實現(xiàn)啟動另一個頁面
          startAbility(secondIntent);
        }
      });
    }
  }

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

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

運行效果如下:用手機拍的,莫要見怪呀。

在這里插入圖片描述

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

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

相關(guān)文章

最新評論