Android TextView使用剪贴板复制粘贴

时间:2020-02-23 14:29:20  来源:igfitidea点击:

在本教程中,我们将在Android应用程序的TextView上实现复制粘贴功能。
在本文结尾,您可以将文本复制到Android系统的剪贴板中,然后粘贴该剪贴板数据。

Andorid剪贴板–复制粘贴

您必须已经注意到EditText具有内置的Clipboard Manager用于复制粘贴功能。
但是TextView没有。
因此,为了允许复制粘贴TextView,我们需要注册ContextMenu。

因此,为了接收菜单事件,我们需要registerForContextMenu
完成此操作后,您可以长按" TextView"以显示菜单。

菜单是在onCreateContextMenu()方法中创建的。
菜单项动作是在onContextItemSelected方法中设置的。

将文本复制到剪贴板

将TextView文本复制到剪贴板很容易。
您只需要将ClipData类型设置为newPlainText并传递字符串即可。

例:

ClipboardManager manager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clipData = ClipData.newPlainText("text", textView.getText());
manager.setPrimaryClip(clipData);

将文本粘贴到剪贴板

现在,您已将文本复制到剪贴板上,只需使用以下代码将其粘贴:

ClipData pasteData = manager.getPrimaryClip();
ClipData.Item item = pasteData.getItemAt(0);
String paste = item.getText().toString();

其中我们粘贴剪贴板中的第一个数据。
如果我们有多个复制的文本,则可以使用pasteData.getItemAt(1)等进行粘贴。

现在,让我们跳到本文的实现部分。
在下一节中,我们将开发一个简单的Android应用程序,您可以其中将文本从一个TextView复制粘贴到另一个。

代码

下面给出了" activity_main.xml"布局的代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
  xmlns:app="https://schemas.android.com/apk/res-auto"
  xmlns:tools="https://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity">

  <TextView
      android:id="@+id/tvCopy"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Welcome To theitroad.local"
      android:padding="8dp"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent" 

  <TextView
      android:id="@+id/tvPaste"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Paste here"
      android:padding="8dp"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/tvCopy" 

</androidx.constraintlayout.widget.ConstraintLayout>

下面给出了MainActivity.java类的代码:

package com.theitroad.androidtextviewcopypaste;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

  TextView tvCopy, tvPaste;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      tvCopy = findViewById(R.id.tvCopy);
      tvPaste = findViewById(R.id.tvPaste);

      registerForContextMenu(tvCopy);
      registerForContextMenu(tvPaste);
  }

  @Override
  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
      super.onCreateContextMenu(menu, v, menuInfo);

      menu.setHeaderTitle("Options");
      switch (v.getId()) {
          case R.id.tvCopy:
              menu.add(0, v.getId(), 0, "Copy");
              TextView textView = (TextView) v;
              ClipboardManager manager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
              ClipData clipData = ClipData.newPlainText("text", textView.getText());
              if (manager != null) {
                  manager.setPrimaryClip(clipData);
              }

              break;
          case R.id.tvPaste:
              menu.add(0, v.getId(), 0, "Paste");
              break;
      }
  }

  @Override
  public boolean onContextItemSelected(@NonNull MenuItem item) {

      switch (item.getItemId()) {
          case R.id.tvCopy:
              Toast.makeText(getApplicationContext(), "Copy Clicked", Toast.LENGTH_LONG).show();
              break;
          case R.id.tvPaste:
              ClipboardManager manager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
              if (manager != null && manager.getPrimaryClip() != null && manager.getPrimaryClip().getItemCount() > 0) {
                  tvPaste.setText(manager.getPrimaryClip().getItemAt(0).getText().toString());
              }

              break;
      }

      return super.onContextItemSelected(item);

  }
}

getItemCount()用于获取剪贴板中存在的项目。
您还可以在" onContextItemSelected"复制菜单项操作中设置要复制的剪贴板数据。