当我将文本复制到剪贴板时,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/平原{T:继续}
第一次调用onPrimaryClipChanged()时
ClipData {text/纯文本"BBC -主页“{T:继续}
下次调用onPrimaryClipChanged()时。
因此,基本上,第一次ClipDescription是{text/平原},第二次是ClipDescription {text/纯文本"BBC -主页“}(即包括网页标题)。
发布于 2013-08-22 23:10:33
我想您没有注册多个侦听器,我不能说它是错误,您仍然可以解决它。试着做这样的事情:
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();
}
}
});发布于 2015-01-30 07:04:46
我也遇到了这个问题,最后我知道为什么它会多次调用!
通常我们addPrimaryClipChangedListener(),但我们不removePrimaryClipChangedListener()。
请参阅:SERVICE
使用getSystemService(String)检索用于访问和修改全局剪贴板内容的ClipboardManager。
这意味着我们应该手动removePrimaryClipChangedListener()!
我的解决方案代码:
ClipboardManager myClipBoard ;
static boolean bHasClipChangedListener = false;
ClipboardManager.OnPrimaryClipChangedListener mPrimaryClipChangedListener = new ClipboardManager.OnPrimaryClipChangedListener() {
public void onPrimaryClipChanged() {
ClipData clipData = myClipBoard.getPrimaryClip();
Log.d("henrytest", "********** clip changed, clipData: " + clipData.getItemAt(0));
}
};
private void RegPrimaryClipChanged(){
if(!bHasClipChangedListener){
myClipBoard.addPrimaryClipChangedListener(mPrimaryClipChangedListener);
bHasClipChangedListener = true;
}
}
private void UnRegPrimaryClipChanged(){
if(bHasClipChangedListener){
myClipBoard.removePrimaryClipChangedListener(mPrimaryClipChangedListener);
bHasClipChangedListener = false;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
myClipBoard = (ClipboardManager) Clipboard.this.getSystemService(android.content.Context.CLIPBOARD_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
RegPrimaryClipChanged();
}
@Override
protected void onPause() {
super.onPause();
UnRegPrimaryClipChanged();
}
@Override
protected void onStop() {
super.onStop();
//UnRegPrimaryClipChanged();
}
@Override
protected void onDestroy() {
super.onDestroy();
//UnRegPrimaryClipChanged();
}发布于 2018-03-19 11:30:28
这是我的解决办法,以防止每次副本调用两次ClipboardManager OnPrimaryClipChangedListener。
long lastCopiedTime = 0;
ClipboardManager.OnPrimaryClipChangedListener onPrimaryClipChangedListener = new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
ClipboardManager clipBoard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
String pasteData = "";
ClipData.Item item = clipBoard.getPrimaryClip().getItemAt(0);
if (System.currentTimeMillis() - lastCopiedTime > TimeUnit.SECONDS.toMillis(1)) {
if (StringUtils.isNotBlank(item.getText())) {
String s = item.getText().toString();
if (StringUtils.isNotBlank(s)) {
pasteData = s.trim();
if (StringUtils.isNotBlank(pasteData)) {
/// do something here
}
}
}
}
lastCopiedTime = System.currentTimeMillis();
}
}
}
};https://stackoverflow.com/questions/18391701
复制相似问题