Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.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 为什么我的EditText复制/粘贴菜单位于EditText下?如何更改弹出窗口的z顺序?_Android_Android Layout_Android Edittext_Android View_Android Windowmanager - Fatal编程技术网

Android 为什么我的EditText复制/粘贴菜单位于EditText下?如何更改弹出窗口的z顺序?

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订购(z-order)Windows,我也会接受答案,因为它将回答所有问题。实际上,我发现只需执行
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排序时会遇到同样的问题。注意:创建窗口后,您不能更改窗口的类型