我有一个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);
}
}
这是一个示例失败的对话框:
这是一个问题。对话框标题为白色,因此在对话框背景中不可见。请注意,在其他屏幕上手动显示的支持警报对话框已根据BaseDialog
样式正确着色。
通过调用Dialog
呈现的googleApiAvailability.showErrorDialogFragment
是使用android.app.AlertDialog.Builder
而不是android.support.v7.app.AlertDialog.Builder
的实例构建的。鉴于此,我认为平台对话框的颜色填充如下:
BlueTheme.android:textcolor
BlueTheme.android:primaryTextColor
的BlueTheme.colorAccent
并使用BlueTheme.dialogTheme
或BlueTheme.alertDialogTheme
中的值填充 。
我一直在考虑以下方案来解决这个问题:
android:textColor
中的android:textColorPrimary
,colorAccent
和BlueTheme
设置为获取正确颜色对话框所需的值,然后在XML布局文件中覆盖每个窗口小部件的这些颜色。这种方法的缺点:丑陋,需要很多压倒性的; 看起来都不好。我还使用ContextThemeWrapper
进行了简要调查(不行,showErrorDialogFragment
方法需要Activity
个实例),并寻找一种方法来请求使用支持构建Google Play服务对话框{ {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();
}