请 Android 大咖帮忙,下 EditText 控件被 ActionBar 改变位置问题!

2015-11-18 14:20:56 +08:00
 xpol
我在 Cocos2d 游戏中使用 Android EditText 控件。

其他都很正常,但是在我选中 EditBox 中的文字的时候, "Select Cut Copy Paste" 动作条出现在屏幕上方,同时我的 EditBox 文字位置下移,如下图:

[![compare][1]][1]

我肯定不需要这个的结果,我想要如下,当我选中的时候,虽然上方出现动作条,但是我的 EditBox 应该保持再原来的位置,比如下图这样:

[![enter image description here][2]][2]

这里是我使用的 EditBox 设置位置的代码:

```java
public void setEditBoxViewRect(int left, int top, int maxWidth, int maxHeight) {
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
layoutParams.leftMargin = left;
layoutParams.topMargin = top;
layoutParams.width = maxWidth;
layoutParams.height = maxHeight;
layoutParams.gravity = Gravity.TOP | Gravity.LEFT;
this.setLayoutParams(layoutParams);
}
```
完整代码见 [GitHub: cocos2d/cocos2d-x Cocos2dxEditBox.java]( https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBox.java)



当前我的 Workaround 是这样的,关掉 ActionBar :

```java
edittext.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}

public void onDestroyActionMode(ActionMode mode) {

}

public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return false;
}

public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
});
```

我猜问题的原因是不是因为我设置的是绝对坐标,没有使用布局的原因。当然在游戏里希望直接的位置设定。那么我能不能在入上面的 workaround 的 onCreateActionMode 获得 ActionBar 的高度,然后临时调整 EditBox 的位置呢?或者一般大家遇到这样情况的时候是怎么解决的呢?


[1]: http://i.stack.imgur.com/3kAk0.png
[2]: http://i.stack.imgur.com/qhOOb.png
5034 次点击
所在节点    Android
2 条回复
cppgohan
2015-11-18 15:39:06 +08:00
主题 style 里加上
```
<item name="android:windowActionModeOverlay">true</item>
```
xpol
2015-11-19 22:17:36 +08:00
@cppgohan 感谢。
我之前惜 xml 没写对 AndroidManifest.xml 也没有设置。

下面是最终解决的相对完整的文件:

res/style.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="ActionModeOverlay" parent="android:Theme.Black.NoTitleBar">
<item name="android:windowActionModeOverlay">true</item>
</style>
</resources>


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" >

...

<application android:label="@string/app_name"
android:icon="@drawable/icon"
android:allowBackup="false">

<activity android:name="my.application.AppActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:configChanges="orientation"
android:theme="@style/ActionModeOverlay">

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/237051

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX