android - ClipboardManager OnPrimaryClipChangedListener 为每个副本调用两次

标签 android clipboardmanager

当我将文本复制到剪贴板时,onPrimaryClipChanged 方法被调用了两次。有什么想法吗?

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    final ClipboardManager cliboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

    cliboardManager
            .addPrimaryClipChangedListener(new OnPrimaryClipChangedListener() {

                @Override
                public void onPrimaryClipChanged() {
                    ClipData clipData = cliboardManager.getPrimaryClip();
                    System.out
                            .println("********** clip changed, clipData: "
                                    + clipData.getItemAt(0));
                }
            });
    return true;
}

测试用例: 从 BBC 网站复制文本“继续”将导致以下输出:

continue

continue

但是如果我调试程序,我可以看到 clipData 对象有值:

ClipData { text/plain {T:continue } }

第一次调用 onPrimaryClipChanged() 和

ClipData { text/plain "BBC - Homepage" {T:continue } }

下次调用 onPrimaryClipChanged() 时。

所以基本上第一次 ClipDescription 是 { text/plain } 第二次是 ClipDescription { text/plain "BBC - Homepage"}(即包括网页标题)

最佳答案

我假设你没有注册多个监听器,我不能说这是错误,你仍然可以解决它。尝试这样的事情:

   String mPreviousText = "";

   cliboardManager
                .addPrimaryClipChangedListener(new OnPrimaryClipChangedListener() {

                    @Override
                    public void onPrimaryClipChanged() {
                        ClipData clipData = cliboardManager.getPrimaryClip();
                        System.out
                                .println("********** clip changed, clipData: "
                                        + clipData.getItemAt(0));
                         ClipData.Item item = clipData.getItemAt(0);
                         if(mPreviousText.equals(item.getText().toString())) return;
                         else{
                            /// do something
                            mPrevousText = item.getText().toString();
                         }
                    }
                });

关于android - ClipboardManager OnPrimaryClipChangedListener 为每个副本调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18391701/

相关文章:

android - 有没有办法使用 ARCore SDK 录制手机屏幕?

android - logcat 中有很多关于接近传感器的错误消息

java - 为什么 AccessibilityManager.sInstance 会导致内存泄漏?

android - 为所有 android api 启用复制粘贴

android - 如何将带有上下文的文本复制到剪贴板

android - iOS 是否像 Android 一样提供多个 'apk' 支持?

android - 在谷歌地图项目中膨胀类 fragment 时出错

java - ClipboardManager 使用 WorkManager 抛出以下错误 : Can't create handler inside thread that has not called Looper. 准备()

Android 在重启手机后从剪贴板粘贴文本

android - 捕获剪贴板的粘贴事件