在
Android中,当我从Chrome,Gmail和Inbox复制文本时,我的onPrimaryClipChangedlistener方法被调用3次,而当我在另一个应用程序中复制某些文本时,如WhatsApp或保留此方法,正如预期的那样,只调用一次.
示例:在Chrome中复制某些文字会产生以下输出:
result: null
result: text
result: text
奇怪的是当从链接或页面的URL复制一些文本时,方法被调用一次!所以这只发生在我从网站的“正文”中复制文本时.
是否有一种优雅的“官方”方式来解决这个问题?我在这里读了几个关于这个主题的答案,在stackoverflow中,但似乎没有什么能解决我的问题.
正如我所说,这个问题似乎只影响某些应用程序,所以这是否意味着来自其他应用程序的问题?
在这里我的代码
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的评论建议之后
I have done something to work. remove primary clip listener and re add again after 500ms by using Handler.
以下代码缓解了这个问题:
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.5秒的回调.不理想,但现在有效.