14

当使用Theme.Sherlock.Light.DarkActionBar(或Theme.Holo.Light.DarkActionBar,没有区别)时,例如在选择文本时出现的 ActionMode(或“上下文 ActionBar”),默认情况下与标准深色主题中的样式相同,即深蓝色带浅色动作图标。

但是,当您尝试在 Dialog 中选择文本(在此主题中是浅色的,与黑色 ActionBar 形成对比)时,会出现像浅色主题(白色背景)中风格的 ActionMode。问题是,它的动作图标并不像应有的那样暗,而是亮,使它们实际上是不可见的。

在此处输入图像描述

这看起来好像背景取自浅色主题(因为浅色对话框),但图标取自深色主题。这是Light.DarkActionBar主题中的错误吗?我能做点什么吗?

4

8 回答 8

9

自从过去两天以来,我一直在与同样的问题作斗争。最后我想出了一个解决方法!

我正在使用DialogFragment一个AlertDialog对象。在该onCreateDialog()方法中,我们所要做的就是获取父活动的上下文并将其主题再次设置为Theme.Light.

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    //get the parent activity context and set it's theme again.
    Context ctx = getActivity();
    ctx.setTheme(android.R.style.Theme_Holo_Light);
    AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
    LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.your_dialog_layout, null, false);
    builder.setView(view);

    //your other code for the dialog
    //

    return builder.create();

现在 Contextual ActionBar 中的图标EditText具有正确的颜色。

于 2013-11-02T20:32:40.163 回答
2

强制setTheme当前上下文不是一个好主意,因为它会破坏主题。要解决这个问题,您可以使用ContextThemeWrapper.

Context themedContext = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light);
final AlertDialog dialog = new AlertDialog.Builder(themedContext)
于 2014-01-15T19:11:38.883 回答
2

我遇到了同样的问题。我使用继承自Theme.AppCompat.Light. 在我的主题actionModeTheme中,我用自定义样式项目覆盖了项目。但我面临的问题是你的问题。要解决此问题,只需覆盖android:alertDialogTheme自定义主题中的项目。

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
        ...
        <item name="android:alertDialogTheme">@style/AppBaseTheme</item>
        ...
</style>

<style name="AlertDialogTheme">
        ...
        <item name="android:actionModeStyle">@style/ActionModeStyle</item>
        ...
</style>
<style name="ActionModeStyle" parent="Widget.AppCompat.Base.ActionMode">
            ...
            <item name="android:background">@color/gray</item>
            ...
</style>

请注意,它从 api 11 级别开始工作。

于 2014-05-21T11:31:33.013 回答
2

问题:

应用主题继承自android:Theme.Light,并且没有专门的 AlertDialog 主题,因此 ActionMode 项在某种程度上是不可见的。


解决方案:

1.为AlertDialog创建专用主题;

<style name="AppTheme" parent="android:Theme.Light">
</style>
<style name="AlertDialogTheme" parent="AppTheme">
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowCloseOnTouchOutside">true</item>
    <item name="android:windowActionModeOverlay">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
    <item name="android:maxLines">1</item>
    <item name="android:scrollHorizontally">true</item>
    <item name="android:textColor">@android:color/holo_blue_light</item>
</style>

注意:创造魔法的最重要的线是<item name="android:textColor">@android:color/holo_blue_light</item>

2. 构建 AlertDialog 时使用专用主题。

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme);

请查看应用主题前后显示的屏幕截图。

截屏

于 2014-11-29T09:14:26.053 回答
2

将此添加到您的主题中:

    <item name="android:actionModeCutDrawable">@drawable/ic_menu_cut_holo_light</item>
    <item name="android:actionModeCopyDrawable">@drawable/ic_menu_copy_holo_light</item>
    <item name="android:actionModePasteDrawable">@drawable/ic_menu_paste_holo_light</item>
    <item name="android:actionModeSelectAllDrawable">@drawable/ic_menu_selectall_holo_light</item>

然后将必要的可绘制资源添加到您的项目中,可以在此处找到:https ://github.com/android/platform_frameworks_base/tree/master/core/res/res

于 2015-08-10T18:30:55.627 回答
0

我尝试了上述解决方案,唯一对我有用的解决方案(我的应用程序针对 API 7,AppCompat 21.0.3)是将对话框样式设置为 R.style.Theme_AppCompat。是的,愚蠢的对话框现在是黑色的。AppCompat 22 中也存在此问题。

    final Context themedContext = new ContextThemeWrapper(activity, R.style.Theme_AppCompat);
    builder = new AlertDialog.Builder(themedContext);
    contents = ((LayoutInflater) themedContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.tag_editor, null);
    builder.setView(contents);
于 2015-03-11T12:03:01.667 回答
0

我在维护的应用程序遇到了同样的问题解决方案非常简单 - 我只需将 compileSdkVersion 和 targetSdkVersion 更改为最新

于 2015-08-11T19:36:23.843 回答
-1

解决方案是使用 ActionBar 的上下文来创建 AlertDialog:

Context themedContext = getActivity().getActionBar().getThemedContext();

或使用 ActionBarSherlock/ActionBarCompat:

Context themedContext = getActivity().getSupportActionBar().getThemedContext();

然后使用这个主题上下文创建 AlertDialog:

AlertDialog.Builder builder = new AlertDialog.Builder(themedContext);
于 2013-12-16T21:40:18.733 回答