ClipboardManager OnPrimaryClipChangedListener被称为两次每个副本 [英] ClipboardManager OnPrimaryClipChangedListener is called twice for every copy
问题描述
当我将文本复制到剪贴板onPrimaryClipChanged方法被调用了两次。任何想法,为什么?
When I copy text to the clipboard onPrimaryClipChanged method is called twice. Any ideas why?
@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;
}
测试案例: 复制从英国广播公司网站上的文字继续将导致以下输出:
Test case: Copying the text "continue" from the BBC web site will result in the following output:
继续
继续
但是,如果我调试程序我可以看到clipData对象值:
But if I debug the program I can see that the clipData object has value:
ClipData {text / plain的【T:继续}}
ClipData { text/plain {T:continue } }
第一次onPrimaryClipChanged()被调用以及
the first time onPrimaryClipChanged() is called and
ClipData {text / plain的英国广播公司 - 首页{T:继续}}
ClipData { text/plain "BBC - Homepage" {T:continue } }
onPrimaryClipChanged在下一次()被调用。
the next time onPrimaryClipChanged() is called.
所以基本上在第一时间ClipDescription是{text / plain的},第二次是ClipDescription {text / plain的英国广播公司 - 主页}(即包括网页的标题)
So basically the first time ClipDescription is { text/plain } and the second time is ClipDescription { text/plain "BBC - Homepage" } (i.e including the title of the web page)
推荐答案
我想你没有注册多个监听器,我不能说这是错误,你仍然可以变通办法。尝试是这样的:
I assume you didn't register multiple listeners, I can't say it is bug, you still you can workaround it. Try something like this:
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()) return;
else{
/// do something
mPrevousText = item.getText();
}
}
});
这篇关于ClipboardManager OnPrimaryClipChangedListener被称为两次每个副本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!