当前位置: 首页 > 科技观察

学习笔记-在HarmonyOS页面之间跳转

时间:2023-03-18 15:53:43 科技观察

更多信息请访问:https://harmonyos.51cto.com,与华为官方共同建立的HarmonyOS技术社区前言大家好,我又回来了。又到了学习一周的时间了。然后我们在过去几周谈到了harmonyOS中的分布式能力。可能比较难学,所以这周找了一个比较简单的来学,这就是页面间的跳转。向上。虽然这与分布式能力无关,也比较简单,但不代表它不重要。这种能力基本上涉及到所有的应用。如果学好这一点,也可以为我们以后的应用开发打下基础。一个很好的基础。那么就开始我们本周的西游吧!说到页面跳转,就不得不提能力。能力是应用程序能力的抽象。一个应用程序可以有多个能力(也就是说,它可以包含多个Abilities)。PageAbility可用于提供与用户交互的能力。一个Page可以由一个或多个AbilitySlices组成。什么是AbilitySlice?AbilitySlice可以用来实现一个页面的逻辑。创建项目仍然和往常一样,创建一个名为MyJump的移动应用程序。一个页面包含多个AbilitySlice设置UI界面。在图形目录中添加一个background_button文件。该文件可用于设置按钮的背景。接下来,将名为ability_second的文件添加到布局目录。跳跃动作的实现接下来我们在Slice目录下添加一个类,命名为SecondAbilitySlicepackagecom.example.myjump.slice;importcom.example.myjump.ResourceTable;importohos.aafwk.ability。能力;importohos.aafwk.content.Intent;publicclassSecondAbilitySlice扩展AbilitySlice{@OverrideprotectedvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_second);}@OverrideprotectedvoidonActive(){superactiveverideon();proreect}.on(Intentintent){super.onForeground(intent);}}接下来就是在MainAbilitySlice中写代码,让点击按钮可以跳转到SecondAbilitySliceButtonbuttonsecond=(Button)findComponentById(ResourceTable.Id_page1);buttonsecond.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){Intentintent1=newIntent();present(newSecondAbilitySlice(),intent1);//跳转到其他页面}});然后跳转到SecondAbilitySlice,总有一个按钮跳回原页面,那么接下来我们就写代码,点击按钮可以销毁当前页面,返回MainAbilitySlice。Buttonbutton=(Button)findComponentById(ResourceTable.Id_button_second);button.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){terminate();//销毁当前页面}});然后有人说,这个页面的数据也想带到那个页面怎么办。不要惊慌,这不是什么大问题。接下来我们来解决携带数据的问题。在执行跳转动作之前,我们可以将数据以键值对的形式存储在网络(intent)中,让它跳转到另一个页面。intent1.setParam("key","theabilityissame!");//将数据存放在intent中,让其作为形参传递给另一个页面,然后在SecondAbilitySlice中定义一个输出控制台,输出intent携带的数据在里面,然后在onStart中输出相应的数据。HiLog.info(TAG,intent.getStringParam("key"));//用于输出intent中携带的key对应的数据如何带回被销毁页面的数据?还是一样的方法?.那个方法也挺眼熟的,也是把数据写入intent,然后调用setResult函数,再把intent传给函数。点击函数中的代码如下:Intentintent1=newIntent();intent1.setParam("second","我是SecondAbility!");setResult(intent1);terminate();//销毁当前页面然后这个setResult()函数有什么用?调用该函数后,会在MainAbilitySlice中调用onResult()函数。同时,我们要把用于页面跳转的present()函数改成presentForResult()函数。这个函数中多了一个请求码的参数,请求码用来标识某个请求,也就是区分页面销毁后返回哪个页面,请求码是一个非负整数,我们定义请求码为0,然后调用presentForResult函数。presentForResult(newSecondAbilitySlice(),intent1,request_code);//跳转到其他页面在onResult()函数中,会传递两个参数,一个是网络resultIntent,一个是请求码requestCode,用于区分销毁后返回哪个页面。比如我们刚才用presentForResult跳转到SecondAbilitySlice时使用的requestcode是0,那么SecondAbilitySlice返回的requestcode就是0。如何重写onResult,代码如下:@OverrideprotectedvoidonResult(intrequestCode,IntentresultIntent){super.onResult(requestCode,resultIntent);//这个requestCode可以用来区分是哪个页面返回了数据,我们刚才传递的请求码是0,则SecondAbilitySlice返回的requestcode为0if(resultIntent!=null&&requestCode==request_code){HiLog.info(TAG,resultIntent.getStringParam("second"));}}然后再次运行程序,与程序的区别刚才是输出平台会输出下面两句:第一句是在MainAbilitySlice上点击按钮跳转到SecondAbilitySlice时在SecondAbilitySlice中输出的,第二句是在SecondAbilitySlice上点击按钮时在MainAbilitySlice中输出的返回。一个页面包含一个AbilitySlice。在com.example.myjump目录下新建一个页面能力,命名为ThirdAbility。在ability_third设置界面编写跳转动作在MainAbilitySlice中编写代码,点击按钮跳转到ThirdAbilitySlice先构建Intent.OperationBuilder实例,然后链式调用withDeviceId、withBundleName、withAbilityName,构建。Buttonbuttonthird=(Button)findComponentById(ResourceTable.Id_page2);buttonthird.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){Intentintent1=newIntent();Operationoperation=newIntent.OperationBuilder()//构建一个Intent.OperationBuilder实例.withDeviceId("").withBundleName(getBundleName()).withAbilityName(ThirdAbility.class.getName()).build();intent1.setOperation(operation);startAbility(intent1);}});需要在ThirdAbilitySlice中编写代码,点击返回按钮销毁当前页面,销毁ThirdAbilitySlice,返回MainAbilitySlice。那么有人认为刚才用terminate函数还不行,那这个就大错特错了,一个Ability下不同的AbilitySlices这样破坏页面,但是在不同的Abilities下,需要调用terminateAbility函数,那么我们就调用这个点击事件中的函数。Buttonbutton=(Button)findComponentById(ResourceTable.Id_button_third);button.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){terminateAbility();}});运行它以查看结果。解决携带数据的问题,首先,如何将MainAbilitySlice的数据携带到ThirdAbilitySlice?还是和之前一样,将数据以键值对的形式写入intent中,使用同样的方法setParam。intent1.setParam("key","theabilityisdifferent!");接下来还是老样子,在ThirdAbilitySlice中定义一个输出控制台,然后在onStart中输出intent携带的数据。同样,我们将实现销毁页面后如何将数据带入MainAbility。然后我们还是把数据写入到intent中,然后调用getAbility().setResult(),这个函数里面有两个参数,第二个是intent,第一个是一个responsecode,这个responsecode是用来识别一个一定有反应,作用类似于刚才的识别码。这里我们定义一个响应码为1,然后调用函数。最后调用terminAbility函数销毁页面。HiLog.info(TAG,intent.getStringParam("key"));//用于输出intent中携带的key对应的数据Buttonbutton=(Button)findComponentById(ResourceTable.Id_button_third);button.setClickedListener(newComponent.ClickedListener(){@OverridepublicvoidonClick(Componentcomponent){Intentintent1=newIntent();intent1.setParam("third","我来自ThirdAbility!");getAbility().setResult(resultCode,intent1);terminateAbility();}});这样,我们就完成了页面的销毁。接下来我们需要在MainAbilitySlice中接受页面销毁带来的数据。同样的方法,将startAbility()改为startAbilityForResult(),然后在参数中添加响应码。然后重写onAbilityResult函数。当页面被销毁时,会自动调用这个函数,然后我们就可以在这个函数中接收数据了。这个函数中会有三个参数,第一个参数是requestcode,就是我们在MainAbilitySlice中第一次跳转到ThirdAbilitySlice时的参数,第二个是responsecode,就是我们刚才在getAbility().setResult中做的()中设置的参数,最后一个是intent,数据也在这里面。@OverrideprotectedvoidonAbilityResult(intrequestCode,intresultCode,IntentresultData){super.onAbilityResult(requestCode,resultCode,resultData);如果(requestCode==request_code&&resultCode==result_code&&resultData!=null){HiLog.info(TAG,resultData.getStringParam("third"));}}那我们来看看运行效果吧!第一句是点击“跳转到ThirdAbility”按钮跳转到ThirdAbilitySlice页面时输出的,第二句是点击返回按钮销毁页面返回MainAbilitySlice时输出的。结论的源码我会放在附件里。有需要的可以自行下载学习。有什么不懂的可以私信我或者学习源码。https://harmonyos.51cto.com/resource/1251更多信息请访问:与华为共同建立的Harmonyos技术社区https://harmonyos.51cto.com

最新推荐
猜你喜欢