有没有办法允许用户在TextView中选择/复制文本?我需要EditText的相同功能,你可以长按控件并获得select all / copy的弹出选项,但我需要控件看起来像TextView。
尝试使用EditText使用editable =“none”选项或inputType =“none”,但仍保留EditText的框架背景,这是我不想要的,
由于
-------更新----------------------
这是99%,我想要的是选择hilight是可见的(橙色的东西)。除此之外,它可以忍受这一点:
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="false"
style="?android:attr/textViewStyle"
android:textColor="@color/white"
android:textAppearance="@android:style/TextAppearance.Medium"
android:cursorVisible="false"
android:background="@null" />
我猜它是由于cursorVisible =“false”而引起的,但如果没有任何选择,光标就会出现。
答案 0 :(得分:193)
android:textIsSelectable 有效(至少在ICS中 - 我还没有在早期版本中检查过)
<TextView
android:id="@+id/deviceIdTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true"
android:text="" />
答案 1 :(得分:35)
需要启用文本视图,可聚焦,longClickable和textIsSelectable
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/pwTextView"
android:enabled="true"
android:textIsSelectable="true"
android:focusable="true"
android:longClickable="true" />
答案 2 :(得分:21)
我认为我有更好的解决方案。
只需拨打
registerForContextMenu(yourTextView);
将注册您的TextView
以接收上下文菜单事件。
然后覆盖onCreateContextMenu
Activity
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
//user has long pressed your TextView
menu.add(0, v.getId(), 0, "text that you want to show in the context menu - I use simply Copy");
//cast the received View to TextView so that you can get its text
TextView yourTextView = (TextView) v;
//place your TextView's text in clipboard
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipboard.setText(yourTextView.getText());
}
希望这可以帮助您和其他任何人寻找从TextView
答案 3 :(得分:7)
{{1}}
这将使用户能够通过长按或正常情况选择和复制文本
答案 4 :(得分:5)
我正在尝试实现相同的功能,您的问题帮助我正确设置了我的editext布局。那谢谢啦! :)
然后我意识到,如果光标打开,高亮显示实际上是可见的。 但我只是喜欢你不想在长按文本之前看到光标,所以我将光标隐藏在layout.xml文件中,就像你一样,并添加了一个eventlistener进行长时间点击并仅在选择开始时显示光标
所以在onCreate部分的Activity中添加监听器:
public TextView htmltextview;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...
htmltextview.setOnLongClickListener(new OnLongClickListener(){
public boolean onLongClick(View v) {
htmltextview.setCursorVisible(true);
return false;
}
});
}
瞧,开头没有光标,如果长按,光标会出现选择边界。
我希望我能提供帮助。
干杯, FM
答案 5 :(得分:5)
button.setTextIsSelectable(true)
var TextView.selectable
get() = isTextSelectable
set(value) = setTextIsSelectable(value)
然后打电话
textview.selectable = true
// or
if (textview.selectable) { ...
如果要在用户长按查看时自动复制,这是必需的基本代码:
myView.setOnLongClickListener {
val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("Copied String", myString)
clipboardManager.setPrimaryClip(clip)
true // Or false if not consumed
}
您可能想添加一个Toast
以确认它发生了
myView.copyOnHold() // pass custom string to not use view contents
fun TextView.copyOnHold(customText: String? = null) {
setOnLongClickListener {
val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("Copied String", customText ?: text)
clipboardManager.setPrimaryClip(clip)
true // Or false if not consumed
}
}
将此添加到您的<TextView>
android:textIsSelectable="true"
注意:所有这些都需要
android:enabled="true"
和android:focusable="true"
,这是TextView
的默认值。
答案 6 :(得分:1)
我也尝试做类似的事情但仍然需要一种自定义方法来操纵TextView中的文本突出显示。我在LongClick
操作上触发了突出显示和复制。
这是我使用SpannableString
管理的方式:
SpannableString highlightString = new SpannableString(textView.getText());
highlightString.setSpan(new BackgroundColorSpan(ContextCompat.getColor(getActivity(), R.color.gray))
, 0, textView.getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(highlightString);
copyToClipboard(urlToShare);
和复制功能:
public void copyToClipboard(String copyText) {
ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("url", copyText);
clipboard.setPrimaryClip(clip);
Toast toast = Toast.makeText(getActivity(), "Link is copied", Toast.LENGTH_SHORT);
toast.show();
}
我希望对最终解决这个问题的人有所帮助:)
答案 7 :(得分:-4)
只需使用这个简单的库: GitHub: Selectable TextView