Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 后退按钮需要3次尝试_Android_Android Activity_Back - Fatal编程技术网

Android 后退按钮需要3次尝试

Android 后退按钮需要3次尝试,android,android-activity,back,Android,Android Activity,Back,我正在开发一个android应用程序,但不理解后退按钮 有一个活动(比如A1),通过单击按钮,用户可以转到另一个活动(比如A2)。用户完成A2活动后,单击“上一步”按钮,返回到上一个活动A1。所有的文档都说,A1将在此时onResume() 确实如此。然而,如果我在A2中,并且改变屏幕方向(从横向到纵向,反之亦然),那么会发生非常不同的事情。A2活动会按照预期的不同屏幕方向重新布局。当我现在按BACK键时,活动A2将再次展开(屏幕方向不变)。再次按下,再次导致活动A2再次展开。第三次按压背部会将

我正在开发一个android应用程序,但不理解后退按钮

有一个活动(比如A1),通过单击按钮,用户可以转到另一个活动(比如A2)。用户完成A2活动后,单击“上一步”按钮,返回到上一个活动A1。所有的文档都说,A1将在此时onResume()

确实如此。然而,如果我在A2中,并且改变屏幕方向(从横向到纵向,反之亦然),那么会发生非常不同的事情。A2活动会按照预期的不同屏幕方向重新布局。当我现在按BACK键时,活动A2将再次展开(屏幕方向不变)。再次按下,再次导致活动A2再次展开。第三次按压背部会将您带回活动A1

我做错了什么,我错过了什么?谢谢


Peter

您没有处理配置更改。查看链接,它可能会对您有所帮助


当您将方向从纵向更改为横向或从横向更改为纵向时,如果您未处理配置更改,则会重新创建活动

我的问题措辞不完全正确。我稍微简化了这个案子。我正在使用微调器(而不是按钮)切换到下一个活动

Spinner(和Gallery)有一个文档中没有提到的严重错误-当用户实际单击Spinner控件时,以及当框架代码首次布置Spinner时,会调用OnItemSelectedListener事件处理程序。因此,微调器处理代码必须确定事件是由用户选择触发的,还是由正在布置的微调器触发的。最简单的方法是使微调器中的第一项始终为“尚未进行任何选择”,并忽略该选择上的所有事件。 见和类似帖子

在我的例子中,方向更改导致微调器再次布局,因此我从中获得了两个事件,第一个是布局事件,第二个是以前选择的条目。这导致了一个虚假的第二个活动开始,这意味着需要按下3次后退按钮才能“返回”到第一个活动。它实际上是在第一次按下时返回的,然后微调器启动了一个布局事件和一个常规事件,使我两次进入第二个活动。这在屏幕上看不到,但通过日志消息可以看到

更改方向时,将销毁当前活动,并创建/启动新活动。 当您更改方向并按back键时,先前的活动将从暂停的堆栈顶部弹出、销毁,并创建/启动该活动的新版本


更改屏幕方向时,旧方向中的活动将永远不会保留。它将立即被销毁,或者如果它位于暂停堆栈的较低位置,则在到达顶部时将被销毁。

那么,您是说暂停活动的堆栈看起来是这样的吗?(Arggh,不能在注释中添加换行符)堆栈顶部-横向中的活动A2-纵向中的活动A2。这似乎很违反直觉。你的后台不知道你的活动是纵向的还是横向的。因此,这就像是堆顶->活动A2->另一个活动A2->堆底。这似乎违反直觉,因为Enigma提出的建议是错误的。这不是Enigma的错——我没有按照我的措辞提供足够的信息。但事实仍然是,配置中的更改会导致旧活动被销毁,而不是保留在堆栈上。