如何在 Android 中以编程方式选择或突出显示 TextView?

How to selected or highlight TextView programmatically in Android?

目前,我正在开发一个阅读小应用。有一个文本视图来显示文本。我们可以为文本添加书签并存储在列表视图中。我想从列表视图中单击并突出显示或 select 文本视图中的书签索引。我可以得到 bookmark_index。有没有像textview.setSelect(Start,Length)这样的方法?或者任何图书馆都可以做到吗?感谢

请查看图片以了解我的想法。

使用 Spannable

Spannable WordtoSpan = new SpannableString("partial colored text");        
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), startIndex, stopIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(WordtoSpan);

这取决于您希望支持的最低 Android 版本。

在 3.0+(API 级别 11 及更高版本)上,TextView 具有 textIsSelectable 属性,可启用此行为。例如:

<TextView
    android:id="@+id/deviceIdTV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true"
    android:text="" />

或者您可以使用如下所示的 span 自行实现此功能。

TextView myTV = (TextView)findViewById(R.id.textView1);
String  textString = "Whosebug Rocks!!!"; 
Spannable spanText = Spannable.Factory.getInstance().newSpannable(textString);
spanText.setSpan(new BackgroundColorSpan(0xFFFFFF00), 14, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
myTV.setText(spanText);

也许此解决方案可以帮助您配置菜单或文本选择。

我希望文本可以选择(用于复制和粘贴)或希望其他手势起作用。

  • 在布局文件中或以编程方式将 textIsSelectable 设置为 false。
  • 使用您的手势在文本视图上设置一个 onTouchListener。
  • 允许其中一种手势切换到文本选择模式。见下文。

如何以编程方式设置textSelection?

  • 将 textIsSelectable、focusable、longPressable 设置为 true
  • 将 onTouchListener 设置为空。
  • 安装点击侦听器以切换回正常手势/菜单。

1) 安装您的 GestureHandler:

// Create your Touch Listener  
onTouchListener = new OnSwipeTouchListener(mCtx, this);
view.setOnTouchListener( onTouchListener);

2) 切换到文本选择方式:

// Create your popup with an menu option to switch to textselection modus:
PopupMenu popup = new PopupMenu(mCtx, view);
popup.inflate(R.menu.text_options_menu);
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case ...
            case R.id.text_textisselectable:
                view.setOnTouchListener(null);
                ((TextView)view).setTextIsSelectable( true);
                ((TextView)view).setFocusable( true);
                ((TextView)view).setLongClickable( true);
                // Install a click listener to switch back to the previous Touch Listener
                ((TextView)view).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        PopupMenu popupx = new PopupMenu(mCtx, view);
                        popupx.inflate(R.menu.selecttext_back_menu);
                        popupx.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                            @Override
                            public boolean onMenuItemClick(MenuItem item) {
                                ((TextView)view).setTextIsSelectable( false);
                                ((TextView)view).setFocusable( false);
                                ((TextView)view).setLongClickable( false);
                                view.setOnTouchListener(onTouchListener);
                                return true;
                            }});
                            popupx.show();
                        }
                    });
                break;

以上所有解决方案都不适合我。 然后我在 XML 中添加了 android:textIsSelectable="true",但是没有用。

它的工作原理是添加textView.setTextIsSelectable(true) 在您的 activity 或片段或适配器中。