用于显示文本选择句柄的 EditText 的自定义剪切/复制操作栏 [英] Custom cut/copy action bar for EditText that shows text selection handles
问题描述
我有一个应用程序,我希望能够显示一个 TextView(或 EditText),允许用户选择一些文本,然后按一个按钮来处理该文本.在 Honeycomb 之前的 Android 版本上实现这一点没有问题,但在 Honeycomb 及更高版本上,默认的长按操作是显示带有复制/剪切/粘贴选项的操作栏.我可以截取长按以显示我自己的操作栏,但是我没有显示文本选择句柄.
I have an app where I want to be able to show a TextView (or EditText) that allows the user to select some text, then press a button to have something done with that text. Implementing this on Android versions prior to Honeycomb is no problem but on Honeycomb and above the default long-press action is to show an action bar with Copy/Cut/Paste options. I can intercept long-press to show my own action bar, but then I do not get the text selection handles displayed.
一旦我启动了自己的 ActionMode,我该如何显示文本选择句柄?
Once I have started my own ActionMode how do I get the text selection handles displayed?
这是我用来启动 ActionMode 的代码,除了没有显示文本选择句柄之外,它可以工作:
Here is the code I'm using to start the ActionMode, which works except there are no text selection handles displayed:
public boolean onLongClick(View v) {
if(actionMode == null)
actionMode = startActionMode(new QuoteCallback());
return true;
}
class QuoteCallback implements ActionMode.Callback {
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.quote, menu);
return true;
}
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId()) {
case R.id.quote:
Log.d(TAG, "Selected menu");
mode.finish();
// here is where I would grab the selected text
return true;
}
return false;
}
public void onDestroyActionMode(ActionMode mode) {
actionMode = null;
}
}
推荐答案
我想出了自己问题的答案;TextView(因此 EditText)有一个方法 setCustomSelectionActionModeCallback()
应该用来代替 startActionMode()
.使用它可以自定义 TextView 用于文本选择的菜单.示例代码:
I figured out the answer to my own question; TextView (and therefore EditText) has a method setCustomSelectionActionModeCallback()
which should be used instead of startActionMode()
. Using this enables customisation of the menu used by TextView for text selection. Sample code:
bodyView.setCustomSelectionActionModeCallback(new StyleCallback());
StyleCallback 通过移除 Select All 并添加一些样式操作来自定义文本选择菜单:
where StyleCallback customises the text selection menu by removing Select All and adding some styling actions:
class StyleCallback implements ActionMode.Callback {
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
Log.d(TAG, "onCreateActionMode");
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.style, menu);
menu.removeItem(android.R.id.selectAll);
return true;
}
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
Log.d(TAG, String.format("onActionItemClicked item=%s/%d", item.toString(), item.getItemId()));
CharacterStyle cs;
int start = bodyView.getSelectionStart();
int end = bodyView.getSelectionEnd();
SpannableStringBuilder ssb = new SpannableStringBuilder(bodyView.getText());
switch(item.getItemId()) {
case R.id.bold:
cs = new StyleSpan(Typeface.BOLD);
ssb.setSpan(cs, start, end, 1);
bodyView.setText(ssb);
return true;
case R.id.italic:
cs = new StyleSpan(Typeface.ITALIC);
ssb.setSpan(cs, start, end, 1);
bodyView.setText(ssb);
return true;
case R.id.underline:
cs = new UnderlineSpan();
ssb.setSpan(cs, start, end, 1);
bodyView.setText(ssb);
return true;
}
return false;
}
public void onDestroyActionMode(ActionMode mode) {
}
}
菜单添加的 XML 是:
The XML for the menu additions is:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/italic"
android:showAsAction="always"
android:icon="@drawable/italic"
android:title="Italic"/>
<item android:id="@+id/bold"
android:showAsAction="always"
android:icon="@drawable/bold"
android:title="Bold"/>
<item android:id="@+id/underline"
android:showAsAction="always"
android:icon="@drawable/underline"
android:title="Underline"/>
</menu>
这篇关于用于显示文本选择句柄的 EditText 的自定义剪切/复制操作栏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!