Newbie Android Error: java.lang.NoClassDefFoundError: android.content.ClipboardManager
Newbie Android Error: java.lang.NoClassDefFoundError: android.content.ClipboardManager
在我的 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.access00(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 初学者开发课程。我边做边学。哦,我碰巧使用 Android Studio。
Do I need to use a completely different but single code that support the API levels that I want?
您可以使用 the original android.text.ClipboardManager
中更简单的 API,它应该适用于所有 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
测试允许您在较新的设备上做一些很酷的事情,并在旧设备上优雅地降级。
在我的 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.access00(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 初学者开发课程。我边做边学。哦,我碰巧使用 Android Studio。
Do I need to use a completely different but single code that support the API levels that I want?
您可以使用 the original android.text.ClipboardManager
中更简单的 API,它应该适用于所有 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
测试允许您在较新的设备上做一些很酷的事情,并在旧设备上优雅地降级。