Android TextView自定义长按菜单

在项目开发中,经常需要对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的主题中修改

@color/colorPrimary

可以对选择器手柄的颜色进行更改。

在TextVIew中添加

android:textColorHighlight="@color/colorPrimary"

可以对选择的文本高亮的颜色进行更改。

感谢大家的支持,如有错误请指正,如需转载请标明原文出处!

你可能感兴趣的:(android,kotlin,TextView)