鴻蒙OS應用開發實踐(三)


經過前兩篇的學習,我們了解了DevEco運行一個程序的基本流程和一個鴻蒙OS應用項目的代碼結構。

用一句《三體》格式的話說:跑得動hello world,我們就是同志了。

這一篇,我們就自己手動擼一個簡單的鴻蒙交互程序:從一個頁面跳轉到另一個頁面。

(一)創建工程

先創建一個新的TV的empty java工程:

點finish后,發現這次從創建到項目環境加載完成,用了很短的時間,這是因為初始環境需要各種配置和下載,類似我們初下完一個大型游戲,首次需要更新內容一般。

(二)自定義布局

進入界面后,默認的IDE已經創建了一個hello world程序,我們打開entry -> src -> main ->resources -> base -> layout -> ability_main.xml 布局文件:

我們先清掉原本的布局,重新寫入我們自己的布局:

<?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="你好,鴻蒙OS"

        ohos:text_color="white"

        ohos:text_size="32fp"/>

    <Button ohos:id="$+id:button"

            ohos:width="match_content"

            ohos:height="match_content"

            ohos:text_size="20fp"

            ohos:text="跳轉"

            ohos:left_margin="50vp"

            ohos:bottom_margin="50vp"

            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>

DependentLayout標簽指定了這是一個相對位置布局,意思就是布局里的每個組件可以指定相對於其他同級組件的位置,也可以指定相對於父組件的位置。

Button標簽表示了這里將會布局創建一個按鈕,大部分設置信息同Text。

按鈕的背景指定了“button_element”來顯示,這是另外一個布局文件,我們來手動創建,在resources -> base ->graphic 目錄下,右鍵創建一個File,命名為:button_element.xml

在button_element.xml添加如下代碼:

<?xml version="1.0" encoding="utf-8"?>

<shape

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:shape="rectangle">

    <corners

        ohos:radius="10"/>

    <solid

        ohos:color="#FF007DFF"/>

</shape>

目前鴻蒙官方提供形狀:rectangle(方形)和oval(橢圓),通過不同的內外邊距設定,就可以衍生出其他形狀:圓形,橢圓,正方,膠囊。

corners標簽表示了圓角設定,將方形設定圓角,我們就可以得到一個圓角按鈕。

默認的模版使用的是方向布局DirectionLayout(垂直或者橫向),這里我們修改使用DependentLayout相對位置布局,這樣可以更加方便的控制文本和按鈕的相對位置。

運行效果:

(三)創建建跳轉頁面
當然,當前點擊跳轉按鈕不會有任何反應,一方面我們還沒寫交互邏輯,另一方面,我們要跳轉的頁面也還沒寫。我們繼續下一步,寫一個新的頁面。

在項目對應的目錄下,創建一個空的FA(java),如下圖:

這里我們將新頁面命名為:NewPage

下面兩項不勾選,直接點finish。

創建后,目錄下除了剛才創建的newpage,還會自動創建一個newpageslice在slice目錄下以及對應的布局文件在layout目錄下:

之前在跑hello world的時候,我們說過,ability是入口,邏輯代碼都在slice里,同樣,在這個newpage里,它也是將邏輯route到了slice類中。

我們打開ability_new_page.xml,簡單修改下輸出文本:

(四)主頁面添加交互邏輯

到這里,我們的第二個頁面算是簡單的創建完畢了,下一步,我們需要在主頁面下添加交互邏輯,讓它可以跳轉到這個新的slice頁面中來,在主頁面(MainAbilitySlice)中去添加按鈕點擊的事件邏輯:


Button btn = (Button) findComponentById(ResourceTable.Id_button);

if (btn != null) {

    //添加按鈕點擊事件監聽

    btn.setClickedListener(new Component.ClickedListener() {

        @Override

        public void onClick(Component component) {

            Intent newpageIntent = new Intent();

            //指定目標頁面

            Operation operation = new Intent.OperationBuilder()

                    .withDeviceId("") .withBundleName("com.qibiao.harmonyosdemo") .withAbilityName("com.qibiao.harmonyosdemo.NewPage") .build();

            newpageIntent.setOperation(operation);

            //啟動目標頁面

            startAbility(newpageIntent);

        } });

}

這里會要求import新的包,以提供組件模塊,不然上面的代碼輸完是會標紅報錯的。需要引入的包:

import ohos.aafwk.content.Operation;

import ohos.agp.components.Button;

import ohos.agp.components.Component;

解析下代碼:

findComponentById通過id來找到按鈕組件,然后這個id對應的就是我們在布局文件中設置的:

ohos:id="$+id:button"

onClick對應按鈕的點擊事件,這個不是自定義函數,屬於事件觸發函數。

Intent上回說過了,它是一個中間件,協助當前頁面往新頁面通訊。

Operation operation = new Intent.OperationBuilder()

                    .withDeviceId("") .withBundleName("com.qibiao.harmonyosdemo") 
.withAbilityName("com.qibiao.harmonyosdemo.NewPage") .build();

這串代碼指定了我們要跳轉的目標頁面,需要指定目標的包名,還有Ability名稱(非slice)。

最后使用startAbility()接口啟動那個頁面。

(五)運行

再次運行查看效果(先開遠程虛擬設備,再點運行):

效果出來了,點擊右側的返回,還能回到主界面。

本篇完。下篇見。

作者:塗啟標
想了解更多內容,請訪問: 51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/

掃碼關注公眾號,【免費課程+一手資訊+福利掉落】,速來!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM