自定义DialogPreference中的Android Spinner强制关闭Orientation更改时的应用程序

时间:2013-01-17 16:51:25

标签: android preferences android-spinner dialog-preference

我创建了一个自定义对话框首选项,它有两个微调器以选择特定的时间间隔(例如2秒或2分钟,3个小时等)。因此,当我在首选项屏幕中单击自定义首选项时,自定义弹出对话框首选项,它显示两个微调器。但是,当我选择其中一个微调器(弹出另一个对话框 - 请参阅第二张图像)时,如果我更改了屏幕的方向,则会强制关闭应用程序。 :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)

有一个解决方案可以将配置更改更改为: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();       
        }
    } 
}

1 个答案:

答案 0 :(得分:0)

1st - 从弹出窗口弹出一个弹出窗口并不是很好,如果我是你,我会尝试在微调器下面做一个可扩展的布局。

第二 - 你得到窗口泄露错误,因为它是由下方视图启动的弹出窗口,当你改变方向时,该连接会丢失。

第3次 - 当您在XML中设置android:configChanges =“orientation | keyboardHidden时,您告诉Android您想要自己管理方向,这样您可能希望在活动中实现OnConfigurationChanged

相关问题