Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 以编程方式设置ActionMode后台_Android_Android Actionbar - Fatal编程技术网

Android 以编程方式设置ActionMode后台

Android 以编程方式设置ActionMode后台,android,android-actionbar,Android,Android Actionbar,我知道可以在XML主题中使用的android:actionModeBackground 有没有办法在代码中设置此背景 基本上我需要的是 getActionBar().setBackgroundDrawable(drawable); 您可以使用此action\u上下文\u栏获取ActionMode id int amId = getResources().getIdentifier("action_context_bar", "id", "android"); View view=

我知道可以在XML主题中使用的
android:actionModeBackground

有没有办法在代码中设置此背景

基本上我需要的是

getActionBar().setBackgroundDrawable(drawable);

您可以使用此action\u上下文\u栏获取ActionMode id

   int amId = getResources().getIdentifier("action_context_bar", "id", "android");
   View view= findViewById(amId);
   view.setBackground(actionModeBackground);

我在反思的帮助下找到了答案。因为我没有一个actionbar

public static void setActionModeBackgroundColor(ActionMode actionMode, int color) {
        try {
            StandaloneActionMode standaloneActionMode = (StandaloneActionMode) actionMode;
            Field mContextView = StandaloneActionMode.class.getDeclaredField("mContextView");
            mContextView.setAccessible(true);
            Object value = mContextView.get(standaloneActionMode);
            ((View) value).setBackground(new ColorDrawable(color));
        } catch (Throwable ignore) {
        }
    }

还有两种ActionMode实现:StandaloneActionMode和ActionModeImpl。此示例仅适用于第一个示例。对于第二个版本,在Kotlin中使用Android Studio 3.4.2时将与之相同:

(actionMode as? StandaloneActionMode).let {
    val contextView = it?.javaClass?.getDeclaredField("mContextView")
    contextView?.isAccessible = true

    val standActionMode = contextView?.get(it)
    val color = ContextCompat.getColor(context, R.color.colorResId)
    (standActionMode as? View)?.setBackgroundColor(color)
}

要将
actionMode
转换为
StandaloneActionMode
,请不要忘记从
androidx.appcompat.view.actionMode
导入
actionMode
,而不是从
android.view.actionMode

导入
,但这意味着用你不该碰的东西弄脏你的手。此外,对于此类解决方案的前向和/或后向兼容性也没有任何保证。总之,只是一个想法。你可以在这个问题中找到答案:你必须使用反思。奇怪的是,我11个月前提出的问题竟然是“以前问过,现在已经有答案了”,而我想重复的问题只有几天了。检查这个答案