2

为了显示具有丰富内容和输入元素的对话框,我使用 AndroidAlertDialog.Builder创建了一个对象,AlertDialog然后使用系统LayoutInflater将内容(setView(...))设置为一些 XML 布局文件。

这在 Android 2.X 上看起来很完美(深色背景,白色文本):

在此处输入图像描述

但在 Android 4.X 上它根本不可读:

在此处输入图像描述

注意:当然,这些对话框并不相同,但是两个对话框都会出现问题。

那么我做错了什么?我Theme.Light在 API 级别 < 11 和Theme.Holo.Light>= 11 上使用。

编辑1:这是我用来膨胀的代码:

private LayoutInflater mGlobalInflater; // in Activity class
mGlobalInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); // in Activity's onCreate()
mGlobalInflater.inflate(R.layout.input_dialog, null); // when needed

编辑 2:这是“选择日期”视图的膨胀 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:padding="15dp">
    <DatePicker
        android:id="@+id/input_date"
        android:startYear="1900"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="2dp"
        android:text="@string/hint" />
</LinearLayout>

编辑 3:正如我现在发现的那样,膨胀的对话框内容在使用时在 Android <= 2.3.3 上mGlobalInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);正确呈现,在使用时在 Android >= 3.0 上正确呈现mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);。所以这Context有所不同。为什么?

编辑4:

onContextItemSelected()对话框在of内部创建和膨胀Activity

AlertDialog.Builder dialogPoup = new AlertDialog.Builder(MainActivity.this);
dialogPoup.setTitle("abc123");
final View inputDialog = mGlobalInflater.inflate(R.layout.input_dialog, null);
// setting some properties of the view and its child views
dialogPoup.setView(inputDialog);

这个对吗?还是我必须用' 的上下文分配给 inMainActivity.this的变量mContext(例如)替换?ActivityonCreate()

4

3 回答 3

2

不要像在上面的代码中那样使用 LayoutInflater,而是使用getApplicationContext()Activity 中的那个,而不是像这样:

    mGlobalInflater = LayoutInflater.from(this); // in Activity's onCreate()

这应该有望使用对话框的匹配主题。

于 2012-10-05T20:05:35.007 回答
1

我发现的唯一可行的解​​决方案如下:

    LayoutInflater mInflater, mGlobalInflater;
    mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= 11) {
        mGlobalInflater = mInflater;
    }
    else {
        mGlobalInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    }

现在您可以mInflater用于正常膨胀(例如:a 内的行ListView)和(使用)mGlobalInflater内的膨胀视图。这将适用于所有 API 级别。AlertDialogsetView()

于 2012-10-12T16:15:36.453 回答
1

当你说你正在使用Theme.LightandTheme.Holo.Light时,重要的是你应用这个主题。

它是你的Application还是你的Activity。如果你在Application关卡上应用它,那么如果你Context从应用程序中获得它,你就会用那个主题膨胀(类似地Activity)。如果应用程序与活动的两个主题不同,您会注意到差异。

当您在上面查看@Joe 的答案时,请记住这一点。您提到@Joe 的回答解决了 api11+ 的问题,但之前的问题已经解决了。

因此,只需查看您的 AndroidManifest 并查看您对主题的了解以及您正在从中膨胀 Dialog 的<application>特定内容。<activity>

希望有帮助

于 2012-10-11T19:43:44.407 回答