这是无量测试之道的第217篇原创
今天继续分享学习 HarmonyOS 系统,今天的分享将在HarmonyOS App开发之组件布局类的基础上,针对核心的代码进行一次优化。
首先,来看一看 HarmonyOS App开发之组件布局类 的核心处理逻辑代码(备注不同布局的相似代码忽略掉):
代码语言:javascript复制@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main); // 这里实际上是要去加载ability_main.xml 布局文件,这里在前面加上一个Layout_ 是系统要求这样做的,表明这是一个布局文件,布局文件详情在下面有详细列出。
Button btn_directional = (Button) findComponentById(ResourceTable.Id_directional_layout); // 这里实际上是在从ability_main.xml 文件中找id 为 directional_layout的元素,并强转为Button类型
if(btn_directional != null){ // 判断非null
btn_directional.setClickedListener(new Component.ClickedListener() { //给此id 元素设置监听事件
@Override
public void onClick(Component component) {
present(new DirectionalLayoutSlice(),new Intent()); // 当此id元素被点击时,就去渲染DirectionalLayoutSlice这个类对象,这里的Present()是用来实现不同的page(ability)内的跳转。
}
});
}
}
然后,来看一看优化后的代码,优化后的代码实际理解进来比之前较难懂一些,但是这种优化后的代码可以更好的处理页面元素有点击事件时的场景。
代码语言:javascript复制 @Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
setClickedListeners(this, // 调用下面的setClickedListeners()方法,可以接收多个components参数。
findComponentById(ResourceTable.Id_directional_layout),
findComponentById(ResourceTable.Id_dependent_layout),
findComponentById(ResourceTable.Id_stack_layout),
findComponentById(ResourceTable.Id_table_layout)
);
}
private void setClickedListeners(Component.ClickedListener clickListener, Component...components) { //设置点击事件
for (Component component : components) {
if (component == null) {
continue;
}
component.setClickedListener(clickListener); // 这里是在触发直接点击后的onClick()方法,方法体如下所示:
}
}
@Override
public void onClick(Component component) {
String className = "";
switch (component.getId()) { // 根据不同的组件ID来设置className 变量
case ResourceTable.Id_dependent_layout:
className = "com.huawei.codelab.slice.DependentLayoutSlice";
break;
case ResourceTable.Id_directional_layout:
className = "com.huawei.codelab.slice.DirectionalLayoutSlice";
break;
case ResourceTable.Id_stack_layout:
className = "com.huawei.codelab.slice.StackLayoutSlice";
break;
case ResourceTable.Id_table_layout:
className = "com.huawei.codelab.slice.TableLayoutSlice";
break;
default:
break;
}
abilitySliceJump(className); //通过abilitySliceJump()方法传入不同的className来进行页面的跳转。
}
private void abilitySliceJump(String name) {
if (name == null || "".equals(name)) {
return;
}
try {
Class abilitySliceClass = Class.forName(name);
Object object = abilitySliceClass.newInstance();
if (object instanceof AbilitySlice) {
present((AbilitySlice) object, new Intent());
}
} catch (ReflectiveOperationException e) {
new ToastDialog(getContext()).setText("This is an Error!").show(); // 这里还引入了Toast提示框,它弹出一个小信息,作为提醒或消息反馈来用,一般用来显示操作结果,或者应用状态的改变。
}
}
最后,再来验证一下是否运行正常,运行结果如下所示:
小结:
这里就不再展示每一个布局组件了,通过优化后我们的布局组件能够正常跳转页面,这样在后面如果我们要添加新的元素进来,只需要做简单的代码改动即可,不用再像HarmonyOS App开发之组件布局类那样重复性的编写类似的代码。
end