【问题标题】:Unwanted onItemSelected calls after restoring application state恢复应用程序状态后不需要的 onItemSelected 调用
【发布时间】:2024-01-22 07:28:01
【问题描述】:

嗨,
我有一些 Spinner 对象,当它们被选中时,它们会更改 EditText 和 Button 的内容。一切正常,直到我打开和关闭屏幕。
我将应用程序方向设置为仅横向,因此在打开和关闭屏幕时会导致活动被破坏。

这里出现的问题是我丢失了 Spinner、EditText 和 Button 对象的所有状态信息。
所以我尝试使用onSaveInstanceStateonRestoreInstanceState 方法来解决这个问题,方法是按顺序设置微调器、按钮和EditText 的状态。
问题是,由于某种原因,在我恢复 Button 和 EditText 的状态后调用了 onItemSelected 方法,因此它们被设置为默认值。
我尝试暂时禁用 onItemSelected 侦听器,但一旦我再次启用它们,就会调用 onItemSelected 方法并重置 Button 和 EditText 状态。

注意:我只想在应用被系统杀死后恢复状态,而不是被用户杀死。

【问题讨论】:

    标签: android spinner listener state restore


    【解决方案1】:

    您可以创建一个全局布尔变量并在恢复时将其设置为 true。在 onItemSelected 中,您可以检查此变量,如果为 true,您将不会更改按钮和 editText 内容,只需将此变量设置为 false。 在 onRestoreInstaceState:

    wasRestored = true;
    

    在 onItemSelected 中:

    if(wasRestored){
       wasRestored=false;
       return;
    } else {//change editText and Button content}
    

    【讨论】:

    • 我通过在 onRestoreInstanceState 方法开始时将其设置为 true 并在最后将其设置回 false 来尝试此操作。虽然这不起作用,但是当我不将它设置回 false 时它确实起作用,但是我的 Spinner 显然不再起作用了。所以从我的角度来看,似乎 onItemSelected 方法是在 onRestoreInstanceState 方法之后调用的,但我不知道在哪里/为什么。
    • 您应该尝试在 onItemSelected 中将其设置为 false,而不是在 onRestoreInstanceState 中。 if(variable){variable=false;return;} - 像这样。
    • 好的,我更正了,但问题仍然存在。所以我试图找出一些日志记录会发生什么。在没有您的建议的情况下,我在重新打开屏幕时调用了以下方法:onCreate - init (Spinner、Button 和 EditText 已初始化) - onRestoreInstanceState - onItemSelected - onItemSelected。通过添加全局布尔值,第一个 onItemSelected 调用消失了,但仍然以某种方式调用 onItemSelected。
    • 好吧,您是否尝试过将设置微调器恢复到原来的位置,然后您的 edittext 和 button 中的数据可能会重新加载,但它会是一样的吗?
    • 很抱歉,但我不确定您的意思,实际上我设法通过添加第二个全局布尔值来解决对 onItemSelected 的第二次调用来解决它。这当然不是理想的,但它现在有效。我仍在试图弄清楚为什么在 onRestoreInstanceState 之后(两次)调用 onItemSelected。
    最近更新 更多