2

在我的Android應用程序中,我恰好使用以下代碼從TextView複製文本。新手Android錯誤:java.lang.NoClassDefFoundError:android.content.ClipboardManager

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 Development for Beginners課程。我正在學習。哦,我碰巧使用Android Studio。

回答

1

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測試可以讓您較新的設備和舊設備上的優雅降級。

+0

感謝您的輸入。我決定使用if else版本。 –