2015-05-10 99 views
4

在Android中,当我从Chrome,Gmail和Inbox复制文本时,我的onPrimaryClipChangedlistener方法被调用3次,而当我像WhatsApp一样复制另一个应用中的某些文本时,或者如预期的那样保留此方法,时间。OnPrimaryClipChangedListener多次调用

实施例:在镀铬复制一些文本将导致下面的输出:

结果:

结果:文本

结果:文本

怪怪的事情是当从链接或页面的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; 
    } 
} 
+0

你找到答案了吗?我也有这个问题 – myatmins

+0

@ septemberboy7简答:没有。 – iroyo

+0

我已经做了一些工作。删除主剪辑侦听器,并使用Handler在500ms后重新添加。 – myatmins

回答

2

从@ septemberboy7继真实评论建议

我已经做了一些工作。删除主剪辑侦听器,并使用Handler在500ms后重新添加。

下面的代码缓解问题:

void startPrimaryClipChangedListenerDelayThread() { 
    mClipboardManager.removePrimaryClipChangedListener(mListener); 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      mClipboardManager.addPrimaryClipChangedListener(mListener); 
     } 
    }, 500); 
} 

立即调用这个方法在onPrimaryClipChanged()回调OnPrimaryClipChangedListener内,以防止回调再次为0.5秒触发。不理想,但现在工作。