2015-05-10 41 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秒觸發。不理想,但現在工作。