【问题标题】:Android Spinner in Custom DialogPreference forced close the application on Orientation change自定义 DialogPreference 中的 Android Spinner 在方向更改时强制关闭应用程序
【发布时间】:2013-01-01 06:49:51
【问题描述】:

我创建了一个自定义对话框首选项,它有两个微调器,以便选择特定的时间间隔(例如 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)

有一个解决方案可以将 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();       
        }
    } 
}

【问题讨论】:

  • 在评论中我不确定它是否适合你,但请尝试linearLayout.removeAllViews() 而不是linearLayout.removeView(spinner).

标签: android preferences android-spinner dialog-preference


【解决方案1】:

第一个 - 从弹出窗口显示弹出窗口不是很好,如果我是你,我会尝试在微调器或其他东西下制作可扩展布局。

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

3rd - 当你在你的 XML 中设置 android:configChanges="orientation|keyboardHidden 时,你告诉 Android 你想自己管理方向,所以你可能想在你的活动中实现 OnConfigurationChanged

【讨论】:

  • 1st - 请问你知道这方面的任何例子吗?我不理解。第二 - 所以我的自定义 DialogPreference 界面没有办法解决这个问题吗? 3rd - 像这样的函数:@Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); }
  • 应用程序在 android 2.3.6 Gingerbread 中被强制关闭。我已经使用 android 4.1 进行了测试,它工作正常,但微调器不同,它不在对话框中,而是在组合框样式中。我该如何解决这个问题?
  • 这正是我试图告诉你做的,因为 ICS 微调器是这样显示的。它不会崩溃,因为它没有显示在对话框顶部的弹出窗口中,因此不会失去任何联系。如果我是你,我会尝试将它移植到你的最低版本。我相信你可以谷歌搜索一个向下移植的库。但正如我之前所说,您可以通过覆盖 onConfigurationChanged 来避免这种情况,请查看文档
  • 如果我在 android:configChanges="orientation|keyboardHidden" 的 xml 属性中使用 onConfigurationChanged 函数,是否可以安全使用?我在帖子中看到它有副作用,这是真的吗?我应该在 onConfigurationChanged 函数中使用什么样的代码来保证它的安全?我只调用了这条线并且它起作用了: super.onConfigurationChanged();但它安全吗?我的应用程序不会崩溃?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2012-10-05
  • 2016-06-23
相关资源
最近更新 更多