HarmonyOS 鸿蒙Next api9下prompt展示时先关闭prompt不走onBackPress方法

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next api9下prompt展示时先关闭prompt不走onBackPress方法

onBackPress() {
  this.ExitApp();
  return true
}

public ExitApp() {
  if ((new Date().getTime() - this.exitTime) > 5000) {
    Prompt.showToast({ message: "再按一次退出程序" })
    this.exitTime = new Date().getTime();
    console.log("onBackPress>>>>>>")
  } else {
    console.log("onBackPress>>>>>>退出应用")
    const context = getContext(this) as common.UIAbilityContext;
    context.terminateSelf()
  }
}

点击返回按钮,弹出消息,Prompt.showToast({message:"再按一次退出程序"}。再次点击后showToast消失,没有退出应用,在showToast消失后,再返回,才会退出应用。


更多关于HarmonyOS 鸿蒙Next api9下prompt展示时先关闭prompt不走onBackPress方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

我的是将

showMode:promptAction.ToastShowMode.DEFAULT

解决了这个问题

更多关于HarmonyOS 鸿蒙Next api9下prompt展示时先关闭prompt不走onBackPress方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我也遇到了相同的问题

我看bilibili是用的系统的弹窗,固定存在1秒,退出应用也存在

很多应用都是这样,固定存在几秒,在弹窗存在的时候,按返回键才会退出应用。弹窗消失后,再按返回键,会再次弹窗。就是不知道怎么实现的。

找到一个替代之法:

1、添加一个状态变量:

@State quitRemind: boolean = false;

2、在UI最外层的容器底部添加一个透明Divider:

Divider().color(Color.Transparent).bindPopup(this.quitRemind, {message: '再按一次退出程序'})

3、修改退出方法如下:(此处可自己控制闪现时长 delay)

public ExitApp() {
  if ((new Date().getTime() - this.exitTime) > 5000) {
    this.exitTime = new Date().getTime();
    this.quitRemind = true;
    let delay = 500;
    let timeoutID = setTimeout(() => {
      this.quitRemind = false;;
    }, delay);
  } else {
    const context = getContext(this) as common.UIAbilityContext;
    context.terminateSelf()
  }
}

看promptAction代码还可弹出对话框、菜单等,那自身也是个实体UI元素了,因此也会捕获交互事件,让promptAction放弃事件捕捉不现实,这样看此问题无解;

不过可考虑缩短显示时长,默认1500ms,人眼捕捉300-400ms左右,所以短点时间也够用了。

我看api,duration最小就是1500。有其他解决方法吗?

由于您提供的HTML内容并未在问题中直接展示,我将假设一个常见的HTML结构来进行转换。如果您有具体的HTML内容,请提供,以便我能更准确地进行转换。

假设的HTML内容如下:

<div>
    <h1>个人信息</h1>
    <p>姓名: 张三</p>
    <p>职业: 软件工程师</p>
    <p>爱好: 编程、阅读</p>
    <div class="code-theme">
        <pre><code class="language-python">def hello_world():
    print("Hello, world!")
</code></pre>
    </div>
    <img src="" alt="示例图片">
    <img src="path/to/image.jpg" alt="示例图片">
</div>

根据您的要求,转换后的Markdown内容如下:

个人信息

  • 姓名: 张三
  • 职业: 软件工程师
  • 爱好: 编程、阅读
def hello_world():
    print("Hello, world!")

示例图片


请提供具体的HTML内容以获得更精确的转换。

你好,这个问题解决了吗

HarmonyOS的分布式技术让我实现了跨设备的无缝协作,工作效率翻倍。

我看了API9与NEXT版本都有这样的问题,像是,如果Toast出现,则按返回键第一步是先取消Toast,第二次才执行onBackPress。有点问题。

在HarmonyOS鸿蒙系统中,当在API 9版本下使用prompt进行展示时,如果希望在关闭prompt时不触发onBackPress方法,通常这是因为prompt的关闭行为被系统默认为一种“取消”或“返回”操作,从而触发了Activity或Fragment的返回逻辑。

要解决这个问题,你可以考虑以下几种方法(注意,这些方法基于鸿蒙系统的特性,不涉及Java或C语言):

  1. 自定义关闭逻辑:在prompt展示时,通过自定义按钮或其他交互方式来关闭prompt,并在关闭的回调中明确不执行onBackPress相关的逻辑。

  2. 拦截返回键事件:如果prompt是通过某种方式(如对话框)展示的,可以尝试拦截Activity或Fragment的返回键事件,判断当前是否正在显示prompt,如果是,则直接关闭prompt而不执行onBackPress

  3. 使用标志位:设置一个全局或局部的标志位,用于指示prompt是否正在显示。在onBackPress方法中检查这个标志位,如果prompt正在显示,则不执行任何返回操作。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部