2016-02-04 29 views
0

我正在關注本書中的一些教程,並且我的代碼看起來很好,因爲我沒有發現任何錯誤。但是,當我嘗試運行我的應用程序時,出現了以下錯誤: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新手。

回答

1

getDrawable(resid)贊成getDrawable(resid, theme);

01被棄用API

試試這個,

private Drawable getDrawableResource(int resID) { 
    return ContextCompat.getDrawable(this, resID); 
} 
在你的代碼

然後,

if(mPhoneIsSilent) { 
    newPhoneImage = getDrawableResource(R.drawable.phone_silent); 
} else { 
    newPhoneImage = getDrawableResource(R.drawable.phone_on); 
} 

ContextCompat.getDrawable(this, resID)相當於調用,

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    return resources.getDrawable(resID, context.getTheme()); 
} else { 
    return resources.getDrawable(resID); 
} 
+0

對不起,延遲迴復。好,我會試試。 – Jerielle

+0

好吧,我改變了我的代碼,但是我對這行有一個錯誤'return getResources()。getDrawable(resID,getTheme());'還有這個'return getResources()。getDrawable(resID);'調用需要API級別21(當前最小爲8):android.content.res.Resources#getDrawable' – Jerielle

+0

@Jerielle很好。 'if'條件可以解決這個問題。 –

2

這是你的代碼崩潰: java.lang.NoSuchMethodError:com.example.silentmodetoggle.MainActivity.getDrawable

你應該叫getDrawable上的資源對象: getResources()getDrawable(

1

編輯只有這個方法: -

private void toggleUi() { 
     ImageView imageView = (ImageView)findViewById(R.id.imageView); 

     if(mPhoneIsSilent) { 
      imageView.setImageDrawable(getResources().getDrawable(R.drawable.img1)); 
     } else { 
      imageView.setImageDrawable(getResources().getDrawable(R.drawable.img2)); 
     } 
    } 
+0

我試着和它說'從方法getDrawable(INT)類型資源已棄用' – Jerielle

+0

只需將您的toggleUi()更改爲此代碼即可。其他人肯定會在這裏評論。 –