在屏幕旋转中持久化android微调器项目时出现问题

在屏幕旋转中持久化android微调器项目时出现问题,android,android-layout,android-spinner,Android,Android Layout,Android Spinner,我用两个纺纱机。第二个微调器中的项目根据第一个微调器项目的选择动态填充。我已经实现了OnItemSelectedListener并重写了onItemSelected以实现这一点。我还使用SharedReferences保存某些数据,以处理屏幕旋转。我面临的问题是,android 4.0版的一切都很好,正如预期的那样,但同样的代码无法在上述版本的android4.1、4.2、4.3上运行,并且第二个微调器的选定项会在屏幕旋转时重置。让我抓狂的是,安卓4.0版运行得非常好。有什么建议吗?我不知道这与

我用两个纺纱机。第二个微调器中的项目根据第一个微调器项目的选择动态填充。我已经实现了OnItemSelectedListener并重写了onItemSelected以实现这一点。我还使用SharedReferences保存某些数据,以处理屏幕旋转。我面临的问题是,android 4.0版的一切都很好,正如预期的那样,但同样的代码无法在上述版本的android4.1、4.2、4.3上运行,并且第二个微调器的选定项会在屏幕旋转时重置。让我抓狂的是,安卓4.0版运行得非常好。有什么建议吗?

我不知道这与版本>4.0可能有什么关系,但是最好是通过将要保留的数据写入onSaveInstanceStateBundle中并在onCreateBundle savedInstance中读取来处理配置更改


尽管它不会修复您看到的奇怪行为,但它应该可以工作…

在我看来,使用SharedReferences来保存数据不是一个好主意。同时,在onSaveInstanceState束中放置微调器不是一个好主意。除了不可能之外,这样做还会导致新活动保留对该微调器的引用,而该微调器保留对旧活动的引用,这将导致大量内存泄漏


微调器的内容是通过某种适配器设置的。您应该确保您的新活动可以重新创建该适配器。然后,将getItemSelectedId或getItemSelectedPosition放入捆绑包中,以便您可以在新活动中恢复选择。

尝试实现方法

onSaveInstaceState() // to save current selected items;

或者,您可以添加到清单活动标记中

android:configChanges="orientation"

然后你的活动不会被重新创建,一切都应该是一样的

我找到了一个解决方案,虽然不是完美的,但更像是一个钩子,如果屏幕旋转,我假设第一个微调器的选中项目及其索引将与我处理的自然数相同,因此我在第二个微调器中相应地设置数据,否则,在第一个微调器的选定侦听器中创建新微调器并在其中设置所需数据。不太干净,但适用于我的4.0及以上版本。

请发布logcat以显示您遇到的错误。我没有收到任何错误消息。只是,第二个微调器的选定项不会在4.1版之后的屏幕上旋转。然后发布可能的代码,除非我们都猜到这里覆盖onPause和onResume就满足了我的需要。当我说数据时,它只是spinnerinteger值中选择的项目。我正在重新创建适配器,并将其与重新创建的微调器连接,以确保我没有保存任何活动引用。 if(firstSpinnerItemSelected != position || firstSpinnerItemSelected == 0){ firstSpinner.setSelection(secondSpinnerItemSelected, true); ArrayAdapter secondAdapter = new ArrayAdapter( context, R.layout.spinner_item, itemList); secondSpinner.setAdapter(secondAdapter); } else{ secondSpinner.setSelection(secondSpinnerItemSelected, false); } if(firstSpinnerItemSelected != position || firstSpinnerItemSelected == 0){ firstSpinner.setSelection(secondSpinnerItemSelected, true); ArrayAdapter secondAdapter = new ArrayAdapter( context, R.layout.spinner_item, itemList); secondSpinner.setAdapter(secondAdapter); } else{ secondSpinner.setSelection(secondSpinnerItemSelected, false); }