我希望禁用当您选择一些文本时显示的本机上下文菜单,即带有、 和select all按钮copy的文本。但是,我不想自己禁用选择。理想情况下,我实际上希望扩展菜单,但老实说,我完全可以禁用它。使用文本字段等,从我找到的文档来看,它往往相对简单,但我只是想不出一种方法来使用/ 。可能是我只是在完全错误的角落里搜索。sharesearchXWalkView
CordovaWebView
问问题
1145 次
4 回答
1
我有一个解决方法。
因为WebView
有一个解决方案,但它不适用于XWalkView
:
我的毕业生包括compile 'org.xwalk:xwalk_core_library:14.43.343.17'
我的解决方案,onAttachedToWindow
方法中的主要思想:
public class XWalkWebView extends XWalkView {
public XWalkWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
private ActionMode.Callback mOriginalCallback;
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
try {
View innerChild = ((ViewGroup) getChildAt(0)).getChildAt(0);
Field contentViewField = innerChild.getClass().getDeclaredField("mContentView");
contentViewField.setAccessible(true);
XWalkContentView xWalkContentView = (XWalkContentView) contentViewField.get(innerChild);
Field contentViewCoreField = xWalkContentView.getClass().getSuperclass().getDeclaredField("mContentViewCore");
contentViewCoreField.setAccessible(true);
ContentViewCore viewCore = (ContentViewCore) contentViewCoreField.get(xWalkContentView);
viewCore.setContainerView(this);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
mOriginalCallback = callback;
ActionMode.Callback c = new // your callback...
return super.startActionMode(c);
}
}
于 2015-10-02T08:31:22.310 回答
0
这是一个旧帖子,但我无法找到另一个解决方案。
在人行横道视图中禁用上下文选项的简单解决方法..
- 将您的人行横道项目转到 res/menu/select_action_menu.xml
- 删除或评论您不想显示的项目
- 保存、构建和运行
于 2018-12-11T19:47:26.063 回答
0
我尝试了 Warabei 的解决方案,但它不适用于 15.44.384.13。我改进以找到 ContentViewCore 跨版本:
public class XWalkWebView extends XWalkView {
...
private Field getFields(Class clazz){
for(Field field:clazz.getDeclaredFields()){
if(ContentViewCore.class == field.getType()){
return field;
}
}
clazz = clazz.getSuperclass();
if(clazz!=null && clazz!=Object.class){
Field field = getFields(clazz);
if(field!=null)return field;
}
return null;
}
private void inject(View view){
Field field = getFields(view.getClass());
if(field!=null){
field.setAccessible(true);
try {
ContentViewCore viewCore = (ContentViewCore) field.get(view);
viewCore.setContainerView(this);
return;
}catch(Exception e){
}
}
if(view instanceof ViewGroup){
ViewGroup viewGroup = (ViewGroup)view;
int count = viewGroup.getChildCount();
for(int i = 0;i<count;i++){
inject(viewGroup.getChildAt(i));
}
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
inject(this);
}
...
要禁用上下文选择菜单:
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
return new ActionMode() {
@Override
public void setTitle(CharSequence charSequence) {
}
@Override
public void setTitle(int i) {
}
@Override
public void setSubtitle(CharSequence charSequence) {
}
@Override
public void setSubtitle(int i) {
}
@Override
public void setCustomView(View view) {
}
@Override
public void invalidate() {
}
@Override
public void finish() {
}
@Override
public Menu getMenu() {
return null;
}
@Override
public CharSequence getTitle() {
return null;
}
@Override
public CharSequence getSubtitle() {
return null;
}
@Override
public View getCustomView() {
return null;
}
@Override
public MenuInflater getMenuInflater() {
return null;
}
};
}
于 2015-11-27T07:57:35.920 回答
-2
正如cordova模板中给出的那样,这个CSS应该防止Android和IOS中的上下文菜单
* {
-webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */
}
body {
-webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */
-webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */
-webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */
}
于 2014-10-31T20:14:39.567 回答