【问题标题】:How to selected or highlight TextView programmatically in Android?如何在 Android 中以编程方式选择或突出显示 TextView?
【发布时间】:2017-01-20 09:38:03
【问题描述】:
目前,我正在创建一个用于阅读的小应用程序。有一个文本视图来显示文本。我们可以为文本添加书签并存储在列表视图中。我想从列表视图中单击它并突出显示或选择文本视图中的书签索引。我可以得到bookmark_index。有没有像textview.setSelect(Start,Length) 这样的方法?或者任何图书馆都可以做到?谢谢
请查看图片以了解我的想法。
【问题讨论】:
标签:
android
textview
highlight
【解决方案1】:
使用 Spannable
Spannable WordtoSpan = new SpannableString("partial colored text");
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), startIndex, stopIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(WordtoSpan);
【解决方案2】:
上述所有解决方案都不适合我。
然后我在 XML 中添加了android:textIsSelectable="true",但它不起作用。
它起作用的原因是添加textView.setTextIsSelectable(true)
在您的活动、片段或适配器中。
【解决方案3】:
这取决于您希望支持的最低 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 = "StackOverFlow Rocks!!!";
Spannable spanText = Spannable.Factory.getInstance().newSpannable(textString);
spanText.setSpan(new BackgroundColorSpan(0xFFFFFF00), 14, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
myTV.setText(spanText);
【解决方案4】:
也许此解决方案将帮助您配置菜单或文本选择。
我希望文本是可选择的(用于复制和粘贴)或希望其他手势起作用。
- 在布局文件中或以编程方式将 textIsSelectable 设置为 false。
- 使用手势在文本视图上设置 onTouchListener。
- 允许其中一种手势切换到 textSelection 模式。见下文。
如何以编程方式设置 textSelection?
- 将 textIsSelectable、focusable、longPressable 设置为 true
- 将 onTouchListener 设置为 null。
- 安装点击监听器以切换回正常手势/菜单。
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;