1

特定の時間間隔 (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();       
        }
    } 
}
4

1 に答える 1

0

1 つ目 - ポップアップからポップアップを表示するのはあまり良くありません。

2番目-下のビューによってポップアップが起動され、向きを変更するとその接続が失われるため、ウィンドウリークエラーが発生します。

第 3 - XML で android:configChanges="orientation|keyboardHidden を設定すると、向きを自分で管理したいことを Android に伝えるので、アクティビティに OnConfigurationChanged を実装することができます。

于 2013-01-17T17:12:50.423 に答える