- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 Android 中,当我从 Chrome、Gmail 和收件箱复制文本时,我的 onPrimaryClipChangedlistener 方法被调用了 3 次,而当我在另一个应用程序(如 WhatsApp 中复制一些文本或按预期保留此方法时,仅被调用一次。
示例:在 Chrome 中复制一些文本将导致以下输出:
result: null
result: text
result: text
奇怪的事情是,当从链接或页面的 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 的评论建议
I have done something to work. remove primary clip listener and re add again after 500ms by using 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回调再次触发。不理想,但目前有效。
关于android - 多次调用 OnPrimaryClipChangedListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30154670/
这是我实现 OnPrimaryCLipChangedListener 的代码: public class PrimaryClipChangedListener implements OnPrimary
我正在尝试制作一个应用程序,该应用程序可以将您在 Web View 中复制到剪贴板的单词进行烘烤以进行练习。问题是,这段代码适用于第一个单词(除了不知何故它烤了三遍。有点眨眼。);然而,当我第二次尝试
在 Android 中,当我从 Chrome、Gmail 和收件箱复制文本时,我的 onPrimaryClipChangedlistener 方法被调用了 3 次,而当我在另一个应用程序(如 What
如果用户将某些内容复制到剪贴板,我希望收到通知。 我创建了一个服务并在 HomeActivity 中启动它,我还编写了一个计时器来检查我的服务是否正常工作。我检查过,我的服务正在运行 Log cat
当我将文本复制到剪贴板时,onPrimaryClipChanged 方法被调用了两次。有什么想法吗? @Override public boolean onCreateOptionsMenu(Menu
我用下面的代码来监听剪贴板的变化,我希望在操作完成后移除监听。 但是clipboard.removePrimaryClipChangedListener{ }需要传参,我该怎么办? 代码 btnMo
我在 logcat 中收到一条消息,说明: Failed resolving interface 26 Landroid/content/ClipboardManager$OnPrimaryClipC
我是一名优秀的程序员,十分优秀!