我正在關注本書中的一些教程,並且我的代碼看起來很好,因爲我沒有發現任何錯誤。但是,當我嘗試運行我的應用程序時,出現了以下錯誤:Android Studio項目中getDrawable的NoSuchMethodError
02-04 15:22:29.379: E/Trace(10992): error opening trace file: No such file or directory (2)
02-04 15:22:29.379: D/ActivityThread(10992): setTargetHeapUtilization:0.25
02-04 15:22:29.389: D/ActivityThread(10992): setTargetHeapIdealFree:8388608
02-04 15:22:29.389: D/ActivityThread(10992): setTargetHeapConcurrentStart:2097152
02-04 15:22:29.429: W/dalvikvm(10992): VFY: unable to resolve virtual method 15273: Lcom/example/silentmodetoggle/MainActivity;.getDrawable (I)Landroid/graphics/drawable/Drawable;
02-04 15:22:29.429: W/dalvikvm(10992): VFY: unable to resolve virtual method 15273: Lcom/example/silentmodetoggle/MainActivity;.getDrawable (I)Landroid/graphics/drawable/Drawable;
02-04 15:22:29.479: W/dalvikvm(10992): threadid=1: thread exiting with uncaught exception (group=0x41540438)
02-04 15:22:29.479: E/AndroidRuntime(10992): FATAL EXCEPTION: main
02-04 15:22:29.479: E/AndroidRuntime(10992): java.lang.NoSuchMethodError: com.example.silentmodetoggle.MainActivity.getDrawable
02-04 15:22:29.479: E/AndroidRuntime(10992): at com.example.silentmodetoggle.MainActivity.toggleUi(MainActivity.java:75)
02-04 15:22:29.479: E/AndroidRuntime(10992): at com.example.silentmodetoggle.MainActivity.onResume(MainActivity.java:88)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1187)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.app.Activity.performResume(Activity.java:5314)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2578)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2616)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2102)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.app.ActivityThread.access$600(ActivityThread.java:137)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.os.Handler.dispatchMessage(Handler.java:99)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.os.Looper.loop(Looper.java:137)
02-04 15:22:29.479: E/AndroidRuntime(10992): at android.app.ActivityThread.main(ActivityThread.java:4863)
02-04 15:22:29.479: E/AndroidRuntime(10992): at java.lang.reflect.Method.invokeNative(Native Method)
02-04 15:22:29.479: E/AndroidRuntime(10992): at java.lang.reflect.Method.invoke(Method.java:511)
02-04 15:22:29.479: E/AndroidRuntime(10992): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
02-04 15:22:29.479: E/AndroidRuntime(10992): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
02-04 15:22:29.479: E/AndroidRuntime(10992): at dalvik.system.NativeStart.main(Native Method)
我不知道哪部分出了問題。
這裏是我的代碼:
package com.example.silentmodetoggle;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private AudioManager mAudioManager;
private boolean mPhoneIsSilent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
checkIfPhoneIsSilent();
setButtonClickListener();
}
private void setButtonClickListener() {
Button toggleButton = (Button)findViewById(R.id.toggleButton);
toggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPhoneIsSilent) {
//change back to normal mode
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
mPhoneIsSilent = false;
} else {
//Change to silent mode
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
mPhoneIsSilent = true;
}
//Now toggle the UI again
toggleUi();
}
});
}
/*
* Checks to see if the phone is currently in silent mode
*/
private void checkIfPhoneIsSilent() {
int ringerMode = mAudioManager.getRingerMode();
if(ringerMode == AudioManager.RINGER_MODE_SILENT) {
mPhoneIsSilent = true;
} else {
mPhoneIsSilent = false;
}
}
/*
* Toggles the UI images from silent to normal and vice versa
*/
private void toggleUi() {
ImageView imageView = (ImageView)findViewById(R.id.phone_icon);
Drawable newPhoneImage;
if(mPhoneIsSilent) {
newPhoneImage = getDrawable(R.drawable.phone_silent);
} else {
newPhoneImage = getDrawable(R.drawable.phone_on);
}
imageView.setImageDrawable(newPhoneImage);
}
@Override
protected void onResume() {
super.onResume();
checkIfPhoneIsSilent();
toggleUi();
}
}
我在API 23上運行,我使用Eclipse這一點。你能幫我確定哪些部分是我的錯誤嗎?我是Android新手。
對不起,延遲迴復。好,我會試試。 – Jerielle
好吧,我改變了我的代碼,但是我對這行有一個錯誤'return getResources()。getDrawable(resID,getTheme());'還有這個'return getResources()。getDrawable(resID);'調用需要API級別21(當前最小爲8):android.content.res.Resources#getDrawable' – Jerielle
@Jerielle很好。 'if'條件可以解決這個問題。 –