【问题标题】:How do I enable standard copy paste for a TextView in Android?如何在 Android 中为 TextView 启用标准复制粘贴?
【发布时间】:2012-05-10 07:03:56
【问题描述】:

我想为 TextView 启用标准复制粘贴(与 EditText 相同)。我该怎么做?

我尝试使用不可编辑的 EditText,但效果不佳(有时它变得可编辑或未显示复制粘贴覆盖)。而且一般来说这可能不是一个好方法。

需要从 API 7 开始的可行解决方案。

【问题讨论】:

  • this 是您要找的吗?
  • 类似,但不一样,因为我要复制所有文本。但它看起来是一样的。问题是那里的答案只能从 API 11 开始,我需要从 API 7 开始的东西。
  • ClipboardManager 从 API 1 开始可用(查看 here )。长按,弹出复制到剪贴板怎么样?
  • @Jermin 是的,看来我必须制定一个自定义解决方案。

标签: android textview copy-paste


【解决方案1】:

试试android:textIsSelectable

android:textIsSelectable="true"

【讨论】:

  • EditTextPreference 可以做到吗?
  • @powder366:我认为EditTextPreference 已经支持复制/粘贴。它似乎在“设置”应用中。
  • 其实好像是个bug。出现在我的三星 4.2.2 设备上。 Nexus7 和 Nexus10 有效。 code.google.com/p/android/issues/detail?id=26008
  • 请注意,如果您的文本视图最初是隐藏的,并且您正在使用 setVisibility 以编程方式显示它,那么您需要使用 textView.setTextIsSelectable(true) 来完成这项工作。在这种情况下,它不能通过 xml 工作。
【解决方案2】:

要启用 TextView 的标准复制/粘贴,您可以选择以下之一:

  1. 更改布局文件:将以下属性添加到您的 TextView

    android:textIsSelectable="true"

  2. 在您的 Java 类中编写此行以编程方式设置它。 myTextView.setTextIsSelectable(true);

长按 TextView 可以看到复制/粘贴操作栏。

【讨论】:

  • 我这样做了。当我单击文本时,工具栏会打开“复制”和“全选”按钮。但在我点击它们之后,什么也没有发生。我该怎么办?
  • 此解决方案优于标有绿色复选标记的解决方案。
【解决方案3】:

这适用于蜂窝前的复制:

import android.text.ClipboardManager;

textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        ClipboardManager cm = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
        cm.setText(textView.getText());
        Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show();
    }
});

【讨论】:

  • 一个好的策略是将它与 CommonsWare 的答案一起使用。由于添加 android:textIsSelectable 存在于布局中,它只会在较低的 API 级别上被忽略。然后在 if 语句中使用 Ixx 的解决方案,检查 API 级别是否低于 11。两全其美。 android:textIsSelectable的好处在于它给了你平台的文本选择操作栏,并且有很好的原生感觉。
  • ClipboardManager 类型的方法 setText(CharSequence) 已弃用
  • 是的,这个答案来自 2 年多前。随意编辑或添加一个新的。
【解决方案4】:

Requires API 11,更新代码,不推荐使用以前的方法

无主题全屏解决方案 ActionBar

扩展TextView并在构造函数中粘贴以下代码

this.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                ClipboardManager cManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData cData = ClipData.newPlainText("text", getText());
                cManager.setPrimaryClip(cData);
                Util.toast(mContext, string.text_copyed);
                return true;
            }
        });

【讨论】:

    【解决方案5】:

    在 xml textview 中粘贴此代码

    android:textIsSelectable="true"
    

    然后在java文件中,

     final TextView txtcopypaste = findViewById(R.id.txtcopypaste); // my textview
        txtcopypaste.setOnClickListener(new View.OnClickListener() { // set onclick listener to my textview
            @Override
            public void onClick(View view) {
                ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);
                cm.setText(txtcopypaste.getText().toString());              
                Toast.makeText(getApplicationContext(), "Copied :)", Toast.LENGTH_SHORT).show();
            }
        });
    

    要求:需要复制粘贴textview中的文本。

    OutCome : 使用 textview ,一旦我点击了 textview。它会自动复制文本视图中的文本。

    注意:在导入剪贴板管理器时尝试首选

    请选择文本剪贴板管理器

    import android.text.ClipboardManager; // prefer this 
    

    尽量避免内容剪贴板管理器

    import android.content.ClipboardManager; // Not this
    

    【讨论】:

      【解决方案6】:
      1. 使用主题

        @android:style/Theme.Black.NoTitleBar.Fullscreen
        

        @android:style/Theme.WithActionBar
        
      2. 在xml中设置TextView

        android:textIsSelectable="true"
        
      3. result

      【讨论】:

        【解决方案7】:

        如果有人想加倍努力并一键选择并复制到剪贴板:

         phone.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                                    ClipData clip = ClipData.newPlainText("PhoneNumber", phone.getText());
                                    clipboard.setPrimaryClip(clip);
        
                                }
                            });
        

        电话是TextViewphone.Text 是要复制到剪贴板的文本。

        【讨论】:

          【解决方案8】:

          this 更好:

          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
          final android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager) context
                  .getSystemService(Context.CLIPBOARD_SERVICE);
          final android.content.ClipData clipData = android.content.ClipData
                  .newPlainText("text label", "text to clip");
          clipboardManager.setPrimaryClip(clipData);
          } else {
          final android.text.ClipboardManager clipboardManager = (android.text.ClipboardManager) context
                  .getSystemService(Context.CLIPBOARD_SERVICE);
          clipboardManager.setText("text to clip");
          }
          

          【讨论】:

            【解决方案9】:

            对于EditText, 在活动清单里面使用 android:windowSoftInputMode="adjustResize"

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-04-06
              • 2012-05-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多