java - 新手Android错误: java. lang.NoClassDefFoundError : android. content.ClipboardManager

标签 java android android-studio runtime-error android-api-levels

在我的 Android 应用程序中,我碰巧使用以下代码从 TextView 复制文本。

buttonCopy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String copyText;
copyText = textBox2.getText().toString();
myClip = ClipData.newPlainText("text", copyText);
myClipboard.setPrimaryClip(myClip);
Toast.makeText(getApplicationContext(), "Copied",     Toast.LENGTH_SHORT).show();
}
});

我为应用程序设置的最低 API 级别是 API 级别 10。但我明白这一点

myClip = ClipData.newPlainText("text", copyText);
myClipboard.setPrimaryClip(myClip);

需要最低 API 级别 11。

果然,我的应用用户正在发送以下报告

java.lang.NoClassDefFoundError: android.content.ClipboardManager
at com.nepali_unicode.nepalityping.MainActivity.onCreate(Unknown Source)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)

我想支持 API 级别 10 的旧设备。所以,我的问题是如何为这些旧设备启用复制按钮?

  • 我是否需要使用完全不同但单一的代码来支持我想要的 API 级别?
  • 或者我可以采取什么措施,以便采用 API 10 的设备使用不同的代码来复制文本?

我将非常感谢您的帮助。我是新手。我的 PHP 编程背景鼓励我学习 Android。我在 Udacity 学习了 Android 初学者开发类(class)。我边做边学。哦,我碰巧使用 Android Studio。

最佳答案

Do I need to use a completely different but single code that support the API levels that I want?

您可以使用更简单的 API the original android.text.ClipboardManager ,它应该适用于所有 API 级别。在您的情况下,只需调用 setText() 将文本放入剪贴板。

Or is there something that I can do so that devices with API 10 will use a different code to copy text?

您可以使用 Build.VERSION.SDK_INT 查看您使用的 Android 版本并执行不同的操作:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
  // do the newer API
}
else {
  // do the older API
}

在您的具体情况下,由于您的新代码似乎没有执行除 setText() 之外的任何操作,因此只需使用 setText() 即可更简单。但是,如果您利用较新的剪贴板 API 提供的更复杂的功能(例如,提供不同 MIME 类型的内容变体,例如 HTML 和纯文本),那么使用上面的 if 测试允许您可以在较新的设备上做一些很酷的事情,并在较旧的设备上优雅地降级。

关于java - 新手Android错误: java. lang.NoClassDefFoundError : android. content.ClipboardManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32771146/

相关文章:

java - 绝对值之和

java - 高清设备上 2D android/java 游戏中的错误 FPS

android - Grid View Pager 中的 ScrollView 不适用于 Android Wear

java - 如何使用 openGL 在 android studio 中渲染 .dae(collada) 文件

java - 在 Java 中构建/运行流式 Weka 文本分类器

java - 为什么 Spring Boot 中的 REST Controller 返回 HTTP 状态 404 – 未找到

java - 在Android上单击手机硬件后退按钮时从未调用过onResume?

java - 应用程序不断停止与 TextView.setText() 方法

java - 无法 Autowiring 字段 : javax. sql.DataSource

java - Eclipse 显示错误,而 ndk_build 成功