当我将文本复制到剪贴板时,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/