PlacePicker 不选择 material 主题

PlacePicker doesn't pick up material theme

我正在使用来自 Google Play Services 的 PlacePicker 库,它启动了一个新的 activity。新的 activity/picker 有一个默认没有样式的工具栏(actionbar)。

PlacePicker 文档指出

If you set custom colors in your application using the material theme, the place picker inherits the colorPrimary and colorPrimaryDark attributes from the theme.

我的 style.xml 文件中有一个主题:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">#5665bb</item>
    <item name="android:colorPrimary">#5665bb</item>
    <item name="colorPrimaryDark">#41456b</item>
    <item name="android:colorPrimaryDark">#41456b</item>
</style>

并且我已经设置了要在我的 Android 宣言文件中使用的主题

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

placepicker 由以下代码创建:

try {
    PlacePicker.IntentBuilder intentBuilder = new PlacePicker.IntentBuilder();
    Intent intent = intentBuilder.build(Main.this);
    // Start the intent by requesting a result,
    // identified by a request code.
    startActivityForResult(intent, REQUEST_PLACE_PICKER);
} catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException e) {
    Log.e("", "Error with Google Play lib.");
}

但是,工具栏没有样式。和以前一样,它具有白色背景和黑色文本。 有趣的是,我自己的工具栏 (actionbar) 确实有样式。

如何强制 placepicker activity 采用我的主题?

如您在问题中提供的文档中所述:

If you set custom colors in your application using the material theme, the place picker inherits the colorPrimary and colorPrimaryDark attributes from the theme.

但是,您没有在 style.xml 文件中指定 actual Material 主题 (Theme.Material.Light);相反,您使用了 Theme.AppCompat.Light,虽然它的设计外观和操作与 Material 主题相同,但它是一个支持库,旨在为 Material 主题提供所有的向后兼容性Android 2.1 (API 7) 的方法。我的猜测是 PlacePicker 库仅从真正的 Material 主题而不是支持库继承 colorPrimarycolorPrimaryDark 属性。

一个简单的测试方法是修改您的 style.xml 文件以使用真正的 Material 主题并查看是否可行:

<style name="AppTheme" parent="android:Theme.Material">
    <item name="android:colorPrimary">#5665bb</item>
    <item name="android:colorPrimaryDark">#41456b</item>
</style>

当然,唯一的缺点是 Material 主题仅在 API ≥ 21 中可用,因此,如果这可行,那么您将仅限于使用仅使用 Lollipop 的设备。

最后,作为旁注,Theme.AppCompat 支持库不使用 android: 命名空间,因此您的原始 style.xml 文件可以缩短如下:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">#5665bb</item>
    <item name="colorPrimaryDark">#41456b</item>
</style>

这是开发团队的acknowledged issue

There is currently a known issue with setting custom theme colors on the PlacePicker. For now you can work around this by defining two colors with the names "primary" and "primary_dark" - these will be applied to the PlacePicker.

Unfortunately setting the primary/primaryDark property on a theme will not affect the PlacePicker styling at the moment.

编辑: 现在似乎已修复。

This should be fixed in Google Play Services 10.0. Place Picker and Autocomplete Widget will use the colorPrimary and colorPrimaryDark colors from your app.

To fix issues toolbar theme android Place Picker on OS under Lollipop

PlacePicker.IntentBuilder intentBuilder = new PlacePicker.IntentBuilder(); 
Intent intent = intentBuilder.build(getActivity()); 
    // if Build version sdk is under Lollipop, add intent extra
    (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        intent.putExtra("primary_color", getResources().getColor(R.color.colorPrimary));
        intent.putExtra("primary_color_dark", getResources().getColor(R.color.colorPrimaryDark));
    }

//start intent
startActivityForResult(intent, REQUEST_PLACE_PICKER_CODE);