特定の時間間隔 (2 秒、2 分、3 時間など) を選択するために 2 つのスピナーを持つカスタム ダイアログ設定を作成しました。そのため、設定画面でカスタム設定をクリックすると、カスタム ダイアログ設定が表示されます。 2 つのスピナーが表示されます。ただし、スピナーの 1 つを選択すると (別のダイアログがポップアップします - 2 番目の画像を参照)、画面の向きを変更すると、アプリケーションが強制的に閉じられます。:S これは Android 2.3.6 Gingerbread で発生します。Android 4.1でテストしましたが、正常に動作しますが、スピナーが異なり、ダイアログではなく、コンボボックススタイルです。
すべての関数のコードを try catch に入れましたが、例外をキャッチできません。エラーは次のとおりです。
01-17 15:14:43.929: E/WindowManager(5029): Activity com.myapp.appdemo.EditPreferences has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405c1b00 that was originally added here
01-17 15:14:43.929: E/WindowManager(5029): android.view.WindowLeaked: Activity com.myapp.appdemo.EditPreferences has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405c1b00 that was originally added here
01-17 15:14:43.929: E/WindowManager(5029): at android.view.ViewRoot.<init>(ViewRoot.java:263)
configchanges を android:configChanges="orientation|keyboardHidden" に変更する解決策がありますが、この問題を解決する別の方法があるかどうかを知りたいと思います。いくつかの副作用があります。
onDismiss 関数のレイアウトからスピナーを削除しようとしましたが、問題は解決しません。:S したがって、関数を使用しても使用しなくても問題は解決しません。
カスタム DialogPreference クラスは次のとおりです。
public class PreferenceCustomTime extends DialogPreference {
private Context context;
private Spinner spinner1, spinner2;
private ArrayAdapter<CharSequence> adapter, adapterValue;
public PreferenceCustomTime(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
setPersistent(false);
setDialogLayoutResource(R.layout.spinner_list_callpoint);
}
@Override
protected void onBindDialogView(View view) {
spinner1 = (Spinner) view.findViewById(R.id.spinner1);
spinner2 = (Spinner) view.findViewById(R.id.spinner2);
adapter = ArrayAdapter.createFromResource(context, R.array.arrayTypeTime, android.R.layout.simple_spinner_dropdown_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //simple_spinner_dropdown_item simple_spinner_item
spinner1.setAdapter(adapter);
spinner1.setSelection(0);
adapterValue = ArrayAdapter.createFromResource(context, R.array.arrayValueTime1, android.R.layout.simple_spinner_dropdown_item);
adapterValue.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2.setAdapter(adapterValue);
super.onBindDialogView(view);
}
@Override
public void onDismiss(DialogInterface dialog) {
LayoutInflater inflater = LayoutInflater.from(context);
LinearLayout linearLayout = (LinearLayout) inflater.inflate(R.layout.spinner_list_callpoint , null);
linearLayout.removeView(spinner1);
linearLayout.removeView(spinner2);
super.onDismiss(dialog);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
SharedPreferences.Editor editor = getEditor();
editor.putString(getKey() + ".type", spinner1.getSelectedItem().toString());
editor.putString(getKey() + ".value", spinner2.getSelectedItem().toString());
editor.commit();
}
}
}