1

スピナーを2つ使用しています。2 番目のスピナーのアイテムは、最初のスピナーのアイテムの選択に基づいて動的に設定されます。これを実現するために、 OnItemSelectedListenerを実装し、 onItemSelectedをオーバーライドしました。また、SharedPreferences を使用して特定のデータを保持し、画面の回転を処理しています。私が直面している問題は、すべてが完全に正常に動作し、Android バージョン 4.0 では期待どおりに動作しますが、同じコードが上記のバージョンの Android(4.1、4.2、4.3) では動作せず、2 番目のスピナーの選択項目が画面の回転時にリセットされることです。私を夢中にさせているのは、Androidバージョン4.0で問題なく動作することです。助言がありますか?

4

4 に答える 4

0

バージョン > 4.0 とどう関係があるのか​​ わかりませんが、保持したいデータを onSaveInstanceState(Bundle out) のバンドルに書き込み、onCreate で読み取ることで、構成の変更を処理することをお勧めします。 (保存されたインスタンスをバンドルします)。

見ている奇妙な動作を「修正」することはできませんが、動作するはずです...

于 2013-10-09T15:50:46.133 に答える
0

私の意見では、そのデータを永続化するために SharedPreferences を使用することはお勧めできません。同時に、スピナーを onSaveInstanceState() バンドルに入れることはお勧めできません。不可能であるという事実に加えて、これを行うと、新しいアクティビティがそのスピナーへの参照を保持し、それが古いアクティビティへの参照を保持することになり、かなりのメモリ リークが発生します。

Spinner のコンテンツは、ある種のアダプタを介して設定されます。新しいアクティビティがそのアダプタを再作成できることを確認する必要があります。次に、getItemSelectedId() または getItemSelectedPosition() のいずれかをバンドルに配置して、新しいアクティビティで選択を復元できるようにします。

于 2013-10-09T15:51:35.610 に答える
0

私は解決策を見つけましたが、完璧ではありませんが、フックのほうが多く、画面が回転している場合、最初のスピナーの選択されたアイテムとそのインデックスが同じであると想定しています(私は自然数を扱っているため)ので、設定していますそれ以外の場合は、最初のスピナーの onItemSelected リスナーで、新しいスピナーを作成し、その中に必要なデータを設定します。あまりきれいではありませんが、私にとってはうまくいきます(4.0以降のバージョンの場合)。

                 if(firstSpinnerItemSelected != 位置 || firstSpinnerItemSelected == 0){
                    firstSpinner.setSelection(secondSpinnerItemSelected, true);
                    ArrayAdapter secondAdapter = 新しい ArrayAdapter(
                        context, R.layout.spinner_item, itemList);
                    secondSpinner.setAdapter(secondAdapter);
                }
                そうしないと{
                    secondSpinner.setSelection(secondSpinnerItemSelected, false);
                    }

于 2013-10-11T16:04:21.097 に答える
-1

メソッドを実装してみる

onSaveInstaceState() // to save current selected items;

onRestoreInstanceState() // to select saved items.

または、マニフェストのアクティビティ タグに追加することもできます

android:configChanges="orientation"

その後、アクティビティは再作成されず、すべてが同じである必要があります

于 2013-10-09T15:53:31.557 に答える