HarmonyOS fraction跳转Ability/AbilitySlice问题

fraction是鸿蒙里面一个类似Android的fragment的一个组件,具体如何使用可参考这篇文章https://blog.csdn.net/xq610928/article/details/114435014

Android中fragment是可以跳到Activity,鸿蒙的fraction也有类似的效果跳到Ability,实际上是跳到Page Ability的主AbilitySlice。鸿蒙的Ability分为三大类Page Ability、Service Ability、Data Ability,Page Ability是FA唯一支持的模板,用于提供与用户交互的能力,由一个或多个AbilitySlice组成。所以Fraction跳到Ability,实际上是跳到Ability默认的主路由上(AbilitySlice)。

下面介绍跳转到不同Page Ability(默认路由) 和相同Page Ability 的其他路由(AbilitySlice) 的方法:

一、跳转到不同的Page Ability:

创建一个Page Ability 

Operation operation =
    new Intent.OperationBuilder()
            .withBundleName("包名")
            .withAbilityName("类名")
            .build();
intent.setOperation(operation);

以上代码即可从Fraction跳至不同Page Ability,打开的界面则是该Page Ability的默认路由的界面

若需跳到不同的Page Ability的副路由(AbilitySlice),则只需加入.withAction("action.detail")即可,action.detail为confi.json配置文件中所配置Action名称,具体步骤参看下面的操作。注意:Page Ability需要对应好,下面步骤1的name应该是需要跳转的Page Ability。

二、跳至与Fraction在同一个Page Ability中的AbilitySlice

跳转步骤如下:

1. 在config.json配置文件中配置

 在actions中添加"action.detail" ,name为fraction所在的Page Ability

2. 在Ability(步骤1中name指向的Ability)的onStart方法中配置副路由,指向所需AbilitySlice

addActionRoute("action.detail", NewsdetailAbilitySlice.class.getName());

action.detail 为步骤1所配置的action名称,NewsdetailAbilitySlice.class.getName()则是需要跳转的AbilitySlice

3. 调用

Intent intent = new Intent();
Operation operation =
    new Intent.OperationBuilder()
        .withBundleName(getBundleName())
        .withAbilityName(MainAbility.class.getName())
        .withAction("action.detail")
        .build();
intent.setOperation(operation);

.withAbilityName(MainAbility.class.getName())为所在的Page Ability

.withAction("action.detail")为步骤1配置的action名称

这样就可以实现fraction跳转AbilitySlice

补充:AbilitySlice如何关闭(finish)

直接调用terminate()方法,即可关闭AbilitySlice
1. 编程:建立一个分数类。分数类的数据成员包括分子和分母,成员函数包括显示、输入、约分、通分、比较、加、减、乘、除、求相反数。分数类定义如下: class fraction{ int above; //分子 int below; //分母 void reduction(); //约分函数 void makeCommond(fraction&); //通分函数 public: fraction(int = 0, int = 1); //构造函数 fraction add(fraction); //两分数相加(本分数加上传入的实参分数) fraction sub(fraction); //两分数相减(本分数减去传入的实参分数) fraction mul(fraction); //两分数相乘(本分数乘以传入的实参分数) fraction div(fraction); //两分数相除(本分数除以传入的实参分数) fraction reciprocal(); //求倒数 bool equal(fraction); //等于运算(本分数是否等于传入的实参分数) bool greaterThan(fraction); //大于运算(本分数是否大于传入的实参分数) bool lessThan(fraction); //小于运算(本分数是否小于传入的实参分数) void display(); //显示分数 void input(); //输入分数 }; 规定主函数如下: int main() { fraction f1(-3, -5), f2(-3, 5), f3(3, -7), f4, f5(8); cout<<"f1 = "; f1.display(); cout<<"f2 = "; f2.display(); cout<<"f3 = "; f3.display(); cout<<"f4 = "; f4.display(); cout<<"f5 = "; f5.display(); if (f1.greaterThan(f2)) cout<<"f1 > f2"<<endl; if (f2.lessThan(f3)) cout<<"f2 < f3"<<endl; if (f1.equal(f1)) cout<<"f1 == f1"<<endl; f4 = f1.add(f3); cout<<"f4 = f1+f3 = "; f4.display(); f4 = f1.sub(f2); cout<<"f4 = f1-f2 = "; f4.display(); f4 = f1.mul(f3); cout<<"f4 = f1*f3 = "; f4.display(); f4 = f2.div(f3); cout<<"f4 = f2/f3 = "; f4.display(); f4 = f2.reciprocal(); cout<<"f4 = 1/f2 = "; f4.display(); f4.input(); cout<<"f4 = "; f4.display(); return 0; } 要求: (1)完成所有成员函数,并用上述主函数验证是否达到设计要求,理解为何将约分函数reduction()和通分函数makeCommond(fraction)设计为分数类的私有成员函数而非公有成员; (2)自行编写约分函数reduction()和通分函数makeCommond(fraction),可自己设计,也可参考其它资料。
06-08
以下是分数类的代码实现: ``` #include<iostream> using namespace std; class fraction{ private: int above; //分子 int below; //分母 void reduction(); //约分函数 void makeCommond(fraction&); //通分函数 public: fraction(int a = 0, int b = 1){ //构造函数 above = a; below = b; reduction(); } fraction add(fraction); //两分数相加(本分数加上传入的实参分数) fraction sub(fraction); //两分数相减(本分数减去传入的实参分数) fraction mul(fraction); //两分数相乘(本分数乘以传入的实参分数) fraction div(fraction); //两分数相除(本分数除以传入的实参分数) fraction reciprocal(); //求倒数 bool equal(fraction); //等于运算(本分数是否等于传入的实参分数) bool greaterThan(fraction); //大于运算(本分数是否大于传入的实参分数) bool lessThan(fraction); //小于运算(本分数是否小于传入的实参分数) void display(); //显示分数 void input(); //输入分数 }; // 约分函数 void fraction::reduction(){ if (above == 0) { // 特殊情况:分子为0 below = 1; return; } int a = above; int b = below; int r; // 最大公约数 while(b != 0){ r = a % b; a = b; b = r; } above /= a; below /= a; if(below < 0){ // 分母为负数时,将负号移到分子上 above *= -1; below *= -1; } } // 通分函数 void fraction::makeCommond(fraction& f){ int temp = f.below; f.below = below * f.below; above *= temp; f.above *= below; reduction(); f.reduction(); } // 两分数相加 fraction fraction::add(fraction f){ fraction temp(above, below); temp.makeCommond(f); temp.above += f.above; temp.reduction(); return temp; } // 两分数相减 fraction fraction::sub(fraction f){ fraction temp(above, below); temp.makeCommond(f); temp.above -= f.above; temp.reduction(); return temp; } // 两分数相乘 fraction fraction::mul(fraction f){ fraction temp(above * f.above, below * f.below); temp.reduction(); return temp; } // 两分数相除 fraction fraction::div(fraction f){ fraction temp(above * f.below, below * f.above); temp.reduction(); return temp; } // 求倒数 fraction fraction::reciprocal(){ if(above == 0){ cout << "分数为0,无法求倒数!" << endl; exit(0); } fraction temp(below, above); return temp; } // 等于运算 bool fraction::equal(fraction f){ makeCommond(f); return (above == f.above && below == f.below); } // 大于运算 bool fraction::greaterThan(fraction f){ makeCommond(f); return above > f.above; } // 小于运算 bool fraction::lessThan(fraction f){ makeCommond(f); return above < f.above; } // 显示分数 void fraction::display(){ cout << above << "/" << below << endl; } // 输入分数 void fraction::input(){ cout << "请输入分数的分子和分母,用空格隔开:" << endl; cin >> above >> below; reduction(); } int main() { fraction f1(-3, -5), f2(-3, 5), f3(3, -7), f4, f5(8); cout<<"f1 = "; f1.display(); cout<<"f2 = "; f2.display(); cout<<"f3 = "; f3.display(); cout<<"f4 = "; f4.display(); cout<<"f5 = "; f5.display(); if (f1.greaterThan(f2)) cout<<"f1 > f2"<<endl; if (f2.lessThan(f3)) cout<<"f2 < f3"<<endl; if (f1.equal(f1)) cout<<"f1 == f1"<<endl; f4 = f1.add(f3); cout<<"f4 = f1+f3 = "; f4.display(); f4 = f1.sub(f2); cout<<"f4 = f1-f2 = "; f4.display(); f4 = f1.mul(f3); cout<<"f4 = f1*f3 = "; f4.display(); f4 = f2.div(f3); cout<<"f4 = f2/f3 = "; f4.display(); f4 = f2.reciprocal(); cout<<"f4 = 1/f2 = "; f4.display(); f4.input(); cout<<"f4 = "; f4.display(); return 0; } ``` 在分数类中,将约分函数和通分函数设计为私有成员函数,是因为这两个函数只能在类内部使用,而不需要供外部调用。此外,约分和通分可以看做是对分数的基本操作,因此将其作为私有成员函数可以增强类的封装性。 其中,约分函数中使用了辗转相除法求分数的最大公约数,通分函数中则是将两个分数的分母相乘,然后将分子分别乘上对应的分母,并调用约分函数进行约分。 在主函数中,我们创建了五个分数对象,并使用分数类的成员函数进行加减乘除等运算,最后输出结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值