2014-02-21 109 views
3

我有一個ProgressBar調用另一個函數時,但每隔一段時間我的應用程序崩潰並拋出NoSuchMethodError。我包括我的部分代碼以及堆棧跟蹤,以幫助我解決問題。爲什麼應用程序拋出NoSuchMethodError

我的部分Java代碼:

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { 
     ShowText(); 
     switch(seekBar.getId()) { 
      case R.id.syst_bar: 
       ShowText(); 
       progress = progress + 70; 
       tvSVal.setText(String.valueOf(progress)); 
       if (progress == 70) { 
        tvSOne.setTextColor(Color.parseColor("#4E9CD2")); 
        tvSTwo.setTextColor(Color.WHITE); 
       } 
       else if (progress == 190) { 
        tvSOne.setTextColor(Color.WHITE); 
        tvSTwo.setTextColor(Color.parseColor("#4E9CD2")); 
       } 
       else { 
        tvSOne.setTextColor(Color.WHITE); 
        tvSTwo.setTextColor(Color.WHITE); 
       } 
      break; 
      case R.id.dias_bar: 
       ShowText(); 
       progress = progress + 40; 
       tvDVal.setText(String.valueOf(progress)); 
       if (progress == 40) { 
        tvDOne.setTextColor(Color.parseColor("#4E9CD2")); 
        tvDTwo.setTextColor(Color.WHITE); 
       } 
       else if (progress == 100) { 
        tvDOne.setTextColor(Color.WHITE); 
        tvDTwo.setTextColor(Color.parseColor("#4E9CD2")); 
       } 
       else { 
        tvDOne.setTextColor(Color.WHITE); 
        tvDTwo.setTextColor(Color.WHITE); 
       } 
      break; 
     default: 
      break; 
     } 
    } 

public void ShowText() { 
    int inOne = sbSyst.getProgress() + 70; 
    int inTwo = sbDias.getProgress() + 40; 

    Log.i("SYSTOLIC SHOWTEXT", String.valueOf(inOne)); 
    Log.i("DIASTOLIC SHOWTEXT", String.valueOf(inTwo)); 

    if ((inOne >= 70 && inOne <= 90) && (inTwo >= 40 && inTwo <= 60)) { 
     tvRes.setText("LOW"); 
     tvRes.setBackgroundColor(Color.parseColor("#73539E")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.lowtextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.lowtextpress)); 
    } 
    if ((inOne >= 70 && inOne <= 90) && (inTwo >= 61 && inTwo <= 80)) { 
     tvRes.setText("IDEAL"); 
     tvRes.setBackgroundColor(Color.parseColor("#679800")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.idealtextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.idealtextpress)); 
    } 
    if ((inOne >= 70 && inOne <= 90) && (inTwo >= 81 && inTwo <= 90)) { 
     tvRes.setText("PRE-HIGH"); 
     tvRes.setBackgroundColor(Color.parseColor("#967400")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); 
    } 
    if ((inOne >= 70 && inOne <= 90) && (inTwo >= 91 && inTwo <= 100)) { 
     tvRes.setText("HIGH"); 
     tvRes.setBackgroundColor(Color.parseColor("#960000")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); 
    } 

    if ((inOne >= 91 && inOne <= 120) && (inTwo >= 40 && inTwo <= 80)) { 
     tvRes.setText("IDEAL"); 
     tvRes.setBackgroundColor(Color.parseColor("#679800")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.idealtextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.idealtextpress)); 
    } 
    if ((inOne >= 91 && inOne <= 120) && (inTwo >= 81 && inTwo <= 90)) { 
     tvRes.setText("PRE-HIGH"); 
     tvRes.setBackgroundColor(Color.parseColor("#967400")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); 
    } 
    if ((inOne >= 91 && inOne <= 120) && (inTwo >= 91 && inTwo <= 100)) { 
     tvRes.setText("HIGH"); 
     tvRes.setBackgroundColor(Color.parseColor("#960000")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); 
    } 

    if ((inOne >= 121 && inOne <= 140) && (inTwo >= 40 && inTwo <= 90)) { 
     tvRes.setText("PRE-HIGH"); 
     tvRes.setBackgroundColor(Color.parseColor("#967400")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); 
    } 
    if ((inOne >= 121 && inOne <= 140) && (inTwo >= 91 && inTwo <= 100)) { 
     tvRes.setText("HIGH"); 
     tvRes.setBackgroundColor(Color.parseColor("#960000")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); 
    } 
    if ((inOne >= 141 && inOne <= 190) && (inTwo >= 40 && inTwo <= 100)) { 
     tvRes.setText("HIGH"); 
     tvRes.setBackgroundColor(Color.parseColor("#960000")); 
     tvSVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); 
     tvDVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); 
    } 
} 

LogCat

java.lang.NoSuchMethodError: android.widget.TextView.setBackground 
at com.sikni8.bloodpressurelite.MainActivity.ShowText(MainActivity.java:231) 
at com.sikni8.bloodpressurelite.MainActivity.onProgressChanged(MainActivity.java:171) 
at android.widget.SeekBar.onProgressRefresh(SeekBar.java:89) 
at android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:609) 
at android.widget.ProgressBar.refreshProgress(ProgressBar.java:621) 
at android.widget.ProgressBar.setProgress(ProgressBar.java:670) 
at android.widget.AbsSeekBar.trackTouchEvent(AbsSeekBar.java:411) 
at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:342) 
at android.view.View.dispatchTouchEvent(View.java:5553) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1930) 
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1389) 
at android.app.Activity.dispatchTouchEvent(Activity.java:2378) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1878) 
at android.view.View.dispatchPointerEvent(View.java:5733) 
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3104) 
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2666) 
at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:900) 
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2675) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:4624) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) 
at dalvik.system.NativeStart.main(Native Method) 

如何修改代碼,以便它不會拋出異常或有更好的錯誤處理方法?

+0

是不是修改代碼,問題是,你的程序未找到在運行時需要確保包含該類的jar包含在類路徑 – morgano

+0

中,而不是使用'setBackgroundResource'。這裏是文檔:http://developer.android.com/reference/android/view/View.html#setBackgroundResource(int) – Peshal

回答

5

使用TextView.setBackgroundResource(int),而是和它傳遞繪製資源ID,像這樣:

tvRes.setBackgroundColor(Color.parseColor("#73539E")); 
tvSVal.setBackgroundResource(R.drawable.lowtextpress); 
tvDVal.setBackgroundResource(R.drawable.lowtextpress); 

不知道從哪裏傳來了奇怪的錯誤,但是這是一個更好的解決方案無論哪種方式。

+0

你說得對。我支持4.0及更高版本,這就是爲什麼它崩潰:)我會相應地更改我的代碼。謝謝 – SearchForKnowledge

+0

太棒了!如果這適用於您,請點擊綠色複選框接受答案。謝謝! –

2

有用於NoSuchMethodError,這兩個公共場景:

1)API方法/ s的你已經在你的代碼中使用比運行時JAR版本不同

2)將罐已使用(X)具有相關性在Jar(Y)上 - >但是在運行時你有不兼容的Jar(Y)。

編輯:

#1我該怎麼預防呢?

這是很容易處理的情況下,加廣口瓶中,LIB和編譯器的路徑添加同一個jar(添加庫部分,如果日食)

#2爲什麼會發生?

出現這種情況,如果你已經下載了罐子X這又需要罐子Y,所以你會去網上下載,但沒有在意其中Y版本與X兼容

哪有我們防止這種情況? 從Jar X中讀取readme.txt並下載支持的Y版本。

任何方式來防止兩者?

這裏沒有子彈答案,您需要正確閱讀文檔,而不是簡單地下載並放入classpath。

+0

對於#1我怎麼能防止它?對於#2爲什麼會發生?任何方式來防止兩者? – SearchForKnowledge

+0

該函數是'main'代碼的一部分,爲什麼它會不同? – SearchForKnowledge

2

setBackground()只能用於api級別16及以上。使用setBackgroundDrawable()因爲我認爲你的情況下API級別設置爲16以下。

電話與低於16 API級別,他們會支持

setBackgroundDrawable() 

或者你可以這樣做:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
    myTextView.setBackground(d); 
} 
else { 
    myTextView.setBackgroundDrawable(d); 
} 
+0

你說得對。我支持4.0及更高版本,這就是爲什麼它崩潰:)我會相應地更改我的代碼。謝謝 – SearchForKnowledge

相關問題