HarmonyOS 鸿蒙Next中present跳转返回后,点击事件不响应
HarmonyOS 鸿蒙Next中present跳转返回后,点击事件不响应 A AbilitySlice中有一个button设置了点击事件,点击后通过present跳转到新的B AbilitySlice,然后按返回键回到A AbilitySlice,再次点击button,没有事件响应。这是怎么回事,要怎么处理?难道每次返回后,都要重新setUIContent,设置button的点击事件?
@Override public void onStart(Intent intent) { super.onStart(intent); KLog.d(“onStart”); ComponentContainer rootComponent =(ComponentContainer) LayoutScatter.getInstance(this).parse(ResourceTable.Layout_main_layout, null, false); setUIContent(rootComponent); initView(); }
onStart方法里由原先的setUIContent(ResourceTable.Layout_main_layout);
改为
ComponentContainer rootComponent =(ComponentContainer) LayoutScatter.getInstance(this).parse(ResourceTable.Layout_main_layout, null, false); setUIContent(rootComponent); 就没问题了,这是啥情况…
更多关于HarmonyOS 鸿蒙Next中present跳转返回后,点击事件不响应的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
我也遇到这个问题,用present跳转。E/AGP: can not find focus
期待HarmonyOS能继续优化多屏协同功能,让跨设备体验更加完美。
我测的情况,返回后button对象都是null了,难道页面组件要全部重新初始化一次
有人遇到同样的问题吗?
或者贴下代码也是可以的,帮助快速定位哦~~~
代码如下,麻烦看下是什么问题,谢了 : )
MainAbilitySlice.java
package cn.kf156.testapp.slice;
import cn.kf156.testapp.ResourceTable;
import cn.kf156.testapp.SecondAbility;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.Operation;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
public class MainAbilitySlice extends AbilitySlice {
private Button button;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
System.out.println("onStart");
setUIContent(ResourceTable.Layout_main_layout);
initView();
}
private void initView() {
button = (Button) findComponentById(ResourceTable.Id_button);
System.out.println("button " + (button != null));
if (button != null) {
// 为按钮设置点击回调
button.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
System.out.println("button.onClick");
// startAbility();
present(new SecondAbilitySlice(), new Intent());
}
});
}
}
private void startAbility() {
Intent secondIntent = new Intent();
// 指定待启动FA的bundleName和abilityName
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
.withBundleName(getBundleName())
.withAbilityName(SecondAbility.class.getName())
.build();
secondIntent.setOperation(operation);
startAbility(secondIntent); // 通过AbilitySlice的startAbility接口实现启动另一个页面
}
@Override
public void onActive() {
super.onActive();
System.out.println("onActive");
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
System.out.println("onForeground");
}
}
main_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<DependentLayout xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:width="match_parent"
ohos:height="match_parent"
ohos:background_element="#000000">
<Text
ohos:id="$+id:text"
ohos:width="match_content"
ohos:height="match_content"
ohos:center_in_parent="true"
ohos:text="Hello World"
ohos:text_color="white"
ohos:text_size="32fp"/>
<Button
ohos:id="$+id:button"
ohos:width="match_content"
ohos:height="match_content"
ohos:text_size="19fp"
ohos:text="Next"
ohos:top_padding="8vp"
ohos:bottom_padding="8vp"
ohos:left_padding="80vp"
ohos:right_padding="80vp"
ohos:text_color="white"
ohos:background_element="$graphic:button_element"
ohos:center_in_parent="true"
ohos:bottom_margin="10vp"
ohos:align_parent_bottom="true"/>
</DependentLayout>
SecondAbilitySlice.java
package cn.kf156.testapp.slice;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.DependentLayout;
import ohos.agp.components.Text;
import ohos.agp.components.element.ShapeElement;
import ohos.agp.utils.Color;
import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_PARENT;
import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_CONTENT;
public class SecondAbilitySlice extends AbilitySlice {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
// 声明布局
DependentLayout myLayout = new DependentLayout(this);
// 设置布局大小
myLayout.setWidth(MATCH_PARENT);
myLayout.setHeight(MATCH_PARENT);
ShapeElement element = new ShapeElement();
element.setRgbColor(new RgbColor(0, 0, 0));
myLayout.setBackground(element);
// 创建一个文本
Text text = new Text(this);
text.setText("Nice to meet you.");
text.setWidth(MATCH_PARENT);
text.setTextSize(55);
text.setTextColor(Color.WHITE);
// 设置文本的布局
DependentLayout.LayoutConfig textConfig = new DependentLayout.LayoutConfig(MATCH_CONTENT, MATCH_CONTENT);
textConfig.addRule(DependentLayout.LayoutConfig.CENTER_IN_PARENT);
text.setLayoutConfig(textConfig);
myLayout.addComponent(text);
super.setUIContent(myLayout);
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
present的操作没有问题,咱们能不能上传日志呀,我们看看日志呢~~
问题正在帮您处理中,有解决方案立刻回您啊,请再等等呢。
在HarmonyOS鸿蒙Next中,present跳转返回后点击事件不响应的问题,通常与页面生命周期或事件绑定机制有关。可能的原因包括:
-
页面生命周期未正确处理:在present跳转返回后,页面可能未正确恢复或重新绑定事件。确保在
onPageShow
或onPageActive
生命周期回调中重新绑定事件。 -
事件绑定丢失:在页面跳转过程中,事件绑定可能被解除或未重新绑定。检查事件绑定代码,确保在页面返回后重新绑定。
-
UI状态未更新:返回后,UI状态可能未及时更新,导致点击事件无法触发。确保在返回后更新UI状态。
-
异步操作未完成:如果存在异步操作,可能在返回时未完成,导致事件无法响应。确保异步操作完成后更新UI或重新绑定事件。
-
页面栈管理问题:present跳转可能影响页面栈管理,导致返回后页面状态异常。检查页面栈管理逻辑,确保页面状态正确恢复。
-
事件冒泡或捕获问题:检查事件是否被其他元素捕获或冒泡,导致点击事件未触发。确保事件绑定正确,避免事件被拦截。
-
系统或框架Bug:不排除系统或框架本身存在Bug,导致点击事件不响应。检查官方文档或社区,确认是否存在已知问题。
以上是可能导致点击事件不响应的原因,具体问题需结合代码和场景进一步分析。
在HarmonyOS鸿蒙Next中,present
跳转返回后点击事件不响应,可能是由于页面生命周期或事件绑定问题导致的。建议检查以下几点:
-
生命周期回调:确保在
onPageShow
或onPageResume
中重新绑定事件处理函数,避免页面返回后事件未正确绑定。 -
事件绑定:确认点击事件是否在页面返回后仍然有效,必要时重新绑定事件。
-
页面状态:检查页面状态是否在返回后正确恢复,避免因状态丢失导致事件无法触发。
-
调试日志:添加日志输出,确认事件是否被触发,帮助定位问题。
通过以上步骤,通常可以解决点击事件不响应的问题。