当前位置: 首页 > 知识库问答 >
问题:

在Android视图中检测后退按钮按下

郑西岭
2023-03-14

我正在编写一个使用ChessClock类的游戏应用程序。这两个运动员每人都有一个钟。时钟每十分之一秒向自己发送一个信息流,如果运行,则减少剩余时间。当时间到期时,时钟会调用父视图组中的一个方法,该方法会停止时钟并设置一个标志,该标志会导致忽略进一步的触摸事件,从而用户无法再移动工件。我正在用kotlin写作,但我认为java程序员也会明白这一点:

class ChessClock : TextView  {
   constructor(context: Context) : super(context)
   constructor(context:Context, p:String) : this(context) {
       player = p
   }
   var player = ""
   val RUNNING   = 0
   val PAUSED    = 1
   val IDLE      = 2
   val EXPIRED   = 3
   val mInterval = 100L
   var mTime  = 0L     // in milliseconds
   var mState = IDLE
   val mHandler = Handler()
   val mUpdateTimeTask = object : Runnable {
       override fun run() {
          if (mState == RUNNING) showTime()
          mHandler.postDelayed(this, mInterval)
       }
   }

//    override fun onDetachedFromWindow() {
//        super.onDetachedFromWindow()
//        stop()
//    }

   fun setTime(minutes:Long) {
       mTime = 1000*60*minutes       // minutes to milliseconds
       mState = IDLE
       setTextColor(getResources().getColor(R.color.colorIdle))
       showTime()
       mUpdateTimeTask.run()
   }

   fun pause() {
       mState = PAUSED
       setTextColor(getResources().getColor(R.color.colorPaused))
   }

   fun start() {
        mState = RUNNING
        setTextColor(getResources().getColor(R.color.colorRunning))
   }

   fun expire() {
       mState = EXPIRED
       setTextColor(getResources().getColor(R.color.colorExpired))
       model.timeout(player)
       val aboyne = parent as AboyneView
       aboyne.gameOver(false)
    }

    fun toggle() {
        if (mState == PAUSED) start()
        else if (mState == RUNNING) pause()
    }

    fun stop() {
        mHandler.removeCallbacks(mUpdateTimeTask)
    }

    fun showTime() {
        val tenths = (mTime % 1000) / 100
        var seconds = mTime / 1000
        val minutes = seconds % 3600 / 60
        seconds %= 60
        if (minutes >= 1)
            setText(String.format("%02d:%02d",minutes, seconds))
        else
            setText(String.format("%01d:%02d:%01d",minutes, seconds, 
                 tenths))
       if (mState != RUNNING) return
       if (mTime > 0)
           mTime -= mInterval
       else
           expire()
    }
}

这可以正常工作,但是如果用户按下后退按钮然后开始一个新游戏,时钟显然会继续运行,即使活动的onDestroy方法已被调用。然后当运行时钟到期时,即使新时钟仍在运行,新游戏也会被冻结。

我是android新手,我不明白这是怎么回事。我本以为活动结束时,时钟会被破坏。我已经测试了关于日志消息发生了什么的想法,并确认在调用onDestroy之后时钟会运行。我还重写了onDetachedFromWindow以停止时钟,这会使问题消失,但这太过分了。如果用户接到电话,它也会停止计时,不是吗?这不是我想要的。

你能建议如何最好地完成我想要的吗?没有办法从活动中访问时钟,是吗?我想过在onDestroy中发出一些事件,并让ChessBell监听它,但我还不知道如何编写自定义事件和监听器。有更简单的方法吗?

共有2个答案

魏熠彤
2023-03-14

我不明白提出的建议如何解决我的问题,但我想出了一个难题。

我将一个全局变量BACK_按钮初始化为false。在该活动中,我覆盖了onDestroy,将_按钮设置为true。然后我修改了ChessClock代码来检查BACK_按钮:

val mUpdateTimeTask = object : Runnable {
    override fun run() {
        if (BACK_BUTTON) expire()
        else {
            if (mState == RUNNING) showTime()
            mHandler.postDelayed(this, mInterval)
        }
    }

不是一个很好的解决方案,但在我弄清楚自定义事件之前必须这样做。据我所知,自定义事件和自定义事件侦听器是做到这一点的唯一干净方法。

屠德宇
2023-03-14

我不知道如何在Kotlin中实现这一点,但在java中,您可以设置计时器,每X毫秒执行一次timertask,然后在需要时调用mTimer取消它。cancel()你应该试着用它来代替mHandler。postDelayed(这是mInterval)

以下是您的做法:如何在静态编程语言中延迟后调用函数?

 类似资料:
  • 我对libGDX有一个问题,当我用后退按钮退出后恢复应用程序时,只有一个白色屏幕。 实际应用运行,接受触摸输入,播放声音,但屏幕只是白色。 我读过保持对纹理的静态引用可能会导致这个问题,但我没有这样做。 下面是我的资产代码如何工作的简化版本。 在按下后退按钮后返回应用程序时,重新创建AssetManager,重新打开SplashScreen(为白色),并更新AssetManager直到重新加载所有

  • 我正在使用Actionbar和它的“up”按钮从一个细节活动返回到主活动,这很好。类似地,用户可以按系统“后退”按钮返回到主活动。 在我的主要活动中,在中,从internet下载数据,以便在应用程序启动时显示。我注意到,当我使用Actionbar“up”按钮从细节转到主要活动时,运行,重新下载数据。但是当我使用系统“后退”按钮时,没有运行,因此立即显示主活动视图。 我在详细信息活动中用于实现“向上

  • 在我的应用程序中,我有一个注销功能。如果用户单击注销,它将进入主屏幕。现在,我按下后退按钮退出我的应用程序。但我想要的是,我需要自动退出(即以编程方式退出),就像返回按钮功能一样。我知道,通过调用finish()可以实现该功能。但问题是,它会转到上一个活动。

  • 假设有几个以编程方式创建的按钮,并且有一个通用的按钮处理程序。 如何理解处理器内部哪个按钮被按下? 而不在函数调用中传递一些特殊的东西。那不行:< code > onButtonClicked(" button " I); 例如,在JavaScript中,在处理程序内部有< code>$(this),它可以立即“理解”按下了哪个按钮。 也许在颤振中也有类似的机制?我想在按钮上挂起属性(事先不知道哪

  • 问题内容: 我只是在http://ritter.vg上设置了新主页。我正在使用jQuery,但是使用的次数很少。 它使用AJAX加载所有页面-我将其设置为通过检测URL中的哈希来允许添加书签。 但是我无法使用后退和前进按钮。 有没有一种方法可以在不使用setInterval循环的情况下检测何时按下后退按钮(或检测哈希值何时变化)?当我尝试使用.2和1秒超时的那些时,它挂住了我的CPU。 问题答案: