【发布时间】:2013-08-22 22:17:56
【问题描述】:
当我将文本复制到剪贴板时,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 网站复制文本“继续”将产生以下输出:
继续
继续
但如果我调试程序,我可以看到 clipData 对象有值:
ClipData { text/plain {T:continue } }
第一次调用 onPrimaryClipChanged() 并且
ClipData { text/plain "BBC - 主页" {T:continue } }
下次调用 onPrimaryClipChanged() 时。
所以基本上第一次 ClipDescription 是 { text/plain } 而第二次是 ClipDescription { text/plain "BBC - Homepage" }(即包括网页的标题)
【问题讨论】:
-
你确定你没有不小心注册了两个监听器? :)
-
剪贴板的双重设置可能是某些应用程序中的错误。我从 Chrome 收到两条剪贴板消息,它们看起来是相同的(都是 text/html,所有字段似乎都相同,
toString两次都返回相同的 html)。我在 Whatsapp、Youtube、Hangouts 和默认消息应用程序上进行了测试,所有这些应用程序都只设置了一次剪贴板。 Chrome 这样做可能是有原因的,但我现在没有时间深入研究它们的源代码。