ClipboardManager OnPrimaryClipChangedListener被称为两次每个副本 [英] ClipboardManager OnPrimaryClipChangedListener is called twice for every copy

查看:2833
本文介绍了ClipboardManager OnPrimaryClipChangedListener被称为两次每个副本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我将文本复制到剪贴板onPrimaryClipChanged方法被调用了两次。任何想法,为什么?

When I copy text to the clipboard onPrimaryClipChanged method is called twice. Any ideas why?

@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;
}

测试案例: 复制从英国广播公司网站上的文字继续将导致以下输出:

Test case: Copying the text "continue" from the BBC web site will result in the following output:

继续

继续

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

But if I debug the program I can see that the clipData object has value:

ClipData {text / plain的【T:继续}}

ClipData { text/plain {T:continue } }

第一次onPrimaryClipChanged()被调用以及

the first time onPrimaryClipChanged() is called and

ClipData {text / plain的英国广播公司 - 首页{T:继续}}

ClipData { text/plain "BBC - Homepage" {T:continue } }

onPrimaryClipChanged在下一次()被调用。

the next time onPrimaryClipChanged() is called.

所以基本上在第一时间ClipDesc​​ription是{text / plain的},第二次是ClipDesc​​ription {text / plain的英国广播公司 - 主页}(即包括网页的标题)

So basically the first time ClipDescription is { text/plain } and the second time is ClipDescription { text/plain "BBC - Homepage" } (i.e including the title of the web page)

推荐答案

我想你没有注册多个监听器,我不能说这是错误,你仍然可以变通办法。尝试是这样的:

I assume you didn't register multiple listeners, I can't say it is bug, you still you can workaround it. Try something like this:

   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()) return;
                         else{
                            /// do something
                            mPrevousText = item.getText();
                         }
                    }
                });

这篇关于ClipboardManager OnPrimaryClipChangedListener被称为两次每个副本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆