【问题标题】:OnPrimaryClipChangedListener called multiple times多次调用 OnPrimaryClipChangedListener
【发布时间】:2015-05-10 17:51:25
【问题描述】:

在 Android 中,当我从 Chrome、Gmail 和 Inbox 复制文本时,我的 onPrimaryClipChangedlistener 方法被调用了 3 次,而当我在另一个应用程序(如 WhatsApp 或 Keep)中复制一些文本时,正如预期的那样,该方法只被调用一次。

示例:在 Chrome 中复制一些文本将导致以下输出:

结果:null

结果:文本

结果:文本

奇怪的事情是当从链接或页面的 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 简短回答:否。
  • 我已经做了一些工作。使用 Handler 删除主剪辑侦听器并在 500 毫秒后重新添加。
  • 请在此处更新您的答案

标签: android clipboardmanager


【解决方案1】:

根据@septemberboy7 的评论建议

我已经做了一些工作。删除主剪辑监听器,并在 500 毫秒后使用 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.5s 内再次触发回调。不理想,但目前可以使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2013-03-31
    • 2019-12-16
    • 2015-01-16
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多