2013-09-05 3 views
0

J'ai une application avec ExpandableListView et chaque en-tête a son propre drawable comme arrière-plan. Voici le code:App s'écraser sur les anciennes versions Android (ExpandableListView personnalisable drawable)

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB); 
    { 
     switch(groupPosition){ 
     case 0: 
      convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue)); 
      break; 
     case 1: 
      convertView.setBackground(this._context.getResources().getDrawable(R.drawable.drugi_letniki_color)); 
      break; 
     case 2: 
      convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue)); 
      break; 
     case 3: 
      convertView.setBackground(this._context.getResources().getDrawable(R.drawable.cetrti_letniki_color)); 
      break; 
     } 
    } 

Cela fonctionne tout à fait bien sur mon Samsung Galaxy Nexus avec Android 4.3 mais quand je l'essayer sur l'émulateur avec la version Android 2.2, il se bloque.

Ceci est le fichier logcat:

09-05 20:46:45.914: E/AndroidRuntime(371): FATAL EXCEPTION: main 
09-05 20:46:45.914: E/AndroidRuntime(371): java.lang.NoSuchMethodError: android.view.View.setBackground 
09-05 20:46:45.914: E/AndroidRuntime(371): at com.whizzapps.stpsurniki.ExpandableListAdapter.getGroupView(ExpandableListAdapter.java:100) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:445) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.AbsListView.obtainView(AbsListView.java:1315) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.ListView.makeAndAddView(ListView.java:1727) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.ListView.fillDown(ListView.java:652) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.ListView.fillFromTop(ListView.java:709) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.ListView.layoutChildren(ListView.java:1580) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.AbsListView.onLayout(AbsListView.java:1147) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.view.View.layout(View.java:7035) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1238) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.LinearLayout.onLayout(LinearLayout.java:1044) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.view.View.layout(View.java:7035) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.view.View.layout(View.java:7035) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.view.View.layout(View.java:7035) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.view.View.layout(View.java:7035) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.view.ViewRoot.performTraversals(ViewRoot.java:1045) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.os.Looper.loop(Looper.java:123) 
09-05 20:46:45.914: E/AndroidRuntime(371): at android.app.ActivityThread.main(ActivityThread.java:4627) 
09-05 20:46:45.914: E/AndroidRuntime(371): at java.lang.reflect.Method.invokeNative(Native Method) 
09-05 20:46:45.914: E/AndroidRuntime(371): at java.lang.reflect.Method.invoke(Method.java:521) 
09-05 20:46:45.914: E/AndroidRuntime(371): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
09-05 20:46:45.914: E/AndroidRuntime(371): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
09-05 20:46:45.914: E/AndroidRuntime(371): at dalvik.system.NativeStart.main(Native Method) 

Ceci est la ligne 100:

convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue)); 

Comme vous pouvez le voir je l'ai déjà essayé de résoudre le problème en désactivant l'arrière-plan personnalisé sur les anciennes versions, mais il semble comme il ignore la déclaration si.

EDIT: Si quelqu'un se demande toujours comment j'ai résolu le problème; voici le code:

if (Build.VERSION.SDK_INT >= 16) 
    { 
     switch(groupPosition){ 
     case 0: 
      convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue)); 
      break; 
     case 1: 
      convertView.setBackground(this._context.getResources().getDrawable(R.drawable.drugi_letniki_color)); 
      break; 
     case 2: 
      convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue)); 
      break; 
     case 3: 
      convertView.setBackground(this._context.getResources().getDrawable(R.drawable.cetrti_letniki_color)); 
      break; 
     } 
    } 
    else if (Build.VERSION.SDK_INT < 16) 
    { 
     switch(groupPosition){ 
     case 0: 
      convertView.setBackgroundDrawable(this._context.getResources().getDrawable(R.drawable.light_blue)); 
      break; 
     case 1: 
      convertView.setBackgroundDrawable(this._context.getResources().getDrawable(R.drawable.drugi_letniki_color)); 
      break; 
     case 2: 
      convertView.setBackgroundDrawable(this._context.getResources().getDrawable(R.drawable.light_blue)); 
      break; 
     case 3: 
      convertView.setBackgroundDrawable(this._context.getResources().getDrawable(R.drawable.cetrti_letniki_color)); 
      break; 
     } 
    } 

C'est parce que .setBackgroundDrawable est disponible sur l'API 1 et plus, alors que .setBackground est disponible uniquement sur API 16 et jusqu'à

Répondre

0

Le contrôle ne fonctionne pas parce que Build.VERSION_CODES.HONEYCOMB n'est pas défini en 2.2.

Vous aurez juste besoin d'utiliser une constante si vous voulez faire la vérification.

Modifier

, vous disposez également d'un après votre déclaration if point-virgule. Vous devriez supprimer cela afin que votre condition contrôle réellement si vous allez ou non dans le bloc de code de votre instruction if.

+0

J'ai essayé d'insérer du code de version directe mais il exécute toujours l'instruction if. J'ai essayé si (Build.VERSION.SDK_INT> 8); – Guy

+0

Débarrassez-vous du point-virgule. –

+0

Il devrait juste être 'if (Build.VERSION.SDK_INT> 8)' pas de point-virgule après la condition. –

Questions connexes