首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对每个副本调用两次ClipboardManager OnPrimaryClipChangedListener

对每个副本调用两次ClipboardManager OnPrimaryClipChangedListener
EN

Stack Overflow用户
提问于 2013-08-22 22:17:56
回答 4查看 7K关注 0票数 3

当我将文本复制到剪贴板时,onPrimaryClipChanged方法将被调用两次。知道为什么吗?

代码语言:javascript
复制
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    final ClipboardManager cliboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

    cliboardManager
            .addPrimaryClipChangedListener(new OnPrimaryClipChangedListener() {

                @Override
                public void onPrimaryClipChanged() {
                    ClipData clipData = cliboardManager.getPrimaryClip();
                    System.out
                            .println("********** clip changed, clipData: "
                                    + clipData.getItemAt(0));
                }
            });
    return true;
}

测试用例:从BBC网站复制文本“继续”将产生以下输出:

继续 继续

但是,如果我调试程序,我可以看到clipData对象具有以下值:

ClipData {text/平原{T:继续}

第一次调用onPrimaryClipChanged()时

ClipData {text/纯文本"BBC -主页“{T:继续}

下次调用onPrimaryClipChanged()时。

因此,基本上,第一次ClipDescription是{text/平原},第二次是ClipDescription {text/纯文本"BBC -主页“}(即包括网页标题)。

EN

回答 4

Stack Overflow用户

发布于 2013-08-22 23:10:33

我想您没有注册多个侦听器,我不能说它是错误,您仍然可以解决它。试着做这样的事情:

代码语言:javascript
复制
   String mPreviousText = "";

   cliboardManager
                .addPrimaryClipChangedListener(new OnPrimaryClipChangedListener() {

                    @Override
                    public void onPrimaryClipChanged() {
                        ClipData clipData = cliboardManager.getPrimaryClip();
                        System.out
                                .println("********** clip changed, clipData: "
                                        + clipData.getItemAt(0));
                         ClipData.Item item = clipData.getItemAt(0);
                         if(mPreviousText.equals(item.getText().toString())) return;
                         else{
                            /// do something
                            mPrevousText = item.getText().toString();
                         }
                    }
                });
票数 9
EN

Stack Overflow用户

发布于 2015-01-30 07:04:46

我也遇到了这个问题,最后我知道为什么它会多次调用!

通常我们addPrimaryClipChangedListener(),但我们不removePrimaryClipChangedListener()

请参阅:SERVICE

使用getSystemService(String)检索用于访问和修改全局剪贴板内容的ClipboardManager。

这意味着我们应该手动removePrimaryClipChangedListener()

我的解决方案代码:

代码语言:javascript
复制
ClipboardManager myClipBoard ;
static boolean bHasClipChangedListener = false;

ClipboardManager.OnPrimaryClipChangedListener mPrimaryClipChangedListener = new ClipboardManager.OnPrimaryClipChangedListener() {
    public void onPrimaryClipChanged() {
        ClipData clipData = myClipBoard.getPrimaryClip();
        Log.d("henrytest", "********** clip changed, clipData: " + clipData.getItemAt(0));
    }
};

private void RegPrimaryClipChanged(){
    if(!bHasClipChangedListener){
        myClipBoard.addPrimaryClipChangedListener(mPrimaryClipChangedListener);
        bHasClipChangedListener = true;
    }
}
private void UnRegPrimaryClipChanged(){
    if(bHasClipChangedListener){
        myClipBoard.removePrimaryClipChangedListener(mPrimaryClipChangedListener);
        bHasClipChangedListener = false;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    myClipBoard = (ClipboardManager) Clipboard.this.getSystemService(android.content.Context.CLIPBOARD_SERVICE);
}

@Override
protected void onResume() {
    super.onResume();
    RegPrimaryClipChanged();
}

@Override
protected void onPause() {
    super.onPause();
    UnRegPrimaryClipChanged();
}

@Override
protected void onStop() {
    super.onStop();
    //UnRegPrimaryClipChanged();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //UnRegPrimaryClipChanged();
}
票数 6
EN

Stack Overflow用户

发布于 2018-03-19 11:30:28

这是我的解决办法,以防止每次副本调用两次ClipboardManager OnPrimaryClipChangedListener。

代码语言:javascript
复制
long lastCopiedTime = 0;
ClipboardManager.OnPrimaryClipChangedListener onPrimaryClipChangedListener = new ClipboardManager.OnPrimaryClipChangedListener() {
    @Override
    public void onPrimaryClipChanged() {
                ClipboardManager clipBoard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
                String pasteData = "";
                ClipData.Item item = clipBoard.getPrimaryClip().getItemAt(0);
                if (System.currentTimeMillis() - lastCopiedTime > TimeUnit.SECONDS.toMillis(1)) {
                    if (StringUtils.isNotBlank(item.getText())) {
                        String s = item.getText().toString();
                        if (StringUtils.isNotBlank(s)) {
                            pasteData = s.trim();
                            if (StringUtils.isNotBlank(pasteData)) {
                                  /// do something here
                            }
                        }
                    }
                }
                lastCopiedTime = System.currentTimeMillis();
            }
        }
    }
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18391701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档