HarmonyOS基础之Fraction用法介绍

Fraction字面意思为分数、极小一部分,在Ability或者AbilitySlice中它实际也是
首页 新闻资讯 行业资讯 HarmonyOS基础之Fraction用法介绍

[[424094]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

前言

Fraction字面意思为分数、极小一部分,在Ability或者AbilitySlice中它实际也是页面的一部分,不能单独使用。Fraction的生命周期状态取决于它的容器,如果容器被销毁,其中的所有部分也将被销毁。我们可以使用Fraction定义各种布局,以丰富应用程序的用户界面。下面就向大家介绍一下Fraction的具体用法以及其生命周期。

Fraction使用

首先想要使用Fraction,我们必须让Ability继承FractionAbility。

复制

public class FractionAbility extends Ability {     public FractionAbility() {         throw new RuntimeException("Stub!");     }      public FractionManager getFractionManager() {         throw new RuntimeException("Stub!");     }      ... }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

为什么一定需要继承FractionAbility,通过FractionAbility源码我们可以看出其内部提供了getFractionManager()方法,该方法返回的FractionManager是管理Fraction的生命周期的关键方法。

那么下面就让我们来简单使用一下Fraction。

首先我们创建一个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>
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

 布局文件创建完成后我们再来新建一个类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;     } }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

就这样一个简单的Fraction就创建好了,接下来就是将它添加到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>
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

 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();     } }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

 就这样,TestFraction就成功的被添加到了Ability中,ability_test_fraction.xml中的fraction_container就是放置TestFraction的容器,在摸机器运行效果如下:

FractionManager方法探索

我们已经学习了Fraction的简单用法,下面再来研究下对Fraction管理的关键类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!");     } }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

这里有startFractionScheduler(),popFromStack(),popFromStack(String tag, int  flags),getFractionByTag(String tag)四个方法。

getFractionByTag(String  tag)方法很明显就是通过tag获取已添加的Fraction,那么popFromStack()方法的作用是什么呢?

为了研究该方法的用途,我们先来看下看下startFractionScheduler(),该方法返回了FractionScheduler对象Fraction调度器,字面理解应该就是

Fraction的管理器,下面来看下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); }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

这里通过代码我们可以很直观的看出FractionScheduler是个抽象类,里面提供了对Fraction的添加,替换,移除,展示的方法,并且最终通过submit()方法提交操作。

其中有个很特别的方法pushIntoStack(String  var1),这个方法具体是做什么的呢,结合上文我们发现它是与popFromStack()方法配合使用的,一个添加一个移除。

下面我们就写个简单的示例演示下该方法的使用。

复制

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);     } });
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

往同一个容器中添加三个Fraction,并且都使用pushIntoStack(“”)方法将Fraction添加到堆栈中,先来看popFromStack()调用效果。

可以看出SecondFraction,FirstFraction,TestFraction依次被移除

重新运行项目,我们在调用popFromStack(String tag, int  flags)方法,将tag设置为"2",FirstFraction查看运行效果。

SecondFraction,FirstFraction同时被移除了

通过实践可以看出popFromStack()每次调用会移除堆栈顶部的Fraction,popFromStack(String tag, int  flags)则会移除tag以及其上层所有Fraction。

了解了具体作用,在今后我们的开发场景中可以根据需求对Fraction进行管理。

Fraction的生命周期

研究了Fraction的具体用法,下面我们就来探索一下Fraction在Ability中的生命周期情况。

Fraction生命周期主要涉及到八个方法,分别是onComponentAttached、onStart、onActive、onInactive、onBackground、onForeground、onStop、onComponentDetach。

我们在每个方法中添加日志运行程序查看生命周期具体情况。

启动Fraction

HarmonyOS基础之Fraction用法介绍-鸿蒙HarmonyOS技术社区

依次调用onComponentAttached、onStart、onActive方法

按下home进入后台

HarmonyOS基础之Fraction用法介绍-鸿蒙HarmonyOS技术社区

依次调用onInactive、onBackground方法

返回前台

HarmonyOS基础之Fraction用法介绍-鸿蒙HarmonyOS技术社区

依次调用onForeground、onActive方法

退出应用

HarmonyOS基础之Fraction用法介绍-鸿蒙HarmonyOS技术社区

依次调用onInactive、onBackground、onStop、onComponentDetach方法

总结:

通过本次学习,我们了解了Fraction的基本用法,Fraction所涉及到的关键类以及其中开放的关键方法,最后还探索了Fraction的生命周期,当然  Fraction 也有缺陷  在实际开发中,我们可能需要让Fraction嵌套Fraction,目前鸿蒙还不支持Fraction嵌套Fraction。所以在使用过程中我们要避免Fraction嵌套走弯路。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

26    2021-09-16 10:05:09    鸿蒙 HarmonyOS 应用