在项目开发中,经常需要对TextView长按操作进行处理,弹出相应的菜单栏。
要想让TextView支持长按弹出菜单栏,需要将android:textIsSelectable属性设置为true值。
android:textIsSelectable="true"
这样虽然能让TextView支持长按唤起系统菜单栏,但是如果需要定制菜单栏,该怎么做呢?
这时候就要用到 TextVIew#setCustomSelectionActionModeCallback(ActionMode.Callback) 方法。
textView.customSelectionActionModeCallback =
CustomSelectionActionModeCallback(context, textView)
只需要实现ActionMode.Callback重写其方法即可自定义菜单。
class CustomSelectionActionModeCallback(val context: Context, val view: TextView?) :
ActionMode.Callback {
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
menu?.let {
it.clear()
it.add(Menu.NONE, android.R.id.copy, 0, android.R.string.copy)
it.add(Menu.NONE, android.R.id.shareText, 2, R.string.share)
}
return true
}
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
val selStart: Int = view?.selectionStart ?: 0
val selEnd: Int = view?.selectionEnd ?: 0
val min = 0.coerceAtLeast(selStart.coerceAtMost(selEnd))
val max = 0.coerceAtLeast(selStart.coerceAtLeast(selEnd))
val content = view?.text?.subSequence(min, max)
if (TextUtils.isEmpty(content)) {
return true
}
when (item?.itemId) {
android.R.id.copy -> {
val manager =
context?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager
val copyData = ClipData.newPlainText(null, content)
try {
manager?.setPrimaryClip(copyData)
Toast.makeText(context,R.string.copied_text_to_clipboard,Toast.LENGTH_SHORT).show()
} catch (t: Throwable) {
t.printStackTrace()
} finally {
mode?.finish()
}
}
android.R.id.shareText -> {
try {
val shareBuilder = ShareCompat.IntentBuilder(context)
shareBuilder.setText(content)
shareBuilder.setType("text/plain")
shareBuilder.startChooser()
} catch (t: Throwable) {
t.printStackTrace()
} finally {
mode?.finish()
}
}
}
return true
}
override fun onDestroyActionMode(mode: ActionMode?) {
}
}
如何自定义选择器样式呢?
在styles.xml的主题中修改
<item name="colorControlActivated">@color/colorPrimary</item>
可以对选择器手柄的颜色进行更改。
在TextVIew中添加
android:textColorHighlight="@color/colorPrimary"
可以对选择的文本高亮的颜色进行更改。
感谢大家的支持,如有错误请指正,如需转载请标明原文出处!