Android 我可以强制微调器的下拉视图在方向更改时保持可见吗?

Android 我可以强制微调器的下拉视图在方向更改时保持可见吗?,android,drop-down-menu,spinner,Android,Drop Down Menu,Spinner,我不知道从标题中是否清楚我问了什么,所以这里有一些复制步骤(假设您有一个带有微调器的布局): 点击微调器>下拉列表打开 将设备从纵向旋转到横向(反之亦然)>列表关闭 我的问题是,我想在旋转设备后保持列表打开。我知道,如果覆盖OnConfiguration Changed,这通常是可能的,但我已经为横向模式定义了不同的布局,因此在我的OnConfiguration Changed方法中,我必须调用setContentView并为横向微调器设置适配器,这将关闭在纵向模式下打开的下拉视图 是否有办法防

我不知道从标题中是否清楚我问了什么,所以这里有一些复制步骤(假设您有一个带有微调器的布局):

  • 点击微调器>下拉列表打开
  • 将设备从纵向旋转到横向(反之亦然)>列表关闭
  • 我的问题是,我想在旋转设备后保持列表打开。我知道,如果覆盖OnConfiguration Changed,这通常是可能的,但我已经为横向模式定义了不同的布局,因此在我的OnConfiguration Changed方法中,我必须调用setContentView并为横向微调器设置适配器,这将关闭在纵向模式下打开的下拉视图


    是否有办法防止下拉列表在旋转设备后关闭或强制显示?

    默认情况下,从纵向切换到横向的行为是重新启动活动。因此,您可以将微调器状态保存到某个位置,例如共享引用,并在重新启动活动时读取它(在onCreate()或onResume()方法中)。

    我发现了一个非常难看的解决方案(“操作”发生在onConfiguration Changed方法中):

  • 调用setContentView之前,请检查下拉视图是否显示(*),如果显示,请保存当前在微调器中选择的位置(
    int pos=spinner.getSelectedItemPosition()

  • 调用setContentView并设置微调器适配器后,如果在步骤1中显示了下拉视图,则通过在微调器上调用performClick强制显示下拉视图:

    spinner.setSelection(pos);// this way we make sure that the same item
                              // remains selected after rotating the device
    spinner.performClick(); //show the dropdown view 
    
  • (*)检查下拉视图是否显示是比较棘手的部分。我还没有找到一种方法让我知道是否显示下拉视图,因此我必须执行以下操作:

    • 在布尔变量中保持微调器的按下状态(例如,命名为isClicked

    • 为微调器设置一个onTouchListener,并在onTouch方法中将isClicked设置为true(点击微调器时,DropdOn视图打开,因此isClicked==true表示显示下拉视图)

    • 覆盖onKeyDownonkeydup并且当按下后退按钮时,如果isClicked为true,则将其设置为false(我假设用isClicked==true按下后退意味着关闭下拉视图)

    • 使用onConfigurationChanged方法中的isClicked值检查是否显示下拉视图


    正如我所说,这是一个丑陋的解决方案,但这是迄今为止我唯一能想到的解决方案。如果有人有其他想法,请发布。

    谢谢你的建议,但我已经尝试了使用onSaveInstanceState/onRestoreInstanceState作为微调器,在这种情况下没有什么帮助。它只保存选定的项目,而不保存列表已打开的事实。是否有其他方法保存微调器的状态(包括下拉视图已打开的事实)?或者我可以保存dropdownview的状态?