我想允许用户长按以在TextView
上弹出“ PASTE”迷你对话框。用户选择“粘贴”后,我想在不更新TextView
的情况下拦截该值(请注意-我稍后会手动更新该TextView
。
在不使用EditText
的情况下是否可以实现此目的?我不想允许使用EditText
,因为我正在使用自定义的应用内键盘来允许输入现有的TextView
。
答案 0 :(得分:2)
Android上没有原生方法,但是我写了一个示例代码来说明如何轻松实现所需的功能。您只需将长按侦听器设置为textview,然后在其中显示AlertDialog弹出窗口,该对话框具有粘贴选项,单击后将使用ClipboardManager获取剪贴板中的主要内容。根据您的需要,您可以调整代码并使用任何东西代替AlertDialog(例如,我们之前使用过上下文菜单,但是它会导致各种Android版本出现故障,因此我们将其替换为AlertDialog)。让我知道你是否有疑问。
textView.setLongClickable(true);
textView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
AlertDialog.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder = new AlertDialog.Builder(ArticleActivity.this, android.R.style.Theme_Material_Dialog_Alert);
} else {
builder = new AlertDialog.Builder(ArticleActivity.this);
}
builder.setTitle("Paste")
.setMessage("Are you sure you want to paste this entry?")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
if (clipboardManager != null) {
Log.e("TAG", "clipboard:" + clipboardManager.getPrimaryClip());
}
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.show();
return true;
}
});
答案 1 :(得分:0)
我想建议的另一种解决方案是使用edittext并隐藏该特定edittext的键盘,只需启用复制和粘贴功能,其外观类似于Textview,并且如果您不希望光标闪烁也可以将其禁用。
答案 2 :(得分:0)
尽管this可以工作,但是如果您希望TextView
的行为更像标准EditText
并显示上下文菜单,则可能会有更好的解决方案。
您可以执行以下操作
class SomeActivity : AppCompatActivity() {
override fun onCreate() {
// super.onCreate() and setContentView() calls ommited for clarity
// Assuming that pastableTextView is the TextView you want to paste into
registerForContextMenu(pastableTextView)
}
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
// oversimplified for sake of example
if (v?.id == pastableTextView.id) {
menu?.add(0, v.id, 0, android.R.string.paste)
}
}
override fun onContextItemSelected(item: MenuItem?): Boolean {
// again, oversimplified for the sake of example
if (item?.itemId == pastableTextView.id) {
val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager?
// This is clipboard's contents
val content = clipboardManager?.primaryClip?.getItemAt(0)?.text?
}
return false
}
}
请注意,此代码不是最佳代码,我不建议将其原样用于生产应用程序。