我有一个ListView
,其中每个项目都是TextView
。
我想启用类似于EditText
的长按行为,显示默认上下文菜单,其中包含“全部选中”,“全部剪切”,“全部复制”等项目。
是否有一种简单的方法可以为TextView
启用此功能?
答案 0 :(得分:20)
我想我有一个解决方案。
只需拨打
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
答案 1 :(得分:7)
实际上,您不必自己开发此功能。您只需要使用EditText而不是TextView,而将EditText的android:editable设置为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);
}
}
您只需长按该项目,然后选择选择文字,复制,剪切,过去等。
答案 2 :(得分:3)
要允许用户复制部分或全部TextView的值并将其粘贴到其他位置,
将XML属性{@link android.R.styleable#TextView_textIsSelectable android:textIsSelectable}
设置为"true"
或
致电{@link #setTextIsSelectable setTextIsSelectable(true)}
。
答案 3 :(得分:1)
您可能希望在ListView上注册onItemLongClickListener,然后根据所选项目,为用户提供您选择的任何选项。
答案 4 :(得分:0)
我有一个解决方案,但并不是完全有用。
只需使用此方法:
txtDescDetail.setCursorVisible(true);
我希望这样做。
答案 5 :(得分:0)
这是解决方案
<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
}
}
预期的行为将类似于下图