是否可以粘贴到TextView(而不是EditText)中?

时间:2019-01-18 07:18:55

标签: android textview

我想允许用户长按以在TextView上弹出“ PASTE”迷你对话框。用户选择“粘贴”后,我想在不更新TextView的情况下拦截该值(请注意-我稍后会手动更新该TextView

在不使用EditText的情况下是否可以实现此目的?我不想允许使用EditText,因为我正在使用自定义的应用内键盘来允许输入现有的TextView

3 个答案:

答案 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
    }
}

请注意,此代码不是最佳代码,我不建议将其原样用于生产应用程序。