如何在我的Android应用程序中以编程方式复制文本?

如何在我的Android应用程序中以编程方式复制文本?,android,menu,clipboardmanager,Android,Menu,Clipboardmanager,我正在构建一个Android应用程序,我想复制EditText小部件的文本值。用户可以按Menu+A然后按Menu+C复制值,但我如何以编程方式执行此操作?使用方法: 你可以试试这个..谷歌搜索将你带到android.content.ClipboardManager,你可以像我一样决定剪贴板在API

我正在构建一个Android应用程序,我想复制EditText小部件的文本值。用户可以按
Menu+A
然后按
Menu+C
复制值,但我如何以编程方式执行此操作?

使用方法:


你可以试试这个..

谷歌搜索将你带到android.content.ClipboardManager,你可以像我一样决定剪贴板在API<11上不可用,因为文档页面上写着“自:API级别11”

实际上有两个类,第二个扩展了第一个类-android.text.ClipboardManager和android.content.ClipboardManager

android.text.ClipboardManager从API 1开始就存在,但它仅适用于文本内容

android.content.ClipboardManager是使用剪贴板的首选方式,但在API级别<11(蜂巢)上不可用

要获取其中任何一个,您需要以下代码:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

但是对于API<11,您必须导入
android.text.ClipboardManager
,对于API>=11
android.content.ClipboardManager

,因此每个人都同意应该如何做,但由于没有人想给出完整的解决方案,下面是:

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
    android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    clipboard.setText("text to clip");
} else {
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
    android.content.ClipData clip = android.content.ClipData.newPlainText("text label","text to clip");
    clipboard.setPrimaryClip(clip);
}
intsdk=android.os.Build.VERSION.sdk\u int;
如果(sdk
我假设您在清单中声明了如下内容:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />

以下是一些代码,用于从EditText实现一些复制和粘贴功能(感谢Warpzit进行版本检查)。您可以将它们挂接到按钮的onclick事件

public void copy(View v) {      
    int startSelection = txtNotes.getSelectionStart();
    int endSelection = txtNotes.getSelectionEnd();      
    if ((txtNotes.getText() != null) && (endSelection > startSelection ))
    {
        String selectedText = txtNotes.getText().toString().substring(startSelection, endSelection);                
        int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
            android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            clipboard.setText(selectedText);
        } else {
            android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
            android.content.ClipData clip = android.content.ClipData.newPlainText("WordKeeper",selectedText);
            clipboard.setPrimaryClip(clip);
        }
    }
}   

public void paste(View v) {
    int sdk = android.os.Build.VERSION.SDK_INT;
    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        if (clipboard.getText() != null) {
            txtNotes.getText().insert(txtNotes.getSelectionStart(), clipboard.getText());
        }
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
        if (item.getText() != null) {
            txtNotes.getText().insert(txtNotes.getSelectionStart(), item.getText());
        }
    }
}
公共作废副本(视图v){
int startSelection=txtNotes.getSelectionStart();
int endSelection=txtNotes.getSelectionEnd();
if((txtNotes.getText()!=null)&&(endSelection>startSelection))
{
String selectedText=txtNotes.getText().toString().substring(开始选择,结束选择);
int sdk=android.os.Build.VERSION.sdk\u int;
如果(sdk
要启用TextView的标准复制/粘贴,您可以选择以下选项之一:

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

android:textIsSelectable="true"
在Java类中,编写这行代码,按语法设置两个

myTextView.setTextIsSelectable(true)

长按文本视图可以看到复制/粘贴操作栏。

Android支持库更新 从AndroidOreo开始,支持库只支持API 14。大多数较新的应用程序的最小API可能也为14,因此不需要担心其他一些答案中提到的API 11的问题。很多代码都可以清理。(但如果仍支持较低版本,请查看我的编辑历史记录。)

复制 粘贴 我添加这段代码作为奖励,因为复制/粘贴通常是成对完成的

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
    CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
    return;
}
笔记
  • 请确保导入的是
    android.content.ClipboardManager
    版本,而不是旧的
    android.text.ClipboardManager
    。同样适用于
    ClipData
  • 如果您不在活动中,则可以使用
    context.getSystemService()
    获取服务
  • 我使用try/catch块来获取粘贴文本,因为有多个东西可以
    null
    。如果你觉得这样更可读,你可以检查每一个
      @FlySwat已经给出了正确的答案,我只是在分享完整的答案:

      使用ClipboardManager.setPrimaryClip()方法:

      其中,
      label
      是剪辑数据的用户可见标签,并且
      text
      是剪辑中的实际文本。根据

      使用此导入非常重要:

      import android.content.ClipboardManager;
      

      和导入
      导入android.content.ClipboardManager

      这是我的工作代码

      /**
       * Method to code text in clip board
       *
       * @param context context
       * @param text    text what wan to copy in clipboard
       * @param label   label what want to copied
       */
      public static void copyCodeInClipBoard(Context context, String text, String label) {
          if (context != null) {
              ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
              ClipData clip = ClipData.newPlainText(label, text);
              if (clipboard == null || clip == null)
                  return;
              clipboard.setPrimaryClip(clip);
      
          }
      }
      

      对于Kotlin,我们可以使用以下方法。您可以将此方法粘贴到活动或片段中

      fun copyToClipBoard(context: Context, message: String) {
      
          val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
          val clipData = ClipData.newPlainText("label",message)
          clipBoard.setPrimaryClip(clipData)
      
      }
      

      除非您的应用程序是默认输入法编辑器(IME)或当前具有焦点的应用程序,否则您的应用程序无法访问Android 10或更高版本上的剪贴板数据。
      对于Kotlin,请在活动中使用以下代码

      import android.content.ClipboardManager
      
      
       val clipBoard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
       val clipData = ClipData.newPlainText("label","Message to be Copied")
       clipBoard.setPrimaryClip(clipData)
      

      剪贴簿管理员。这基本上是一个重复的问题:它不工作,因为编译器抛出了一个错误:callrequi
      import android.content.ClipboardManager;
      
      ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
      ClipData clip = ClipData.newPlainText("label", "Text to copy");
      if (clipboard == null || clip == null)
          return;
      clipboard.setPrimaryClip(clip);
      
      /**
       * Method to code text in clip board
       *
       * @param context context
       * @param text    text what wan to copy in clipboard
       * @param label   label what want to copied
       */
      public static void copyCodeInClipBoard(Context context, String text, String label) {
          if (context != null) {
              ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
              ClipData clip = ClipData.newPlainText(label, text);
              if (clipboard == null || clip == null)
                  return;
              clipboard.setPrimaryClip(clip);
      
          }
      }
      
      fun copyToClipBoard(context: Context, message: String) {
      
          val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
          val clipData = ClipData.newPlainText("label",message)
          clipBoard.setPrimaryClip(clipData)
      
      }
      
      import android.content.ClipboardManager
      
      
       val clipBoard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
       val clipData = ClipData.newPlainText("label","Message to be Copied")
       clipBoard.setPrimaryClip(clipData)