Android OnPrimaryClipChangedListener多次调用
在安卓系统中,当我从Chrome、Gmail和收件箱复制文本时,我的onPrimaryClipChangedlistener方法会被调用3次,而当我在另一个应用程序(如WhatsApp)中复制一些文本或保留该方法时,正如预期的那样,只会调用一次 示例:在Chrome中复制某些文本将导致以下输出: 结果:null 结果:文本 结果:文本 奇怪的是,当从链接或页面URL复制一些文本时,该方法只被调用一次!因此,只有当我从网站的“正文”复制文本时,才会发生这种情况 有没有一个优雅的“官方”方法来解决这个问题?我在stackoverflow中读到了一些关于这个话题的答案,但似乎没有什么能解决我的问题 正如我所说,这个问题似乎只会影响某些应用程序,那么这是否意味着其他应用程序存在问题 这是我的密码Android OnPrimaryClipChangedListener多次调用,android,clipboardmanager,Android,Clipboardmanager,在安卓系统中,当我从Chrome、Gmail和收件箱复制文本时,我的onPrimaryClipChangedlistener方法会被调用3次,而当我在另一个应用程序(如WhatsApp)中复制一些文本或保留该方法时,正如预期的那样,只会调用一次 示例:在Chrome中复制某些文本将导致以下输出: 结果:null 结果:文本 结果:文本 奇怪的是,当从链接或页面URL复制一些文本时,该方法只被调用一次!因此,只有当我从网站的“正文”复制文本时,才会发生这种情况 有没有一个优雅的“官方”方法来解决这
ClipboardManager mClipboard;
static boolean bHasClipChangedListener = false;
ClipboardManager.OnPrimaryClipChangedListener mPrimaryChangeListener = new ClipboardManager.OnPrimaryClipChangedListener() {
public void onPrimaryClipChanged() {
updateClipData();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
registerPrimaryClipChanged();
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterPrimaryClipChanged();
}
void updateClipData() {
ClipData clip = mClipboard.getPrimaryClip();
ClipData.Item item = clip.getItemAt(0);
Log.d(LogUtils.BASIC_LOG, "result: " + item.getText());
}
private void registerPrimaryClipChanged(){
if(!bHasClipChangedListener){
mClipboard.addPrimaryClipChangedListener(mPrimaryChangeListener);
bHasClipChangedListener = true;
}
}
private void unregisterPrimaryClipChanged(){
if(bHasClipChangedListener){
mClipboard.removePrimaryClipChangedListener(mPrimaryChangeListener);
bHasClipChangedListener = false;
}
}
根据@septemberboy7的评论建议
我做了一些工作。移除主剪辑侦听器,并在500毫秒后使用处理程序重新添加 以下代码可缓解此问题:
void startPrimaryClipChangedListenerDelayThread() {
mClipboardManager.removePrimaryClipChangedListener(mListener);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mClipboardManager.addPrimaryClipChangedListener(mListener);
}
}, 500);
}
在OnPrimaryClipChangedListener内的onPrimaryClipChanged()回调中立即调用此方法,以防止在0.5s内再次触发回调。虽然不理想,但目前仍然有效。您找到答案了吗?我有这个问题too@septemberboy7简短回答:没有。我做了一些工作。删除主剪辑侦听器,并在500毫秒后使用处理程序重新添加。请在此处更新您的答案