2014-02-21 3 views
3

У меня есть ProgressBar, который вызывает другую функцию при изменении, но время от времени мое приложение падает и бросает NoSuchMethodError. Я включаю в себя мой неполный код, а также трассировку стека, чтобы помочь мне устранить эту проблему.Почему приложение бросает NoSuchMethodError

Мой Partial 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) вместо этого, и передать его на вытяжке идентификатор ресурса, например:

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

Не знаю, откуда пришла странная ошибка с, но это лучшее решение, так или иначе.

+0

Вы правы. Я поддерживаю 4.0 и выше, и поэтому он падает. Я соответственно изменю свой код. Спасибо – SearchForKnowledge

+0

Отлично! Если это сработало для вас, пожалуйста, примите ответ, щелкнув зеленый флажок. Благодаря! –

2

Есть две общие сценарии NoSuchMethodError:

1) метод API/с вы использовали в вашем коде отличается от запуска временной версии баночки

2) Jar (X) вы использовали имеет зависимость on Jar (Y) -> Но у вас есть несовместимый Jar (Y) во время выполнения.

EDIT:

Для # 1, как я могу это предотвратить?

Это легко обрабатывать случай, добавьте баночку Lib и добавить такую ​​же баночку в пути компилятора (добавить библиотеку раздел, если затмение)

Для # 2, почему это происходит?

Это происходит, если вы загрузили Jar X, который в свою очередь, требует баночку Y, так что вы будете идти в Интернет и скачать, но не слишком заботится о том, какая версия Y совместима с X.

Как может мы предотвращаем этот случай? Прочтите readme.txt из Jar X и загрузите поддерживаемую версию Y.

Любой способ предотвратить оба?

Для этого нет пулевого ответа, вам необходимо правильно прочитать документацию, а не просто загружать и вставлять путь к классам.

+0

Для # 1 как я могу это предотвратить? Для №2 почему это происходит? Любой способ предотвратить оба? – SearchForKnowledge

+0

Эта функция является частью «основного» кода, так почему бы другим? – SearchForKnowledge

2

setBackground() может использоваться только для уровня api 16 и выше. Используйте setBackgroundDrawable() как я думаю, в вашем случае уровень api установлен ниже 16.

Телефон с уровнем апи ниже 16, они будут поддерживать

setBackgroundDrawable() 

ИЛИ вы можете сделать это:

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

Вы правы. Я поддерживаю 4.0 и выше, и поэтому он падает. Я соответственно изменю свой код. благодаря – SearchForKnowledge

Смежные вопросы