【问题标题】:PlacePicker doesn't pick up material themePlacePicker 不选择材质主题
【发布时间】:2015-06-26 07:40:42
【问题描述】:

我正在使用来自 Google Play 服务的 PlacePicker 库,它启动了一项新活动。新的活动/选择器有一个默认没有样式的工具栏(actionbar)。

PlacePicker 文档指出

如果您使用材质主题在应用程序中设置自定义颜色, 地点选择器继承了 colorPrimary 和 colorPrimaryDark 来自主题的属性。

我的 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 Manifesto 文件中使用的主题

<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.");
}

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

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

【问题讨论】:

  • 启动活动使用的样式是什么?
  • @ianhanniballake 一个主题应用于整个应用程序,所以我会接受所有底层活动应该是相同的主题。
  • 所以,为了确认一下,您在启动PlacePicker 的活动中没有android:theme?您还可以包含用于创建PlacePicker 的代码吗?
  • @ianhanniballake 是正确的。活动上没有主题,但应用程序上有主题。我还添加了用于启动 PlacePicker 的代码。

标签: android google-play-services google-places-api android-theme


【解决方案1】:

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

如果您使用材质主题在应用程序中设置自定义颜色, 地点选择器继承了 colorPrimary 和 colorPrimaryDark 来自主题的属性。

但是,您没有在style.xml 文件中指定实际 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>

【讨论】:

  • 为原生材料设计设置颜色对我不起作用。 :(
  • 安卓。设置颜色是火箭场景
【解决方案2】:

这是开发团队的acknowledged issue

目前在设置自定义主题颜色时存在一个已知问题 地点选择器。现在你可以通过定义两个来解决这个问题 名称为“primary”和“primary_dark”的颜色 - 这些将是 应用于 PlacePicker。

不幸的是,在主题上设置 primary/primaryDark 属性会 目前不影响 PlacePicker 样式。

编辑: 现在好像修好了。

这应该在 Google Play 服务 10.0 中得到修复。放置选择器和 自动完成小部件将使用 colorPrimary 和 colorPrimaryDark 应用中的颜色。

【讨论】:

  • 你找到改变标题文字颜色的方法了吗?
  • @Max No :( 希望他们能尽快解决这个问题。
  • 你知道如何像环聊一样在那里获得搜索选项吗? evernote.com/shard/s526/sh/34204375-b79d-4cce-81cb-e569294d42b8/…
  • 工具栏的标题呢?我应该定义什么颜色来改变它?默认为黑色
  • @Joseph 我自己还没弄明白。
【解决方案3】:

修复 Lollipop 下 OS 上的工具栏主题 android Place Picker

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多