我很长时间都在寻找这个问题的解决方案,所以我决定在这里问一下。
我正在编写记事本应用程序,点击“新备注”选项后,会出现新的活动,如下所示:
由于我的应用程序概念允许用户通过格式文本菜单编辑文本(在屏幕底部可见)我想允许用户选择文本,而不在底部和复制/剪切/粘贴菜单上显示键盘< / strong>即可。通过切换按钮加入键盘(在2行代码上工作得非常好)
我通过以下代码在EditText上设置焦点时禁用了键盘弹出窗口:
public static void disableSoftInputFromAppearing(EditText editText) {
if (Build.VERSION.SDK_INT >= 11) {
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);
} else {
editText.setRawInputType(InputType.TYPE_NULL);
editText.setFocusable(true);
}
}
应用工具栏上的键盘按钮调用的方法:
public void toggleKeyboard(MenuItem item) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
}
我想选择文字(通过双击文字或长按文字来实现),但主要问题是复制/剪切/粘贴工具栏,因为它覆盖了我的应用工具栏:
这就是为什么我想摆脱这个工具栏,但仍然有可能选择特定的文本范围。
P.S。手机型号:HTC One M7
任何帮助将不胜感激
祝你好运, 汤姆
答案 0 :(得分:1)
对于API级别11或更高版本,您可以停止复制,粘贴,剪切和自定义上下文菜单。
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;
}
});
从onCreateActionMode(ActionMode,Menu)返回false将阻止启动操作模式(选择全部,剪切,复制和粘贴操作)。 最初回答HERE
解决方案:在EditText中覆盖isSuggestionsEnabled和canPaste。
对于快速解决方案,请复制下面的类 - 此类会覆盖EditText类,并相应地阻止所有事件。
对于细节,请继续阅读。
解决方案在于防止PASTE / REPLACE菜单出现在(未记录的)android.widget.Editor类的show()方法中。在菜单出现之前,检查是否(!canPaste&amp;&amp;!canSuggest)返回;。用作设置这些变量的基础的两个方法都在EditText类中:
isSuggestionsEnabled()
是公开的,因此可能会被覆盖。
canPaste()
不是,因此必须通过在派生类中引入相同名称的函数来隐藏它。
因此,将这些更新合并到一个也具有setCustomSelectionActionModeCallback
的类中,并禁用长按,这里是完整的类,以防止所有编辑(但仍然显示文本选择处理程序)来控制游标:
package com.cjbs.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
/**
* This is a thin veneer over EditText, with copy/paste/spell-check removed.
*/
public class NoMenuEditText extends EditText
{
private final Context context;
/** This is a replacement method for the base TextView class' method of the same name. This
* method is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup
* appears when triggered from the text insertion handle. Returning false forces this window
* to never appear.
* @return false
*/
boolean canPaste()
{
return false;
}
/** This is a replacement method for the base TextView class' method of the same name. This method
* is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup
* appears when triggered from the text insertion handle. Returning false forces this window
* to never appear.
* @return false
*/
@Override
public boolean isSuggestionsEnabled()
{
return false;
}
public NoMenuEditText(Context context)
{
super(context);
this.context = context;
init();
}
public NoMenuEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
init();
}
public NoMenuEditText(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
this.context = context;
init();
}
private void init()
{
this.setCustomSelectionActionModeCallback(new ActionModeCallbackInterceptor());
this.setLongClickable(false);
}
/**
* Prevents the action bar (top horizontal bar with cut, copy, paste, etc.) from appearing
* by intercepting the callback that would cause it to be created, and returning false.
*/
private class ActionModeCallbackInterceptor implements ActionMode.Callback
{
private final String TAG = NoMenuEditText.class.getSimpleName();
public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; }
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; }
public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; }
public void onDestroyActionMode(ActionMode mode) {}
}
}
最初回答HERE2