专栏名称: 51CTO技术栈
有趣 | 有料 | 有内涵,为您提供最优质的内容,愿我们一起悦享技术,成就人生。
目录
相关文章推荐
程序员的那些事  ·  趣图:纯种牛马求聘用 ·  2 天前  
码农翻身  ·  11w*14薪,进DeepSeek了! ·  2 天前  
程序员小灰  ·  蔚来汽车裁员约10%,20分钟完成裁员。。。 ·  5 天前  
51好读  ›  专栏  ›  51CTO技术栈

鸿蒙系统中如何实现页面间跳转?

51CTO技术栈  · 公众号  · 程序员  · 2020-12-31 18:05

正文


01

认识 Intent


Intent 是对象之间传递信息的载体。


例如,当一个  Ability 需要启动另一个 Ability 时,或者一个 AbilitySlice 需要导航到另一个 AbilitySlice 时,可以通过 Intent 指定启动的目标同时携带相关数据。


Intent 的构成元素包括 Operation 与 Parameters:

02

了解 AbilitySlice 路由配置


虽然一个 Page 可以包含多个 AbilitySlice,但是 Page 进入前台时界面默认只展示一个 AbilitySlice。


默认展示的 AbilitySlice 是通过 setMainRoute() 方法来指定的。


当有多个需要展示的 AbilitySlice,可以通过 addActionRoute() 方法为 MainAbilitySlice 以外的 AbilitySlice 配置路由规则。


此时,当其他 Page 实例期望导航到这些 AbilitySlice 时,可以通过 AbilitySlice 之间的跳转,显示出这张页面。
public class MyAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // set the main route
        setMainRoute(MainSlice.class.getName());

        // set the action route
         addActionRoute("action.pay", PaySlice.class.getName());
        addActionRoute("action.scan", ScanSlice.class.getName());
    }
}

addActionRoute() 方法中使用的动作命名,需要在应用配置文件 (config.json) 中注册:
{
    "module": {
        "abilities": [
            {
                "skills":[
                    {
                        "actions":[
                            "action.pay",
                            "action.scan"
                        ]
                    }
                ]
                ...
            }
        ]
        ...
    }
    ...
}


03

同一个 Page 里跳转


同一个 Page 里的 AbilitySlice1 与 AbilitySlice2 间的跳转(无参,带参,回值)。


①无参数跳转


@Override
public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_main);

    Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld);
    text.setClickedListener(component->{
        Intent intent1 = new Intent();
        present(new MainAbilitySlice1(),intent1);
    });
}

②带参数跳转


产生参数端的 AbilitySlice:
@Override
public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_main);

    Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld);
    text.setClickedListener(component->{
        //有参数跳转
        Intent intent1 = new Intent();
        intent1.setParam("user","钟发发");
        present(new MainAbilitySlice1(),intent1);
    });
}

接收参数端的 AbilitySlice:
public class MainAbilitySlice1 extends AbilitySlice {
    Text text;
    String oldText;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main1);
        text = (Text) findComponentById(ResourceTable.Id_text_helloworld1);
        if(intent != null){
            String user = intent.getStringParam("user");
            oldText = text.getText();
            text.append("," + user);
        }
    }
    @Override
    protected void onInactive() {
        super.onInactive();
    }
....
}


③带参数跳转+返回值


参数产生端:
public class MainAbilitySlice extends AbilitySlice {
    @Override
    public void






请到「今天看啥」查看全文


推荐文章
程序员的那些事  ·  趣图:纯种牛马求聘用
2 天前
码农翻身  ·  11w*14薪,进DeepSeek了!
2 天前
安利云学堂  ·  七分打扮三分长相,你做到几分?
8 年前
摄影图录  ·  2016年CNN年度图片精选
8 年前
政事儿  ·  李小鹏部长的“首次大考”
8 年前
中草药杂志社  ·  茜草的研究进展
7 年前