如何在 RecyclerView 的 Adapter class 中使用剪贴板服务

How to use Clipboard service in Adapter class of a RecyclerView

我正在制作一个 android 应用程序,我在其中使用 RecyclerView 显示文本,我想借助按钮复制 TextView 的文本。但是当我使用 getSystemService(Context.CLIPBOARD_SERVICE) 时,它给我错误 cannot resolve method。 这是我的适配器 class,

package in.codemantri.quotes;

import android.content.ClipboardManager;
import android.content.ClipData;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private String[] data;
    public MyAdapter(String[] data) {
        this.data=data;
    }
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(parent.getContext());
        View view=inflater.inflate(R.layout.shayari_layout, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {

        final String mydata=data[position];
        holder.textView.setText(mydata);
        holder.btnWhatsapp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent whatsappIntent = new Intent();
                whatsappIntent.setAction(Intent.ACTION_SEND);
                whatsappIntent.putExtra(Intent.EXTRA_TEXT, mydata);
                whatsappIntent.setType("text/plain");
                whatsappIntent.setPackage("com.whatsapp");
                try {
                    holder.itemView.getContext().startActivity(whatsappIntent);
                }
                catch (android.content.ActivityNotFoundException ex) {

                }
            }
        });
        holder.btnFacebook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent facebookIntent = new Intent();
                facebookIntent.setAction(Intent.ACTION_SEND);
                facebookIntent.putExtra(Intent.EXTRA_TEXT, mydata);
                facebookIntent.setType("text/plain");
                facebookIntent.setPackage("com.facebook.katana");
                try {
                    holder.itemView.getContext().startActivity(facebookIntent);
                }
                catch (android.content.ActivityNotFoundException ex) {

                }
            }
        });
        holder.btnFacebook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent facebookIntentLite = new Intent();
                facebookIntentLite.setAction(Intent.ACTION_SEND);
                facebookIntentLite.putExtra(Intent.EXTRA_TEXT, mydata);
                facebookIntentLite.setType("text/plain");
                facebookIntentLite.setPackage("com.facebook.lite");
                try {
                    holder.itemView.getContext().startActivity(facebookIntentLite);
                }
                catch (android.content.ActivityNotFoundException ex) {

                }
            }
        });
        // Share Button Implemantation
        holder.btnShare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent shareIntent=new Intent();
                shareIntent.setAction(Intent.ACTION_SEND);
                shareIntent.putExtra(Intent.EXTRA_TEXT, mydata);
                shareIntent.setType("text/plain");
                shareIntent=Intent.createChooser(shareIntent, "Share via");
                holder.itemView.getContext().startActivity(shareIntent);
            }
        });
        holder.btnCopy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ClipboardManager clipboardManager=getSystemService(Context.CLIPBOARD_SERVICE); //Getting Error Here
            }
        });
    }

    @Override
    public int getItemCount() {
        return data.length;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
        ImageView btnWhatsapp, btnFacebook, btnShare, btnCopy;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            textView=itemView.findViewById(R.id.shayari_textView);
            btnWhatsapp=itemView.findViewById(R.id.btn_whatsapp);
            btnFacebook=itemView.findViewById(R.id.btn_facebook);
            btnShare=itemView.findViewById(R.id.btn_share);
            btnCopy=itemView.findViewById(R.id.btn_copy);
        }
    }
}

使用剪贴板管理器

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText(label, text);
 clipboard.setPrimaryClip(clip);

在适配器 class 中,您需要从父 activity 获取上下文才能使用 getSystemService。 您可以通过多种方式获取上下文,但我是从 recyclerview itemView.

获取的

只需在getSystemService前加上itemView.context即可。

科特林代码:

val clipboard = itemView.context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip: ClipData = ClipData.newPlainText("simple text", "Hello, World!")
clipboard.setPrimaryClip(clip)

这是我第一次看到没有上下文实例的 RecyclerAdapter,要遵循我的解决方案,您将需要它这里是步骤。

  1. 确保你已经创建了一个 Context 实例(作为一个字段,你应该将它作为一个参数放在你的 Recycler Adapter Construtor 中)——我通过这个解决方案将这个 Context 实例称为 contextInstance。

  2. 你的点击监听器中应该有这样的东西。 ClipboardManager 管理器 = (ClipboardManager) contextInstance.getSystemService(Context.CLIPBOARD_SERVICE);

这就是您问题的答案。现在复制数据的逻辑是这样的。

3。 ClipData clip = ClipData.newPlainText("TheLebelYouWant", myData);// myData是要Copy的数据,请教问题。 manager.setPrimaryClip(剪辑);