Выбрать + скопировать текст в TextView?
Есть ли способ разрешить пользователю выбирать/копировать текст в 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", но без этого курсор присутствует даже без выбора.
Ответы
Ответ 1
android: textIsSelectable работает (по крайней мере, в ICS - я еще не проверял более ранние версии)
<TextView
android:id="@+id/deviceIdTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true"
android:text="" />
Ответ 2
Текстовый вид должен быть включен, настраивается, 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" />
Ответ 3
Я думаю, что у меня есть лучшее решение.
Просто позвоните
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 text in clipboard
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipboard.setText(yourTextView.getText());
}
Надеюсь, это поможет вам и всем, кто ищет способ скопировать текст из TextView
Ответ 4
Я пытаюсь реализовать то же самое, и ваш вопрос помог мне правильно настроить макет editext. Так что спасибо!:)
Тогда я понял, что подсветка на самом деле будет видимой, если курсор включен.
Но я просто хочу, чтобы вы не хотели видеть курсор, прежде чем нажимать на текст, поэтому я прячу курсор в файле layout.xml так же, как вы, и добавил eventlistener для длинного клика и отобразил курсор только при начале выбора.
Итак, добавьте слушателя в свою активность в разделе onCreate:
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;
}
});
}
И вначале нет курсора в начале, и если вы долго нажимаете, курсор появляется с границами выделения.
Надеюсь, что смогу помочь.
Cheers,
фм
Ответ 5
Я также пытался сделать что-то подобное, но все же нуждался в индивидуальном подходе с манипуляцией подсветкой текста в 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();
}
Я надеюсь, что это поможет кому-то, кто закончит этот вопрос:)
Ответ 6
Просто используйте эту простую библиотеку:
GitHub: Выбираемый TextView