通过上下文菜单将文本从edittext复制到剪贴板时出现异常?

Posted

技术标签:

【中文标题】通过上下文菜单将文本从edittext复制到剪贴板时出现异常?【英文标题】:Exception while copying text from edittext to clipboard via context menus? 【发布时间】:2012-04-28 09:35:10 【问题描述】:

我在尝试将 TextView 文本复制到剪贴板时是否做错了什么?

我的活动类中的代码:

@Override
public boolean onContextItemSelected(MenuItem item) 
    String selectedItem = item.getTitle().toString().trim();
    try 
    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clip;
    if (selectedItem.equals("Copy Query")) 
        clip = ClipData.newPlainText("Query",tv1.getText());
    clipboard.setPrimaryClip(clip);
               
    return true;

错误:

04-17 03:10:54.056: E/androidRuntime(503): FATAL EXCEPTION: main
04-17 03:10:54.056: E/AndroidRuntime(503): java.lang.NoClassDefFoundError: android.content.ClipboardManager
04-17 03:10:54.056: E/AndroidRuntime(503):  at com.ewe.radixcalculator.CalculatorActivity.onContextItemSelected(CalculatorActivity.java:68)
04-17 03:10:54.056: E/AndroidRuntime(503):  at android.app.Activity.onMenuItemSelected(Activity.java:2199)
04-17 03:10:54.056: E/AndroidRuntime(503):  at com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback.onMenuItemSelected(PhoneWindow.java:2744)
04-17 03:10:54.056: E/AndroidRuntime(503):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
04-17 03:10:54.056: E/AndroidRuntime(503):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
04-17 03:10:54.056: E/AndroidRuntime(503):  at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:137)
04-17 03:10:54.056: E/AndroidRuntime(503):  at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:874)
04-17 03:10:54.056: E/AndroidRuntime(503):  at android.widget.AdapterView.performItemClick(AdapterView.java:284)
04-17 03:10:54.056: E/AndroidRuntime(503):  at android.widget.ListView.performItemClick(ListView.java:3382)
04-17 03:10:54.056: E/AndroidRuntime(503):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
04-17 03:10:54.056: E/AndroidRuntime(503):  at android.os.Handler.handleCallback(Handler.java:587)
04-17 03:10:54.056: E/AndroidRuntime(503):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-17 03:10:54.056: E/AndroidRuntime(503):  at android.os.Looper.loop(Looper.java:123)
04-17 03:10:54.056: E/AndroidRuntime(503):  at android.app.ActivityThread.main(ActivityThread.java:4627)
04-17 03:10:54.056: E/AndroidRuntime(503):  at java.lang.reflect.Method.invokeNative(Native Method)
04-17 03:10:54.056: E/AndroidRuntime(503):  at java.lang.reflect.Method.invoke(Method.java:521)
04-17 03:10:54.056: E/AndroidRuntime(503):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-17 03:10:54.056: E/AndroidRuntime(503):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-17 03:10:54.056: E/AndroidRuntime(503):  at dalvik.system.NativeStart.main(Native Method)
04-17 03:10:54.056: E/AndroidRuntime(503): Caused by: java.lang.ClassNotFoundException: android.content.ClipboardManager in loader dalvik.system.PathClassLoader[/data/app/com.ewe.radixcalculator-2.apk]
04-17 03:10:54.056: E/AndroidRuntime(503):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
04-17 03:10:54.056: E/AndroidRuntime(503):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
04-17 03:10:54.056: E/AndroidRuntime(503):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)

【问题讨论】:

我在 Android 2.2 模拟器和我的 Android 2.2 设备上收到此错误。 我认为 ClipboardManager 从 API 级别 11 开始...... 请参阅***.com/a/11012443/2116185,了解在不同 Android API 版本上获取 ClipboardManager 对象的正确方法。 【参考方案1】:

从您的堆栈跟踪中,很明显没有找到您正在使用的ClipboardManager。快速查找显示,Android 中有两个 ClipboardManager

    ClipboardManager (android.text.ClipboardManager) 自 API 1 起 ClipboardManager (android.content.ClipboardManager) 自 API 11 起

根据您的实现,我猜您打算使用仅包含在 API 11 中的后者。因此,您的代码会导致错误。

Eclipse 不会向您显示错误,因为您在导入部分中导入了android.text.ClipboardManager

要解决问题,请导入正确的包并指向相关的 API 版本。

如果您想在旧版本中使用android.text.ClipboardManager,我认为应该没问题。这是我将如何做到的。希望这可以帮助。

@Override
public boolean onContextItemSelected(MenuItem item) 
    String selectedItem = item.getTitle().toString().trim();
    try 
    ClipboardManager clipboard = new ClipboardManager();
    if (selectedItem.equals("Copy Query")) 
        clipboard.setText(tv1.getText().toString());
               
    return true;

【讨论】:

以上是关于通过上下文菜单将文本从edittext复制到剪贴板时出现异常?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将画布图像复制到剪贴板?

Edittext 在长按时进行选择但不显示上下文菜单?

如何将文本从CSV复制到剪贴板? [关闭]

在列表视图的上下文菜单中实现复制和粘贴

在 EditText 上禁用剪贴板建议中的粘贴

无法将文本从 WKWebview 复制到剪贴板