DevEcoStudio 个人记录备份 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DevEcoStudio?個(gè)人記錄備份 1? ? ? ??
部分轉(zhuǎn)載自HarmonyOS技術(shù)社區(qū),初學(xué)者-Study? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
2020年9月10日,HarmonyOS 2.0的發(fā)布對(duì)于IT界來(lái)說(shuō)又是一件翹首以盼的大事。發(fā)布會(huì)上,華為消費(fèi)者業(yè)務(wù)軟件部總裁王成錄為開(kāi)發(fā)者帶來(lái)了一個(gè)全面升級(jí)的華為鴻蒙版本,各方面能力的大幅提升,完整的應(yīng)用開(kāi)發(fā)生態(tài),超級(jí)終端的全場(chǎng)景生態(tài),即將開(kāi)啟移動(dòng)生態(tài)的下一下新紀(jì)元。
?在參加完鴻蒙2.0的發(fā)布會(huì)后,又周轉(zhuǎn)于9月11日華為聯(lián)合南北向業(yè)務(wù)合作伙伴以及應(yīng)用生態(tài)合作伙伴共同主持的各技術(shù)分論壇活動(dòng)。作為一名從事移動(dòng)應(yīng)用相關(guān)產(chǎn)業(yè)近十余年的工作者,自然是對(duì)華為鴻蒙2.0提供的完整的應(yīng)用開(kāi)發(fā)生態(tài)更為感興趣。
?《從零開(kāi)始開(kāi)發(fā)HarmonyOS應(yīng)用》是華為展示的第一個(gè)鴻蒙應(yīng)用示例,示例簡(jiǎn)單的介紹了多設(shè)備自適應(yīng)布局、輸入事件處理、和跨設(shè)備流轉(zhuǎn)。
1 創(chuàng)建應(yīng)用工程
使用 DevEco Studio 創(chuàng)建應(yīng)用工程,在菜單欄打開(kāi)“File>New>New Project”,在彈出的對(duì)話框中選擇java工程模板
選擇好模板之后點(diǎn)擊“Next”,在下一個(gè)界面中指定“Project Name”和“Package Name”,然后點(diǎn)擊“Finish”即可建立工程
一個(gè)建立好的工程包含以下目錄
2 設(shè)計(jì)用戶界面
在Java UI框架中,提供了兩種編寫布局的方式:在XML中聲明UI布局和在代碼中創(chuàng)建布局。這兩種方式創(chuàng)建出的布局沒(méi)有本質(zhì)差別,此例主要通過(guò)XML的方式編寫應(yīng)用的頁(yè)面
2.1 XML編寫頁(yè)面
2.1.1 新建XML頁(yè)面
在“Project”窗口,打開(kāi)“entry > src > main > resources > base”,右鍵點(diǎn)擊“base”文件夾,選擇“New > Directory”,命名為“l(fā)ayout”。
右鍵點(diǎn)擊“l(fā)ayout”文件夾,選擇“New > File”命名為“main_layout.xml”。
在“l(fā)ayout”文件夾下可以看到新增了“main_layout.xml”文件。
2.1.2 編寫XML代碼
這個(gè)示例中自適應(yīng)布局的實(shí)現(xiàn),主要是基于AdaptiveBoxLayout新的布局樣式,它可以將布局在橫豎屏設(shè)備上進(jìn)行自適應(yīng)分布排列。開(kāi)發(fā)者可以將布局代碼寫在“main_layout.xml”文件,關(guān)于布局代碼怎樣實(shí)現(xiàn)可以參考文檔中心
如果布局中引用到圖片資源,需要將圖片放到 “resources>base>media”
2.2加載XML布局
在“Project”窗口中,選擇“entry > src > main > java > com.huawei.example.helloworld > slice”,打開(kāi)“MainAbilitySlice.java”文件。重寫onStart()方法加載XML布局,示例代碼如下:
1.package com.huawei.example.helloworld.slice; 2.import com.huawei.example.helloworld.ResourceTable; 3.import ohos.aafwk.ability.AbilitySlice; 4.import ohos.aafwk.content.Intent; 5. 6.public class MainAbilitySlice extends AbilitySlice { 7. 8. @Override 9. public void onStart(Intent intent) { 10. super.onStart(intent); 11. super.setUIContent(ResourceTable.Layout_main_layout); // 加載XML布局 12. } 13. 14. @Override 15. public void onActive() { 16. super.onActive(); 17. } 18. 19. @Override 20. public void onForeground(Intent intent) { 21. super.onForeground(intent); 22. } 23.}應(yīng)用運(yùn)行效果如圖所示:
2.3基礎(chǔ)UI組件解釋
創(chuàng)建xml的時(shí)候默認(rèn)的是DirectionalLayout,這個(gè)布局表用于單一方向排列,你可以理解為AS的線性布局,還有五種布局分別是什么呢? AdaptiveBoxLayout(自適應(yīng)盒式布局) DependentLayout(相關(guān)布局,你可以理解為是AS的相對(duì)布局) PositionLayout(位置布局,相當(dāng)于絕對(duì)布局) StackLayout(堆疊布局) TableLayout(表格布局)3 輸入事件處理
輸入事件包括兩種,一種是觸控事件,一種是按鍵事件。
3.1 觸控事件
組件的一個(gè)重要作用是當(dāng)用戶點(diǎn)擊組件時(shí),會(huì)執(zhí)行相應(yīng)的操作或者界面出現(xiàn)相應(yīng)的變化。用戶點(diǎn)擊組件時(shí),組件對(duì)象將收到一個(gè)點(diǎn)擊事件。開(kāi)發(fā)者可以自定義響應(yīng)點(diǎn)擊事件的方法。例如,通過(guò)創(chuàng)建一個(gè)Component.ClickedListener對(duì)象,然后通過(guò)調(diào)用setClickedListener將其分配給組件。示例代碼如下
1. //1.先導(dǎo)入ohos.agp.components.Image 2. //2.從定義的xml中獲取Image對(duì)象 3. Image remote = (Image) findComponentById(ResourceTable.Id_remote); 4. //3.為Image設(shè)置點(diǎn)擊事件回調(diào) 5. remote.setClickedListener(component -> { 6. //4.此處添加點(diǎn)擊按鈕后的事件處理邏輯 7. migrateAbility(); 8. });?3.2 按鍵點(diǎn)擊事件
當(dāng)設(shè)備按鍵按下時(shí),相應(yīng)的Ability對(duì)象將收到一個(gè)KeyEvent事件。開(kāi)發(fā)者可以自定義響應(yīng)點(diǎn)擊事件的方法
一個(gè)示例代碼如下
1.public boolean onKeyEvent(Component component, KeyEvent keyEvent) { 2. if (keyEvent.isKeyDown() 3. && keyEvent.getKeyCode() == KeyEvent.KEY_DPAD_CENTER 4. && component.getId() == ResourceTable.Id_remote) { 5. continueAbility(); 6. return true; 7. } 8. return false; 9.}4 跨設(shè)備流轉(zhuǎn)
4.1 申請(qǐng)權(quán)限
權(quán)限即系統(tǒng)用于控制第三方應(yīng)用或服務(wù)訪問(wèn)用戶敏感個(gè)人數(shù)據(jù)或操作敏感能力的授權(quán)方式,當(dāng)?shù)谌綉?yīng)用或服務(wù)嘗試訪問(wèn)用戶個(gè)人數(shù)據(jù)或操作敏感能力時(shí),系統(tǒng)通過(guò)彈窗的形式請(qǐng)求用戶授權(quán)。用戶可授權(quán)此應(yīng)用使用相關(guān)權(quán)限,后續(xù)也可取消此授權(quán)。例如打車類應(yīng)用為了定位,在獲取用戶的地理位置信息前需向用戶申請(qǐng),用戶同意此應(yīng)用使用,后續(xù)也可取消此授權(quán)。
當(dāng)使用“流轉(zhuǎn)”功能需要申請(qǐng)遷移權(quán)限D(zhuǎn)ISTRIBUTED_DATASYNC
4.1.1 在config.json中聲明權(quán)限
1. "reqPermissions": [ 2. { 3. "name": "ohos.permission.DISTRIBUTED_DATASYNC" 4. } 5. ]4.1.2 在MainAbilitySlice.java中請(qǐng)求權(quán)限
1.private void migrateAbility() { 2. if (verifySelfPermission(SystemPermission.DISTRIBUTED_DATASYNC) 3. == IBundleManager.PERMISSION_GRANTED) { 4. this.continueAbility(); 5. } else { 6. requestPermission(SystemPermission.DISTRIBUTED_DATASYNC); 7. } 8.}4.2 跨設(shè)備流轉(zhuǎn)
僅continueAbility一行代碼即可完成應(yīng)用在設(shè)備之間流轉(zhuǎn),依托的還是鴻蒙OS的分布式軟總線、分布式數(shù)據(jù)庫(kù)的能力。在此基礎(chǔ)上將這些能力通過(guò)接口的形式提供開(kāi)發(fā)者。
事實(shí)上流轉(zhuǎn)并非“一行代碼可以完成”,如果開(kāi)發(fā)者想在流轉(zhuǎn)過(guò)程中做更多的事情,那么可以通過(guò)IAbilifyContinuation接口中的方法進(jìn)行實(shí)現(xiàn)。
IAbilityContinuation接口方法說(shuō)明如下
| 接口名稱 | 說(shuō)明 |
| onStartContinuation | Page請(qǐng)求遷移后,系統(tǒng)首先回調(diào)此方法,開(kāi)發(fā)者可以在此回調(diào)中決策當(dāng)前是否可以執(zhí)行遷移,比如,彈框讓用戶確認(rèn)是否開(kāi)始遷移。 |
| onSaveData | 如果onStartContinuation()返回true,則系統(tǒng)回調(diào)此方法,開(kāi)發(fā)者在此回調(diào)中保存必須傳遞到另外設(shè)備上以便恢復(fù)Page狀態(tài)的數(shù)據(jù)。 |
| onRestoreData | 源側(cè)設(shè)備上Page完成保存數(shù)據(jù)后,系統(tǒng)在目標(biāo)側(cè)設(shè)備上回調(diào)此方法,開(kāi)發(fā)者在此回調(diào)中接受用于恢復(fù)Page狀態(tài)的數(shù)據(jù)。注意,在目標(biāo)側(cè)設(shè)備上的Page會(huì)重新啟動(dòng)其生命周期,無(wú)論其啟動(dòng)模式如何配置。且系統(tǒng)回調(diào)此方法的時(shí)機(jī)在onStart()之前。 |
| onCompleteContinuation | 目標(biāo)側(cè)設(shè)備上恢復(fù)數(shù)據(jù)一旦完成,系統(tǒng)就會(huì)在源側(cè)設(shè)備上回調(diào)Page的此方法,以便通知應(yīng)用遷移流程已結(jié)束。開(kāi)發(fā)者可以在此檢查遷移結(jié)果是否成功,并在此處理遷移結(jié)束的動(dòng)作,例如,應(yīng)用可以在遷移完成后終止自身生命周期。 |
Ability以及AbilitySlice都需要實(shí)現(xiàn)IAbilityContinuation接口,并實(shí)現(xiàn)其中的方法。示例代碼如下
1. @Override 2. public boolean onStartContinuation() { 3. return true; 4. } 5. 6. @Override 7. public boolean onSaveData(IntentParams intentParams) { 8. return true; 9. } 10. 11. @Override 12. public boolean onRestoreData(IntentParams intentParams) { 13. return true; 14. } 15. 16. @Override 17. public void onCompleteContinuation(int i) { 18. 19. }?首先來(lái)看一張圖,很普通,我相信每一個(gè)人一開(kāi)始新建使用Java語(yǔ)言的鴻蒙項(xiàng)目都是這樣的目錄結(jié)構(gòu),前面我們說(shuō)到HUAWEI DevEco Studio是基于IntelliJ IDEA Community開(kāi)源版本所打造出來(lái)的。那么它就會(huì)跟IDEA 和Android Studio 會(huì)有點(diǎn)像,那么同樣的項(xiàng)目結(jié)構(gòu)也比較像,同樣的我在AS中也新建了一個(gè)項(xiàng)目,下面是對(duì)比圖。
打開(kāi)我之前創(chuàng)建的鴻蒙HelloWorld項(xiàng)目
左邊的是DS,右邊是AS。基本上差不太多,但是還有點(diǎn)點(diǎn)差點(diǎn),下面說(shuō)一下
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。
打開(kāi)這個(gè)文件來(lái)看看里面有什么內(nèi)容:截圖截不全,所以我就直接把里面的代碼貼出來(lái)了:
1. config.json (配置文件)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | { ?"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í)通過(guò)接口請(qǐng)求返回的數(shù)據(jù)比較的類,然后收縮一下,就比較清晰了。
可以看到主要的分為三個(gè)部分:app、deviceConfig、module,你可以理解為三個(gè)對(duì)象。
①?app?表示應(yīng)用的全局配置信息。同一個(gè)應(yīng)用的不同HAP包的“app”配置必須保持一致。(簡(jiǎn)單說(shuō)就是你所有模塊里面的config.json中的app對(duì)象都要一模一樣)
②?deviceConfig?表示應(yīng)用在具體設(shè)備上的配置信息。(目前的設(shè)備有TV、智能手表、運(yùn)動(dòng)手表)
③?module?表示HAP包的配置信息。該標(biāo)簽下的配置只對(duì)當(dāng)前HAP包生效。(簡(jiǎn)單說(shuō)就是你當(dāng)前模塊的配置信息)
是不是覺(jué)得清晰了那么一丟丟,好繼續(xù)往里面看,下面我們展開(kāi)這個(gè)app對(duì)象,看一下里面可以配置哪些屬性。
下面也是一個(gè)個(gè)說(shuō)明:
- bundleName?表示應(yīng)用的包名,用于標(biāo)識(shí)應(yīng)用的唯一性。采用反域名形式的字符串表示(例如,com.llw.helloworld)。建議第一級(jí)為域名后綴“com”,第二級(jí)為廠商/個(gè)人名,第三級(jí)為應(yīng)用名,也可以采用多級(jí)。支持的字符串長(zhǎng)度為7~127字節(jié)。不可省缺。
- vendor?表示對(duì)應(yīng)用開(kāi)發(fā)廠商的描述。字符串長(zhǎng)度不超過(guò)255字節(jié)。可以省缺,省缺值為空。
- version?這是一個(gè)對(duì)象,表示應(yīng)用的版本信息。它里面有兩個(gè)參數(shù),code和name,code?表示應(yīng)用的版本號(hào),僅用于HarmonyOS管理該應(yīng)用,對(duì)用戶不可見(jiàn)。取值為大于零的整數(shù)。name表示應(yīng)用的版本號(hào),用于向用戶呈現(xiàn)。取值可以自定義。兩個(gè)參數(shù)都不可省缺。
- apiVersion?這也是一個(gè)對(duì)象,表示應(yīng)用依賴的HarmonyOS的API版本。它里面也有兩個(gè)參數(shù),compatible?和?target?,compatible?表示應(yīng)用運(yùn)行需要的API最小版本。取值為大于零的整數(shù)。不可省缺target?表示應(yīng)用運(yùn)行需要的API目標(biāo)版本。取值為大于零的整數(shù)。可缺省,缺省值為應(yīng)用所在設(shè)備的當(dāng)前API版本。
app對(duì)象就說(shuō)完了,下面說(shuō)deviceConfig。
??從圖片上來(lái)看,里面是個(gè)空的,空的你說(shuō)個(gè)錘子啊!冷靜、冷靜,現(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è)備還有一些其他的。下面也來(lái)介紹一下,先來(lái)看一下里面的內(nèi)容有哪些
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | "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、tv、wearable、liteWearable、smartVision。這六個(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è)備未解鎖情況下接聽(tīng)來(lái)電。可缺省,缺省為“false”。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。
- supportBackup 表示應(yīng)用是否支持備份和恢復(fù)。如果配置為“false”,則不支持為該應(yīng)用執(zhí)行備份或恢復(fù)操作。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。可缺省,缺省為“false”。
- compressNativeLibs 表示libs庫(kù)是否以壓縮存儲(chǔ)的方式打包到HAP包。如果配置為“false”,則libs庫(kù)以不壓縮的方式存儲(chǔ),HAP包在安裝時(shí)無(wú)需解壓libs,運(yùn)行時(shí)會(huì)直接從HAP內(nèi)加載libs庫(kù)。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。可缺省,缺省為“true”。
- network 表示網(wǎng)絡(luò)安全性配置。該標(biāo)簽允許應(yīng)用通過(guò)配置文件的安全聲明來(lái)自定義其網(wǎng)絡(luò)安全,無(wú)需修改應(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ò)安全配置信息。可缺省,缺省為空。
然后再展開(kāi)securityConfig,如下
- domainSettings?表示自定義的網(wǎng)域范圍的安全配置,支持多層嵌套,即一個(gè)domainSettings對(duì)象中允許嵌套更小網(wǎng)域范圍的domainSettings對(duì)象。可缺省,缺省為空。它里面有cleartextPermitted屬性和domains對(duì)象。
- cleartextPermitted表示自定義的網(wǎng)域范圍內(nèi)是否允許明文流量傳輸。當(dāng)useCleartext和securityConfig同時(shí)存在時(shí),自定義網(wǎng)域是否允許明文流量傳輸以cleartextPermitted的取值為準(zhǔn)。true:允許明文流量傳輸。false:拒絕明文流量傳輸。不可省缺。
- domains?表示域名配置信息,包含兩個(gè)參數(shù):subDomains和name。subDomains(布爾類型):表示是否包含子域名。如果為 “true”,此網(wǎng)域規(guī)則將與相應(yīng)網(wǎng)域及所有子網(wǎng)域(包括子網(wǎng)域的子網(wǎng)域)匹配。否則,該規(guī)則僅適用于精確匹配項(xiàng)。
- name(字符串):表示域名名稱。不可省缺。
說(shuō)是說(shuō)deviceConfig里面沒(méi)有東西,但是這么一頓操作下來(lái),我人都傻了。好了,清醒一點(diǎn),還有一個(gè)module沒(méi)說(shuō)呢?
下面來(lái)看module對(duì)象的內(nèi)部結(jié)構(gòu)。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | "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里面的東西比app和deviceConfig兩個(gè)對(duì)象里面加起來(lái)還要多。(555555~ 我不想學(xué)鴻蒙了,我放棄了,現(xiàn)在下車還來(lái)得及嗎?別想了,車門我已經(jīng)焊死了,雅蠛蝶!!!)
收縮一下,這么一看好像內(nèi)容也不是很多,對(duì)吧!畫(huà)外音:對(duì)個(gè)屁!
- package?表示HAP的包結(jié)構(gòu)名稱,在應(yīng)用內(nèi)應(yīng)保證唯一性。采用反向域名格式(建議與HAP的工程目錄保持一致)。字符串長(zhǎng)度不超過(guò)127字節(jié)。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。不可省缺。
- name?表示HAP的類名。采用反向域名方式表示,前綴需要與同級(jí)的package標(biāo)簽指定的包名一致,也可采用“.”開(kāi)頭的命名方式。字符串長(zhǎng)度不超過(guò)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ì)象。可缺省,缺省值為空。下面來(lái)看看里面有哪些屬性
可以看到這個(gè)里面有一個(gè)對(duì)象數(shù)組skills,其余就是就是一些配置的屬性了。skills?里面還有兩個(gè)字符串?dāng)?shù)組entities和actiions,下面先從這個(gè)skills?來(lái)分析。
skills?打過(guò)游戲的都知道,這是技能的意思。不過(guò)在這里是表示Ability能夠接收的Intent的特征。 這個(gè)Intent的用法其實(shí)和Android里面是比較像的,比如我們跳轉(zhuǎn)到手機(jī)的短信頁(yè)面就可以通過(guò)Intent,還有打電話也可以通過(guò)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),那么上面的截圖中也沒(méi)有這個(gè)屬性,是為什么?答案就是這個(gè)屬性屬于開(kāi)發(fā)者自行去做配置。這里就補(bǔ)充一下這個(gè)屬性,它其實(shí)一個(gè)對(duì)象數(shù)組。它就是uris
uris?表示能夠接收的Intent的uri,可以包含一個(gè)或者多個(gè)uri。可缺省,缺省值為空。它里面的數(shù)據(jù)如下:
| 1 2 3 4 5 6 7 8 9 | "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)用。可缺省,缺省值為“unspecified”。
formEnabled?表示FA類型的Ability是否提供卡片(form)能力。該標(biāo)簽僅適用于page類型的Ability。true:提供卡片能力。false:不提供卡片能力。可缺省,缺省值為“false”。
name?表示Ability名稱。取值可采用反向域名方式表示,由包名和類名組成,如“com.llw.helloworld.MainAbility”;也可采用“.”開(kāi)頭的類名方式表示,如“.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)容的資源索引,以支持多語(yǔ)言。可缺省,缺省值為空。
label?表示Ability對(duì)用戶顯示的名稱。取值可以是Ability名稱,也可以是對(duì)該名稱的資源索引,以支持多語(yǔ)言。如果在該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模板開(kāi)發(fā)的FA,用于提供與用戶交互的能力。service:表示基于Service模板開(kāi)發(fā)的PA,用于提供后臺(tái)運(yùn)行任務(wù)的能力。data:表示基于Data模板開(kāi)發(fā)的PA,用于對(duì)外部提供統(tǒng)一的數(shù)據(jù)訪問(wèn)抽象。不可省缺。
launchType?表示Ability的啟動(dòng)模式,支持“standard”和“singleton”兩種模式:standard:表示該Ability可以有多實(shí)例。“standard”模式適用于大多數(shù)應(yīng)用場(chǎng)景。singleton:表示該Ability只可以有一個(gè)實(shí)例。例如,具有全局唯一性的呼叫來(lái)電界面即采用“singleton”模式。該標(biāo)簽僅適用于智慧屏、智能穿戴、車機(jī)。可缺省,缺省值為“standard”。
至此,這個(gè)config.json的基本信息我們就都知道了,不得不說(shuō)看起來(lái)比AS 的AndroidManifest.xml要復(fù)雜一些,看得我是頭皮發(fā)麻。可能用的熟悉了就好了。你說(shuō)呢?
2. entry (應(yīng)用的主模塊)
應(yīng)用的主模塊,類似與AS的app模塊,一個(gè)APP中,對(duì)于同一設(shè)備類型必須有且只有一個(gè)entry類型的HAP,可獨(dú)立安裝運(yùn)行。它里面的內(nèi)容如下:
從圖片上來(lái)看是和AS的app里面的內(nèi)容差不多,那就來(lái)看看不同的地方在哪里。
首先當(dāng)然是資源文件夾resources,其實(shí)和AS的res是差不多的,只不過(guò)DS這里用了全拼。(AS指Android Studio,DS 指DevEco Studio),展開(kāi)resources如下:
可以看到有兩個(gè)文件夾,
base和rawfile,首先從單詞的字面意思來(lái)看是基礎(chǔ)和原始文件。官方的意思是 base目錄和 限定詞目錄。按照兩級(jí)目錄形式來(lái)組織,目錄命名必須符合規(guī)范,以便根據(jù)設(shè)備狀態(tài)去匹配相應(yīng)目錄下的資源文件。聽(tīng)起來(lái)是不是云里霧里,我都不知道你在說(shuō)啥,下面我說(shuō)一下我的個(gè)人理解,你可以把這個(gè)文件夾理解為AS的values文件下,我們之前一些樣式、顏色、尺寸、文字都是放在里面的,基本上一個(gè)values就夠了,但是如果要做國(guó)際化或者多語(yǔ)言的話,我們會(huì)新建一個(gè)values-en的文件夾,這個(gè)里面的的資源文件就是切換語(yǔ)言之后使用的。那么你就可以把這個(gè)限定詞目錄理解為values-en。當(dāng)然我也不知道對(duì)不對(duì)啊,先這么理解再說(shuō)吧。限定詞目錄可以由一個(gè)或多個(gè)表征應(yīng)用場(chǎng)景或設(shè)備特征的限定詞組合而成,包括語(yǔ)言、文字、國(guó)家或地區(qū)、橫豎屏、設(shè)備類型和屏幕密度等六個(gè)維度,限定詞之間通過(guò)下劃線(_)或者中劃線(-)連接。開(kāi)發(fā)者在創(chuàng)建限定詞目錄時(shí),需要掌握限定詞目錄的命名要求以及與限定詞目錄與設(shè)備狀態(tài)的匹配規(guī)則。當(dāng)然這個(gè)限定詞還是有命名規(guī)范的。
限定詞目錄的命名要求
限定詞的組合順序:語(yǔ)言_文字_國(guó)家或地區(qū)-橫豎屏-設(shè)備類型-屏幕密度。開(kāi)發(fā)者可以根據(jù)應(yīng)用的使用場(chǎng)景和設(shè)備特征,選擇其中的一類或幾類限定詞組成目錄名稱。
限定詞的連接方式:語(yǔ)言、文字、國(guó)家或地區(qū)之間采用下劃線(_)連接,除此之外的其他限定詞之間均采用中劃線(-)連接。例如:zh_Hant_CN、zh_CN-car-ldpi。
限定詞的取值范圍:每類限定詞的取值必須符合表2中的條件,否則,將無(wú)法匹配目錄中的資源文件。
?表2?限定詞取值要求
| 語(yǔ)言 | 表示設(shè)備使用的語(yǔ)言類型,由2個(gè)小寫字母組成。例如:zh表示中文,en表示英語(yǔ)。 詳細(xì)取值范圍,參見(jiàn)ISO 639-1(ISO制定的語(yǔ)言編碼標(biāo)準(zhǔn))。 |
| 文字 | 表示設(shè)備使用的文字類型,由1個(gè)大寫字母(首字母)和3個(gè)小寫字母組成。例如:Hans表示簡(jiǎn)體中文,Hant表示繁體中文。 詳細(xì)取值范圍,參見(jiàn)ISO 15924(ISO制定的文字編碼標(biāo)準(zhǔn))。 |
| 國(guó)家或地區(qū) | 表示用戶所在的國(guó)家或地區(qū),由2~3個(gè)大寫字母或者3個(gè)數(shù)字組成。例如:CN表示中國(guó),GB表示英國(guó)。 詳細(xì)取值范圍,參見(jiàn)ISO 3166-1(ISO制定的國(guó)家和地區(qū)編碼標(biāo)準(zhǔn))。 |
| 橫豎屏 | 表示設(shè)備的屏幕方向,取值如下:
|
| 設(shè)備類型 | 表示設(shè)備的類型,取值如下:
|
| 屏幕密度 | 表示設(shè)備的屏幕密度(單位為dpi),取值如下:
|
資源組目錄
base目錄與限定詞目錄下面可以創(chuàng)建資源組目錄(包括element、media、animation、layout、graphic、profile),用于存放特定類型的資源文件
表3?資源組目錄?說(shuō)明
| element | 表示元素資源,以下每一類數(shù)據(jù)都采用相應(yīng)的JSON文件來(lái)表征。
| element目錄中的文件名稱建議與下面的文件名保持一致。每個(gè)文件中只能包含同一類型的數(shù)據(jù)。
|
| media | 表示媒體資源,包括圖片、音頻、視頻等非文本格式的文件。 | 文件名可自定義,例如:icon.png。 |
| animation | 表示動(dòng)畫(huà)資源,采用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以及其他的一些文件,只不過(guò)它沒(méi)有做尺寸上的細(xì)分,需要開(kāi)發(fā)者自行細(xì)分做不同設(shè)備的適配,不過(guò)既然是華為里面的東西,我相信到時(shí)候會(huì)有一個(gè)系統(tǒng)的關(guān)于這方面的講解的。
系統(tǒng)資源文件
系統(tǒng)資源文件說(shuō)明
| 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)谙吕旖輽诖蜷_(kāi)"位置信息"開(kāi)關(guān)。 | 字符串 |
二、編寫頁(yè)面
右鍵點(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)建。
布局如下:
| 1 2 3 4 5 6 7 | <?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ì)問(wèn)ohos是個(gè)啥?我就這么告訴你,你把它當(dāng)成AS中布局文件中的android就可以了。ohos我估計(jì)是鴻蒙系統(tǒng)對(duì)于布局的一個(gè)屬性標(biāo)識(shí)。除了這個(gè),還有DirectionalLayout是什么布局呢?這位朋友你的問(wèn)題咋這么多呢?嗯?
DirectionalLayout是方向布局,聞所未聞?那么還有沒(méi)有其他的一些布局呢?當(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è)問(wèn)題問(wèn)得好,不是全會(huì)!哎,先別動(dòng)手,放下手中的刀,作為剛學(xué)的哪能都會(huì)啊,而且我現(xiàn)在只是簡(jiǎn)單的講解一下,到時(shí)候具體的使用肯定也是要大費(fèi)周章才能講完,這個(gè)解釋怎么樣?講真的,你信我,只要我都會(huì)使用之后,我絕對(duì)會(huì)另寫一篇文章來(lái)單獨(dú)講這個(gè)布局,好不好?回到剛才的布局頁(yè)面。修改一下后如下所示:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?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,
首先來(lái)看我們不熟悉的屬性值:
| 1 2 | ohos:width="match_content" ohos:height="match_content" |
寬高為match_content,表示組件大小與它的內(nèi)容占據(jù)的大小范圍相適應(yīng),簡(jiǎn)單說(shuō),就是自適應(yīng)大小,類似于AS的wrap_content,這么一說(shuō)就好理解了。
| 1 | ohos:center_in_parent="true" |
這個(gè)從字面意思看是在父布局內(nèi)居中的意思。
| 1 | ohos:text_size="32fp" |
文字大小使用fp,尺寸大小使用vp
| 1 | ohos:background_element="$graphic:button_element" |
背景,里面的值通過(guò)引用“button_element”來(lái)顯示的,你可能會(huì)奇怪,為什么要加一個(gè)element,單獨(dú)用background不行嗎?你別忘了,開(kāi)發(fā)語(yǔ)言是支持JS的,所以你知道為啥有一個(gè)element了嗎?
可以看到它引用graphic下面的button_element,沒(méi)有就來(lái)創(chuàng)建一個(gè),需要在“base”目錄下創(chuàng)建“graphic”文件夾,在“graphic”文件夾中新建一個(gè)“button_element.xml”文件。
代碼如下:
| 1 2 3 4 5 6 7 | <?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)寫好了。下面打開(kāi)MainAbilitySlice.java
里面的代碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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)槲覀円婚_(kāi)始運(yùn)行項(xiàng)目就會(huì)有一個(gè)Hello World!但是之前里面沒(méi)有布局啊,所以默認(rèn)的項(xiàng)目是在代碼中創(chuàng)建布局的,
下面來(lái)看看這個(gè)代碼的意思,注釋已經(jīng)寫在里面了
下面清理掉onStart中的方法,增加
| 1 | super.setUIContent(ResourceTable.Layout_main_layout); // 加載XML布局 |
添加我們剛才創(chuàng)建的布局。然后運(yùn)行到遠(yuǎn)程模擬器上面,這個(gè)確實(shí)也比較煩就是需要登錄才能行。運(yùn)行出來(lái)的效果如下:
三、頁(yè)面跳轉(zhuǎn)
APP只有一個(gè)頁(yè)面可不行啊,下面來(lái)新建一個(gè)頁(yè)面。
1. 創(chuàng)建Feature Ability
右鍵點(diǎn)擊“com.example.myapplication”文件夾,選擇“New > Ability > Empty Feature Ability(Java)”。
改一下Ability的名字
點(diǎn)擊finish,然后你打開(kāi)這個(gè)SecondAbilitySlice.java之后你會(huì)發(fā)現(xiàn)里面的代碼也幫你生成好了,也是Hello World。首先把它的待刪掉。
刪除之后,如下所示:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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); ??} } |
添加代碼后如下所示:每一行添加的代碼都有注釋:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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)邏輯
打開(kāi)第一個(gè)頁(yè)面的“MainAbilitySlice.java”文件,重寫onStart()方法添加按鈕的響應(yīng)邏輯,實(shí)現(xiàn)點(diǎn)擊按鈕跳轉(zhuǎn)到下一頁(yè)。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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)聽(tīng) ??????button.setClickedListener(new Component.ClickedListener() { ????????@Override ????????public void onClick(Component component) { ??????????// 還是通過(guò)Intent來(lái)跳轉(zhuǎn) ??????????Intent secondIntent = new Intent(); ??????????// 指定待啟動(dòng)FA的bundleName和abilityName ??????????Operation operation = new Intent.OperationBuilder() ??????????????// 設(shè)備id ??????????????.withDeviceId("") ??????????????// 應(yīng)用的包名 怎么跳轉(zhuǎn)個(gè)頁(yè)面搞得這么麻煩呢? ??????????????.withBundleName("com.llw.helloworld") ??????????????// 跳轉(zhuǎn)目標(biāo)的路徑名 通常是包名+類名 或者 . + 類名 ??????????????.withAbilityName("com.llw.helloworld.SecondAbility") //????????????? .withAbilityName(".SecondAbility") ??????????????.build(); ??????????// 設(shè)置操作方式 ??????????secondIntent.setOperation(operation); ??????????// 通過(guò)AbilitySlice的startAbility接口實(shí)現(xiàn)啟動(dòng)另一個(gè)頁(yè)面 ??????????startAbility(secondIntent); ????????} ??????}); ????} ??} ??@Override ??public void onActive() { ????super.onActive(); ??} ??@Override ??public void onForeground(Intent intent) { ????super.onForeground(intent); ??} } |
運(yùn)行效果如下:用手機(jī)拍的,莫要見(jiàn)怪呀。
總結(jié)
以上是生活随笔為你收集整理的DevEcoStudio 个人记录备份 1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java-字节流
- 下一篇: JAVA 基于SSM的健身俱乐部管理系统