通过GoogleApiAvailability.showErrorDialogFragment呈现的样式对话框独立于活动

时间:2016-10-04 00:16:28

标签: android google-play-services android-appcompat android-theme android-styles

背景

我有一个Activity,其中应用了以下主题:

<style name="BlueTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/light_blue</item>
    <item name="colorPrimaryDark">@color/dark_blue</item>
    <item name="colorAccent">@color/mid_blue</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:windowBackground">@color/light_blue</item>
    <item name="dialogTheme">@style/BaseDialog</item>
    <item name="alertDialogTheme">@style/BaseDialog</item>
    ...
</style>

其中对话框主题定义如下:

<style name="BaseDialog" parent="Theme.AppCompat.Dialog.Alert">
    <item name="colorAccent">@color/light_blue</item>
    <item name="android:textColor">@color/black</item>
    <item name="android:textColorPrimary">@color/gray</item>
    <item name="android:background">@color/white</item>
</style>

此屏幕的大部分内容在全蓝背景下显示为白色文字。

Activity尝试通过调用ProviderInstaller.installIfNeededAsync(this, this);来更新设备安全提供程序。如果失败,我将使用以下代码显示一个对话框:

@Override
public void onProviderInstallFailed(final int errorCode, final Intent recoveryIntent) {
    final GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();

    if (googleApiAvailability.isUserResolvableError(errorCode)) {
        googleApiAvailability.showErrorDialogFragment(
                this,
                errorCode,
                ERROR_RESOLUTION_REQUEST_CODE);
    }
}

这是一个示例失败的对话框:

enter image description here

这是一个问题。对话框标题为白色,因此在对话框背景中不可见。请注意,在其他屏幕上手动显示的支持警报对话框已根据BaseDialog样式正确着色。

迄今为止的研究

通过调用Dialog呈现的googleApiAvailability.showErrorDialogFragment是使用android.app.AlertDialog.Builder而不是android.support.v7.app.AlertDialog.Builder的实例构建的。鉴于此,我认为平台对话框的颜色填充如下:

  • BlueTheme.android:textcolor
  • 的标题 来自BlueTheme.android:primaryTextColor
  • 消息 来自BlueTheme.colorAccent
  • 按钮

并使用BlueTheme.dialogThemeBlueTheme.alertDialogTheme中的值填充

我一直在考虑以下方案来解决这个问题:

  1. 手动显示支持警报对话框。这种方法的缺点:无法检索内置对话框将使用的自定义每错误代码标题/消息(据我所知);
  2. android:textColor中的android:textColorPrimarycolorAccentBlueTheme设置为获取正确颜色对话框所需的值,然后在XML布局文件中覆盖每个窗口小部件的这些颜色。这种方法的缺点:丑陋,需要很多压倒性的;
  3. 看起来都不好。我还使用ContextThemeWrapper进行了简要调查(不行,showErrorDialogFragment方法需要Activity个实例),并寻找一种方法来请求使用支持构建Google Play服务对话框{ {1}}建设者(没找到)。

    问题

    我错过了一种更明显的方法来设计这个对话框吗?

1 个答案:

答案 0 :(得分:4)

    GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();
    int googlePlayServicesAvailableError = googleAPI.isGooglePlayServicesAvailable(this);
    Intent errorResolutionIntent = googleAPI.getErrorResolutionIntent(this, googlePlayServicesAvailableError, null);

    AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.DialogTheme);
    builder.setTitle("Title");
    builder.setMessage(ConnectionErrorMessages.getErrorMessage(this, googlePlayServicesAvailableError));
    builder.setPositiveButton(ConnectionErrorMessages.getErrorDialogButtonMessage(this, googlePlayServicesAvailableError), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            startActivityForResult(errorResolutionIntent, REQUEST_GOOGLE_PLAY_SERVICES);
        }
    });
    builder.setCancelable(false);

    if (!isFinishing()) {
        builder.show();
    }