使用Theme.Sherlock.Light.DarkActionBar
(或Theme.Holo.Light.DarkActionBar
时,没有什么区别),默认情况下,在选择文字时出现的ActionMode(或“上下文ActionBar”)的样式相同就像标准的黑暗主题一样,那是带有光动作图标的深蓝色。
但是,当您尝试在对话框中选择文本时(在此主题中为浅色调,与黑色ActionBar形成对比),将显示与Light主题(白色背景)中样式相同的ActionMode。问题是,它的动作图标不是应该是暗的,而是亮的,使它们实际上不可见。
这看起来好像背景是从灯光主题中拍摄的(因为灯光对话框),但是图标是从黑暗主题中拍摄的。这是Light.DarkActionBar
主题中的错误吗?我能为此做些什么吗?
答案 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);
请查看应用主题前后的屏幕截图。
答案 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);