Android 为什么我的EditText复制/粘贴菜单位于EditText下?如何更改弹出窗口的z顺序?
注意 如果有人知道如何通过windowmanager订购(z-order)Windows,我也会接受答案,因为它将回答所有问题。实际上,我发现只需执行Android 为什么我的EditText复制/粘贴菜单位于EditText下?如何更改弹出窗口的z顺序?,android,android-layout,android-edittext,android-view,android-windowmanager,Android,Android Layout,Android Edittext,Android View,Android Windowmanager,注意 如果有人知道如何通过windowmanager订购(z-order)Windows,我也会接受答案,因为它将回答所有问题。实际上,我发现只需执行windowManager.removeView(MyView)立即跟随windowManager.addView(MyView)即可将一个视图放在另一个视图之前,但这并不理想,因为这样可以直观地删除和添加视图。看起来很疯狂,他们在android中没有内置功能来做这么简单的思考 我创建了一个包含编辑文本的视图(linearlayout)。我通过W
windowManager.removeView(MyView)
立即跟随windowManager.addView(MyView)
即可将一个视图放在另一个视图之前,但这并不理想,因为这样可以直观地删除和添加视图。看起来很疯狂,他们在android中没有内置功能来做这么简单的思考
我创建了一个包含编辑文本的视图(linearlayout)。我通过WindowManager.addView(视图、布局参数)将此视图添加到活动中 但我有一个问题,edittext将生成的每个弹出窗口(如复制/过去菜单或单词建议菜单)将位于其他视图下,甚至位于它们自己的edittext视图下(而不是在图片上edittext具有透明背景) 我会的 我使用以下布局参数创建视图(即:LinearLayout):
protected WindowManager.LayoutParams createLayoutParams() {
WindowManager.LayoutParams p = new WindowManager.LayoutParams();
p.gravity = Gravity.LEFT | Gravity.TOP;
p.width = 0;
p.height = 0;
p.format = PixelFormat.TRANSLUCENT;
p.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED;
p.flags = NOT_FOCUSABLE_FLAGS;
// TYPE_APPLICATION allows for popups in browser windows (like edit menus)
p.type = WindowManager.LayoutParams.TYPE_APPLICATION;
p.token = null;
return p;
}
我显示的视图(仅包含编辑文本)如下所示:
private final WindowManager mWindowManager;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams lp = createLayoutParams();
mWindowManager.addView(view, lp);
那么,如何使弹出窗口连接到所有内容前面的编辑文本
这个问题可能也会有一些帮助(关于窗口视图的z顺序):这是意料之中的,如果您看到DecorView的文档,它会为您提供当前视图的背景 您正在做的是启动decorview上的操作栏,因此它将出现在背景中。 阅读本文了解更多细节 要解决此问题,需要获取当前视图,您可以使用
View focusedView=(View)yourParentView.getFocusedChild() 这可能对你有帮助,试试看 关键答案是 在res/style.xml中,定义一个新主题扩展原始主题:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Black.NoTitleBar.ActionModeOverlay"
parent="android:Theme.Black.NoTitleBar">
<item name="android:windowActionModeOverlay">true</item>
</style>
</resources>
真的
或者,如果已经定义了一行,就在主题中添加一行true
让您的活动使用上面在AndroidManifest.xml中定义的主题:
<activity
android:name="you.AppActivity"
android:theme="@style/ActionModeOverlay" >
尝试
WindowManager.LayoutParams.TYPE\u SYSTEM\u警报代码>
而不是WindowManager.LayoutParams.TYPE_应用程序代码>他们实际上无法通过windowmanager订购(z-order)窗口。唯一的方法是删除窗口并重新添加。将浮动工具栏的背景更改为颜色。白色
而不是透明。谢谢ishita,但如何操作?抱歉,这可能不是问题所在。您是否在代码中的任何地方调用startActionMode()
?如果是,您要传递给它的类型是什么?您需要setType(ActionMode.TYPE\u FLOATING)
才能将ActionMode
视为浮动工具栏。您使用的类型是否正确?是的,我仅从MyEditText@override public ActionMode startActionMode(ActionMode.Callback Callback,int-type){…}调用它,ActionMode.type_浮动偏离路线(否则,您甚至看不到靠近edittextPost的actionbar布局XML。您是否向任何小部件添加了提升?谢谢Ashih,但是如何在当前视图中统计浮动actionbar?因为正如您在当前视图中看到的startactionmode(即:edittext)不工作,这就是我被迫从decorview调用startactionmode的原因。你是什么意思,你不能调用getActivity().startactionmode(mActionModeCallback);不,它没有帮助:(事实上,在棉花糖中,它不再是顶部的静态actionbar,而是“浮动的”actionbar.ohh,我会尝试给你一个更好的解决方案。@Loki你可以试试这个:正如你已经注意到的,使用反射是其中一种方法。我非常确定这是唯一的一种。如果你对我使用该菜单所做的事感兴趣,请查看Carbon。它的EditText几乎满足了你的需要,但也有反射。代码片段是粘贴到这里太长了,但是这里有链接:谢谢jasmin,但是当我查看代码时,我不明白它们在复制/过去菜单中的作用是什么?因为看起来它们只在编辑文本的设计上起作用(如角、立面等)不,很遗憾……因为我在使用类型为\系统\警报(而不是我现在使用的类型为\应用程序)的多个窗口之间进行z排序时会遇到同样的问题。注意:创建窗口后,您不能更改窗口的类型