我正在使用ActionMode.Callback
,但我需要知道文本何时完成选择......例如
问问题
5859 次
3 回答
3
在 .xml 中:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true" />
在班上:
textview.setCustomSelectionActionModeCallback(new callback(textview));
...
public class callback implements Callback {
private TextView mTextView;
public callback(TextView text) {
this.mTextView = text;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
int start = mTextView.getSelectionStart();
int end = mTextView.getSelectionEnd();
Spannable wordtoSpan = (Spannable) mTextView.getText();
switch (item.getItemId()) {
case R.id.item_blue:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE), start
, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.BLUE);
return true;
case R.id.item_green:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.GREEN), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.GREEN);
return true;
case R.id.item_red:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.RED), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.RED);
return true;
case R.id.item_yellow:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.YELLOW), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.YELLOW);
return true;
case R.id.item_erase:
wordtoSpan.setSpan(new BackgroundColorSpan(Color.TRANSPARENT), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.TRANSPARENT);
return true;
}
return false;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.setTitle("Selecione a cor");
mode.getMenuInflater().inflate(R.menu.menu_text_context, menu);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
menu.removeItem(android.R.id.selectAll);
// Remove the "cut" option
menu.removeItem(android.R.id.cut);
// Remove the "copy all" option
menu.removeItem(android.R.id.copy);
return true;
}
}
于 2015-01-16T18:03:26.417 回答
2
我想你可以在这里找到你的答案:
ActionMode
如果您的目标是蜂窝或更新的,您在这里寻找的关键术语是 ,以帮助您进行研究。API 文档(向下滚动到“使用上下文操作模式)可以很好地解释事物,一旦你找到你正在寻找的东西,这是他们使用的最大障碍,但基本上你会需要什么要做的是:
- 将您
EditText
的设置为可选(android:textIsSelectable="true"
或setTextIsSelectable(true);
- 实现
ActionMode.Callback
接口并提供您自己的菜单项。注意:如上所述,这仅适用于 API 级别 11+。如果您针对的是较早的平台,则获取文本选择的事件要复杂得多。
于 2013-06-14T10:53:54.323 回答
0
如果您需要没有 ActionMode 的监听器:
import android.content.Context
import android.util.AttributeSet
import android.widget.TextView
class TextViewWithObservableSelection @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
defStyleRes: Int = 0
) : TextView(
context,
attrs,
defStyleAttr,
defStyleRes
) {
private var selectedText: String = ""
set(value) {
if (field != value) {
field = value
observer?.invoke(value)
}
}
private var observer: ((String) -> Unit)? = null
set(value) {
field = value
field?.invoke(selectedText)
}
override fun onSelectionChanged(selStart: Int, selEnd: Int) {
super.onSelectionChanged(selStart, selEnd)
val startIndex = minOf(selStart, selEnd)
val endIndex = maxOf(selStart, selEnd)
selectedText = text.toString().substring(startIndex, endIndex)
}
fun observeSelectedText(observer: ((String) -> Unit)?) {
this.observer = observer
}
}
于 2019-09-28T03:52:08.973 回答