HarmonyOS基礎(chǔ)之Fraction用法介紹
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
前言
Fraction字面意思為分?jǐn)?shù)、極小一部分,在Ability或者AbilitySlice中它實(shí)際也是頁(yè)面的一部分,不能單獨(dú)使用。Fraction的生命周期狀態(tài)取決于它的容器,如果容器被銷毀,其中的所有部分也將被銷毀。我們可以使用Fraction定義各種布局,以豐富應(yīng)用程序的用戶界面。下面就向大家介紹一下Fraction的具體用法以及其生命周期。
Fraction使用
首先想要使用Fraction,我們必須讓Ability繼承FractionAbility。
- public class FractionAbility extends Ability {
- public FractionAbility() {
- throw new RuntimeException("Stub!");
- }
- public FractionManager getFractionManager() {
- throw new RuntimeException("Stub!");
- }
- ...
- }
為什么一定需要繼承FractionAbility,通過(guò)FractionAbility源碼我們可以看出其內(nèi)部提供了getFractionManager()方法,該方法返回的FractionManager是管理Fraction的生命周期的關(guān)鍵方法。
那么下面就讓我們來(lái)簡(jiǎn)單使用一下Fraction。
首先我們創(chuàng)建一個(gè)layout,為Fraction的布局文件fraction_first.xml。
- <?xml version="1.0" encoding="utf-8"?>
- <DependentLayout
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:height="match_parent"
- ohos:width="match_parent">
- <Text
- ohos:text_size="25fp"
- ohos:center_in_parent="true"
- ohos:text="First Fraction"
- ohos:height="match_content"
- ohos:width="match_content"/>
- </DependentLayout>
布局文件創(chuàng)建完成后我們?cè)賮?lái)新建一個(gè)類TestFraction繼承Fraction。
- public class TestFraction extends Fraction {
- @Override
- protected Component onComponentAttached(LayoutScatter scatter, ComponentContainer container, Intent intent) {
- Component component = scatter.parse(ResourceTable.Layout_fraction_first,
- container, false);
- return component;
- }
- }
就這樣一個(gè)簡(jiǎn)單的Fraction就創(chuàng)建好了,接下來(lái)就是將它添加到Ability中,布局文件ability_test_fraction.xml。
- <?xml version="1.0" encoding="utf-8"?>
- <DirectionalLayout
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:alignment="center"
- ohos:orientation="vertical">
- <StackLayout
- ohos:id="$+id:fraction_container"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:bottom_margin="45vp">
- </StackLayout>
- </DirectionalLayout>
TestFractionAbility繼承FractionAbility。
- public class TestFractionAbility extends FractionAbility {
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- super.setUIContent(ResourceTable.Layout_ability_test_fraction);
- FractionManager fractionManager = getFractionManager();
- fractionManager.startFractionScheduler().add(ResourceTable.Id_fraction_container, new TestFraction()).submit();
- }
- }
就這樣,TestFraction就成功的被添加到了Ability中,ability_test_fraction.xml中的fraction_container就是放置TestFraction的容器,在摸機(jī)器運(yùn)行效果如下:
FractionManager方法探索
我們已經(jīng)學(xué)習(xí)了Fraction的簡(jiǎn)單用法,下面再來(lái)研究下對(duì)Fraction管理的關(guān)鍵類FractionManager。
- public class FractionManager {
- FractionManager() {
- throw new RuntimeException("Stub!");
- }
- public FractionScheduler startFractionScheduler() {
- throw new RuntimeException("Stub!");
- }
- public void popFromStack() {
- throw new RuntimeException("Stub!");
- }
- public void popFromStack(String tag, int flags) {
- throw new RuntimeException("Stub!");
- }
- public Optional<Fraction> getFractionByTag(String tag) {
- throw new RuntimeException("Stub!");
- }
- }
這里有startFractionScheduler(),popFromStack(),popFromStack(String tag, int flags),getFractionByTag(String tag)四個(gè)方法。
getFractionByTag(String tag)方法很明顯就是通過(guò)tag獲取已添加的Fraction,那么popFromStack()方法的作用是什么呢?
為了研究該方法的用途,我們先來(lái)看下看下startFractionScheduler(),該方法返回了FractionScheduler對(duì)象Fraction調(diào)度器,字面理解應(yīng)該就是
Fraction的管理器,下面來(lái)看下FractionScheduler提供了哪些方法管理Fraction。
- public abstract class FractionScheduler {
- public FractionScheduler() {
- throw new RuntimeException("Stub!");
- }
- public abstract FractionScheduler add(int var1, Fraction var2);
- public abstract FractionScheduler add(int var1, Fraction var2, String var3);
- public abstract FractionScheduler replace(int var1, Fraction var2);
- public abstract FractionScheduler remove(Fraction var1);
- public abstract FractionScheduler hide(Fraction var1);
- public abstract FractionScheduler show(Fraction var1);
- public abstract int submit();
- public abstract FractionScheduler pushIntoStack(String var1);
- }
這里通過(guò)代碼我們可以很直觀的看出FractionScheduler是個(gè)抽象類,里面提供了對(duì)Fraction的添加,替換,移除,展示的方法,并且最終通過(guò)submit()方法提交操作。
其中有個(gè)很特別的方法pushIntoStack(String var1),這個(gè)方法具體是做什么的呢,結(jié)合上文我們發(fā)現(xiàn)它是與popFromStack()方法配合使用的,一個(gè)添加一個(gè)移除。
下面我們就寫(xiě)個(gè)簡(jiǎn)單的示例演示下該方法的使用。
- fractionManager = getFractionManager();
- fractionManager.startFractionScheduler().add(ResourceTable.Id_fraction_container, new TestFraction()).pushIntoStack("1").submit();
- fractionManager.startFractionScheduler().add(ResourceTable.Id_fraction_container, new FirstFraction()).pushIntoStack("2").submit();
- fractionManager.startFractionScheduler().add(ResourceTable.Id_fraction_container, new SecondFraction()).pushIntoStack("3").submit();
- fun1.setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- System.out.println("fractionManager.popFromStack()");
- fractionManager.popFromStack();
- }
- });
- fun2.setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- System.out.println("fractionManager.popFromStack(\"\",1)");
- fractionManager.popFromStack("2",1);
- }
- });
往同一個(gè)容器中添加三個(gè)Fraction,并且都使用pushIntoStack(“”)方法將Fraction添加到堆棧中,先來(lái)看popFromStack()調(diào)用效果。
可以看出SecondFraction,F(xiàn)irstFraction,TestFraction依次被移除
重新運(yùn)行項(xiàng)目,我們?cè)谡{(diào)用popFromStack(String tag, int flags)方法,將tag設(shè)置為"2",FirstFraction查看運(yùn)行效果。
SecondFraction,F(xiàn)irstFraction同時(shí)被移除了
通過(guò)實(shí)踐可以看出popFromStack()每次調(diào)用會(huì)移除堆棧頂部的Fraction,popFromStack(String tag, int flags)則會(huì)移除tag以及其上層所有Fraction。
了解了具體作用,在今后我們的開(kāi)發(fā)場(chǎng)景中可以根據(jù)需求對(duì)Fraction進(jìn)行管理。
Fraction的生命周期
研究了Fraction的具體用法,下面我們就來(lái)探索一下Fraction在Ability中的生命周期情況。
Fraction生命周期主要涉及到八個(gè)方法,分別是onComponentAttached、onStart、onActive、onInactive、onBackground、onForeground、onStop、onComponentDetach。
我們?cè)诿總€(gè)方法中添加日志運(yùn)行程序查看生命周期具體情況。
啟動(dòng)Fraction

依次調(diào)用onComponentAttached、onStart、onActive方法
按下home進(jìn)入后臺(tái)

依次調(diào)用onInactive、onBackground方法
返回前臺(tái)

依次調(diào)用onForeground、onActive方法
退出應(yīng)用

依次調(diào)用onInactive、onBackground、onStop、onComponentDetach方法
總結(jié):
通過(guò)本次學(xué)習(xí),我們了解了Fraction的基本用法,F(xiàn)raction所涉及到的關(guān)鍵類以及其中開(kāi)放的關(guān)鍵方法,最后還探索了Fraction的生命周期,當(dāng)然 Fraction 也有缺陷 在實(shí)際開(kāi)發(fā)中,我們可能需要讓Fraction嵌套Fraction,目前鴻蒙還不支持Fraction嵌套Fraction。所以在使用過(guò)程中我們要避免Fraction嵌套走彎路。
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)