Скопируйте текст из TextView на Android
У меня есть ListView
где каждый элемент является TextView
,
Я хочу включить длинное нажатие, похожее на EditText
которое отображает контекстное меню по умолчанию с такими пунктами, как "Выбрать все", "Вырезать все", "Копировать все" и т. д.
Есть ли простой способ включить это для TextView
?
4 ответа
Я думаю, что у меня есть решение. Просто позвони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
Чтобы позволить пользователям скопировать некоторые или все значения TextView и вставить их в другое место,
установить атрибут XML {@link android.R.styleable#TextView_textIsSelectable android:textIsSelectable}
в "true"
или же
вызов {@link #setTextIsSelectable setTextIsSelectable(true)}
,
На самом деле, вам не нужно разрабатывать эту функцию самостоятельно. Вам просто нужно использовать EditText вместо TextView, в то время как вы устанавливаете для android:editable of EditText значение false. Мой код здесь:
R.layout.edittext.xml
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="40dip"
android:editable="false"
android:background="@null"
android:textColor="#FFFFFF"/>
ListItemCopyTextActivity.java
public class ListItemCopyTextActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
ListView lv = new ListView(this);
String[] values = new String[15];
for (int i = 0; i < 15; i++) {
values[i] = "ListItem NO." + i;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.edittext, values);
lv.setAdapter(adapter);
ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
setContentView(ll);
}
}
Вы можете просто долго нажимать на элемент и выбирать текст, копировать, вырезать, прошлое и т. Д.
Возможно, вы захотите зарегистрировать onItemLongClickListener в вашем ListView, а затем, основываясь на выбранном элементе, предоставить пользователю любые параметры, которые вы выберете.
У меня есть решение, но я не совсем полезен.
просто используйте этот метод:
txtDescDetail.setCursorVisible(true);
я надеюсь сделать это.
Вот решение
<TextView
android:id="@+id/textID"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:clickable="true"
android:focusable="true"
android:text="Terms and Conditions"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
отменять
setOnLongClickListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textID.setTextIsSelectable(true)
textID. setOnLongClickListener {
val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("Copied String", textID.text)
clipboardManager.setPrimaryClip(clip)
true // Or false if not consumed
}
}
ожидаемое поведение будет таким, как на изображении ниже
https://s tackru.com/images/da0f864a0f10e298f3e75326ecc774f922d36f2d.png