【问题标题】:Progress Dialog appears weirdly on Pre-lollipop devices进度对话框在 Pre-lollipop 设备上奇怪地出现
【发布时间】:2015-12-18 14:34:26
【问题描述】:

我在棒棒糖之前的设备上的进度对话框如下所示:

看到那个双窗了吗?我不知道为什么会这样。

代码

  1. 像这样初始化进度对话框:

    progressDialog = new ProgressDialog(context);
    progressDialog.setMessage(messsage);
    progressDialog.setIndeterminate(true);
    progressDialog.setCancelable(false);
    
  2. values-21中定义了这样的样式:

<style name="AlertDialog.Theme" parent="Theme.AppCompat.Light.Dialog">
        <item name="android:textColorPrimary">@color/black</item>
        <item name="android:background">@color/white</item>
        <item name="android:textColor">@color/black</item>
        <item name="colorAccent">@color/orange</item>
        <item name="colorPrimary">@color/orange</item>
        <item name="colorPrimaryDark">@color/darkerorance</item>
    </style>
  1. 在谷歌上搜索后,我在我的主题中添加了警报样式,如下所示:

<item name="android:dialogTheme">@style/AlertDialog.Theme</item>
        <item name="dialogTheme">@style/AlertDialog.Theme</item>
        <item name="android:alertDialogTheme">@style/AlertDialog.Theme</item>
        <item name="alertDialogTheme">@style/AlertDialog.Theme</item>

主旋律延伸自Theme.AppCompat.Light.NoActionBar

这在 Lollipop 及更高版本 上效果很好,但看起来就像在棒棒糖前的图像中一样。谁能在这里帮忙告诉我我做错了什么?

【问题讨论】:

  • 我认为没有 ProgressDialog 的支持版本。
  • 不确定您的特定用例,但作为一般 UI 考虑因素,您可能需要考虑使用带有加载视图的 ViewFlipper(例如,带有 ProgressDialog 的 FrameLayout)而不是 ProgressDialog。 ProgressDialogs 正在阻塞...因此,如果您的加载状态被挂起或需要一段时间,则用户将被阻止执行其他操作。

标签: android progressdialog android-styles


【解决方案1】:

我回复有点晚了,但这就是我解决问题的方法。
我创建了一个单独的v-14styles.xml,并定义了如下所示的样式

values-v14/styles.xml

<style name="AlertDialog.Holo" parent="@android:style/Theme.Holo.Light.Dialog">
    <item name="android:textColorPrimary">@color/black</item>
    <item name="android:textColor">@color/black</item>
    <item name="android:textAppearance">@style/Helvetica.Regular</item>
    <item name="android:windowTitleStyle">@style/DialogTitleStyle</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

P.S - textAppearance 和 windowTitleStyle 是我为自定义字体创建的样式。

使用的常规 (values/styles.xml) 警报对话框样式是:

<style name="AlertDialog.Theme" parent="Theme.AppCompat.Light.Dialog">
    <item name="android:textColorPrimary">@color/black</item>
    <item name="android:textColor">@color/black</item>
    <item name="colorAccent">@color/zifycolor</item>
    <item name="colorPrimary">@color/zifycolor</item>
    <item name="colorPrimaryDark">@color/zifycolorDarker</item>
    <item name="android:windowTitleStyle">@style/DialogTitleStyle</item>
    <item name="buttonBarButtonStyle">@style/AlertDialogButtonStyle</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

最后显示一个进度对话框:

/**
 * Create a progress dialog. The appropriate theme gets applied.
 *
 * @param context  valid context with a window
 * @param messsage message to show
 * @return {@code ProgressDialog} instance
 */
public static ProgressDialog createProgressDialog(@NonNull final Context context, @NonNull String messsage) {
    ProgressDialog progressDialog;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        progressDialog = new ProgressDialog(context, R.style.AlertDialog_Theme);
    else
        progressDialog = new ProgressDialog(context, R.style.AlertDialog_Holo);

    progressDialog.setMessage(messsage);
    progressDialog.setCancelable(false);
    return progressDialog;

}

到目前为止效果很好!希望它可以帮助某人。

【讨论】:

    【解决方案2】:

    我的解决方法是为 pre-Lollipop 创建一个单独的主题和样式,参数 android:windowBackground 为透明。这移除了后面的第二个背景。

    <style name="AppCompatAlertDialogStyleNoWindow" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="android:windowBackground">@color/transparent</item>
    </style>
    

    然后将此样式添加为 android:alertDialogTheme 用于预棒棒糖主题。

    【讨论】:

    • 只测试过这个API 16及以上
    【解决方案3】:

    您的答案不适用于预棒棒糖(在 API 19 上测试)。但我找到了解决方案:您需要使用android.support.v7.app.AlertDialog(在导入设置中)

    【讨论】:

      【解决方案4】:

      不要给那些对话框设置样式,如果你想在前棒棒糖设备中使用材质样式,那么请使用库

      Example

      它非常易于使用。

      【讨论】:

      • 不使用这个库我们能做到吗?
      • 提到的库是开源的,你显然可以检查代码并尝试实现你自己的。图书馆旨在节省您的时间。为了学习,您可以检查代码
      猜你喜欢
      • 1970-01-01
      • 2021-03-31
      • 2016-12-27
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      相关资源
      最近更新 更多