Theme.Sherlock.Light.DarkActionBar中的隐形ActionMode项目图标

时间:2013-11-02 12:25:32

标签: android android-theme

使用Theme.Sherlock.Light.DarkActionBar(或Theme.Holo.Light.DarkActionBar时,没有什么区别),默认情况下,在选择文字时出现的ActionMode(或“上下文ActionBar”)的样式相同就像标准的黑暗主题一样,那是带有光动作图标的深蓝色。

但是,当您尝试在对话框中选择文本时(在此主题中为浅色调,与黑色ActionBar形成对比),将显示与Light主题(白色背景)中样式相同的ActionMode。问题是,它的动作图标不是应该是暗的,而是亮的,使它们实际上不可见。

enter image description here

这看起来好像背景是从灯光主题中拍摄的(因为灯光对话框),但是图标是从黑暗主题中拍摄的。这是Light.DarkActionBar主题中的错误吗?我能为此做些什么吗?

8 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分:2)

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

Context themedContext = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light);
final AlertDialog dialog = new AlertDialog.Builder(themedContext)

答案 2 :(得分: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级开始工作。

答案 3 :(得分:2)

问题:

App主题继承自 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);

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

screenshot

答案 4 :(得分: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

答案 5 :(得分: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);

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

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

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

或使用ActionBarSherlock / ActionBarCompat:

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

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

AlertDialog.Builder builder = new AlertDialog.Builder(themedContext);