Android警报对话框背景问题API 11+

时间:2011-12-31 00:24:33

标签: java android android-theme android-dialog

我使用下面的代码创建AlertDialog。 出于某种原因,我在Honeycomb及以上版本上获得了额外的背景(见图)。 对于蜂窝以下的任何内容,代码崩溃都很好。 对于< MyCustomDialogTheme.Dialog只是Theme.Holo.Dialog API-11和AlertDialog.Builder(Context context, int theme)用于API-11及更高版本。

  1. 知道为什么我会得到额外的背景吗?
  2. 任何想法为什么它崩溃的API< 11?如果我删除主题,它可以正常工作。
  3. 更新找出问题#2的答案。似乎构造函数final AlertDialog.Builder builder = (Integer.parseInt(android.os.Build.VERSION.SDK) < 11)? new AlertDialog.Builder(this) : new AlertDialog.Builder(this,R.style.JumpDialog); 是在API 11中引入的。我的修复只是将行更改为:

    private Dialog setupKeyBoardDialog() {
        if (mContact.getLocaleId() != -1) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.MyCustomDialog);
            builder.setTitle("Keyboards");
    
            mKeyboardLayouts = new KeyboardLayoutGroup();
            mKeyboardLayouts.layoutNames = new CharSequence[(int) jni.getNumKeyLayouts()];
            mKeyboardLayouts.layoutValue = new ArrayList<Integer>();
    
            for (int i = 0; i < jni.getNumKeyLayouts(); i++) {
                mKeyboardLayouts.layoutNames[i] = jni.LayoutInfoForIndex(i).getName();
                mKeyboardLayouts.layoutValue.add(i, (int) jni.LayoutInfoForIndex(i).getLocale_id());
            }
    
            final int selectedItem = mKeyboardLayouts.layoutValue.indexOf(mContact.getLocaleId());
    
            builder.setSingleChoiceItems(mKeyboardLayouts.layoutNames, selectedItem, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                    mContact.setLocaleId(mKeyboardLayouts.layoutValue.get(item));
                    mContactsDB.saveContact(mContact, true);
    
                    dialog.dismiss();
                    initializeSettingsList();
                }
            });
    
            final AlertDialog dialog = builder.create();
            dialog.setButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogBox, int arg1) {
                    dialogBox.cancel();
                }
            });
    
            return dialog;
        }
    
        return null;
    }
    

    我仍然需要问题#1的帮助

    enter image description here

    {{1}}

3 个答案:

答案 0 :(得分:17)

找出答案

  1. AlertDialog有关于每个主题的静态常量 AlertDialog类并没有采用标准主题。当我 已替换R.style.MyThemeandroid.R.style.Theme_Holo_Dialog 使用AlertDialog.THEME_HOLO_LIGHT代码工作正常 细。
  2. 似乎构造函数AlertDialog.Builder(Context context, int theme)是在API 11中引入的。我的修复只是改变了 行到:

    final AlertDialog.Builder builder;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
        builder = new AlertDialog.Builder(this);
    } else {
        builder = new AlertDialog.Builder(this,R.style.JumpDialog);
    }
    

答案 1 :(得分:6)

您可以尝试使用new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.JumpDialog))代替new AlertDialog.Builder(this, R.style.JumpDialog)

答案 2 :(得分:2)

对于那些寻找自定义对话框主题的方法而不必坚持默认的方法(如在已接受的解决方案中),从Lollipop开始,似乎最终删除了额外的背景。因此,现在您可以创建一个继承自默认主题的主题(使用AppCompat的示例):

<!-- default theme for L devices -->
<style name="SelectionDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:textColor">@color/default_text_color_holo_light</item>
</style>
<!-- theme for Pre-L devices -->
<style name="SelectionDialog.PreL">
    <!-- remove the dialog window background -->
    <item name="android:windowBackground">@color/transparent</item>
</style>

使用以下代码实例化您的构建器:

AlertDialog.Builder builder = new AlertDialog.Builder(
            getActivity(),                
            Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT ?
                    R.style.SelectionDialog :
                    R.style.SelectionDialog_PreL);

当然,也可以使用资源文件夹(values/values-v21/)来完成此操作。