2010-11-26 5 views
3

Actuellement, j'utilise le code suivant et je me demande s'il existe un moyen plus efficace de le faire via une fonction?Utiliser findViewById de manière plus efficace

showDisplay = (LinearLayout)findViewById(R.id.display1); 
if (isA) 
{ 
{ showDisplay.setVisibility(0);} 
else 
{ showDisplay.setVisibility(8); } 


showDisplay = (LinearLayout)findViewById(R.id.display2); 
if (isB) 
{ showDisplay.setVisibility(0);} 
else 
{ showDisplay.setVisibility(8); } 

showDisplay = (LinearLayout)findViewById(R.id.display3); 
if (isC) 
{ showDisplay.setVisibility(0);} 
else 
{ showDisplay.setVisibility(8); } 

Répondre

1

Je ferais comme ça

// Do this in your onCreate method and store the references as class member variables 
showDisplay1 = (LinearLayout)findViewById(R.id.display1); 
showDisplay2 = (LinearLayout)findViewById(R.id.display2); 
showDisplay3 = (LinearLayout)findViewById(R.id.display3); 

// Do this somehwere in your code 
showDisplay1.setVisibility(isA?View.VISIBLE:View.GONE); 
showDisplay2.setVisibility(isB?View.VISIBLE:View.GONE); 
showDisplay3.setVisibility(isC?View.VISIBLE:View.GONE); 

Pour efficacité il est important de stocker les références en tant que variables membres, comme appelant findViewById est une action assez coûteuse (comparée à l'accès à une variable membre), car vous n'aurez besoin de l'appeler qu'une seule fois lors de la création de l'application d (cela prend également en compte les changements d'orientation, car l'activité est détruite et recréée).

Et c'est assez propre et bien rangé. Inline si-expressions sont très utiles pour ce genre de fonctions, où vous n'avez que cela ou cela.

myFunction((expression)?if_value:else_value); 

est courte

int value = 0; 
if(expression) { 
    value = if_value; 
} else { 
    value = else_value; 
} 
myFunction(value); 

fondamentalement, vous pouvez ignorer la () si la variable est déjà un booléen, sinon vous devez mettre les crochets. Donc, cela fonctionnera bien aussi

myFunction((someVariable>3)?View.VISIBLE:View.GONE); 

Edit2:

int value = 0; 
if(somveVariable > 3) { 
    value = View.VISIBLE; 
} else { 
    value = View.GONE; 
} 
myFunction(value); 

Ainsi, au lieu de faire une variable pour tenir une valeur que vous voulez passer à une fonction, vous pouvez tout faire en ligne.

Edit: Oh et btw: S'il vous plaît, ne jamais utiliser 0 ou 8 pour la méthode View.setVisibility(...). Ceci est une très mauvaise pratique et va casser votre application si les valeurs changent à l'avenir. View.VISIBLE est déjà un public static final int, ce qui signifie que le compilateur remplacera toutes les occurrences de View.VISIBLE par un 0. Dans le code octet, il est identique à 0, sans impact sur les performances, mais si la valeur doit être modifiée, tous les changements se produiront automatiquement au moment de la compilation avec le nouveau SDK et aucune modification manuelle n'est nécessaire, alors qu'avec votre tentative vous auriez pour remplacer chaque 0 et 8 avec les nouvelles valeurs!

+0

Cool, ça a bien marché. Et si je voulais aussi appeler une autre fonction dans l'instruction if? Par exemple. ig isA, cache et exécute une autre fonction. – bebeTech

+0

Vous pouvez faire cela aussi, tout ce qui fonctionne normalement 'if', y travailler aussi – Tseng

+0

Hmmmm, je ne dois pas avoir la bonne syntaxe. J'essayais showDisplay1.setVisibility (isA? View.VISIBLE, functionA() ;: View.GONE); – bebeTech

1

je ferais quelque chose comme ceci:

public void showDisplay(int displayId, boolean show) { 
    if (show) { 
     ((LinearLayout)findViewById(displayId)).setVisibility(0); 
    } 
    else { 
     ((LinearLayout)findViewById(displayId)).setVisibility(8); 
    } 
} 

showDisplay(R.id.display1, isA); 
showDisplay(R.id.display2, isB); 
showDisplay(R.id.display3, isC); 

Le code devient plus lisible, pas plus efficace.

2

J'ai généralement un tas d'aides pour définir des propriétés communes comme la visibilité, le texte, etc. Cela rend le code plus joli.

setChildVisibility(R.id.display1, isA); 
setChildVisibility(R.id.display2, isB); 
setChildVisibility(R.id.display3, isC); 

Avec l'être d'aide:

protected void setChildVisibility(int id, boolean visible) { 
    View view = findViewById(id); 
    if (view != null) { 
     view.setVisibility(visible?View.VISIBLE:View.GONE); 
    } 
} 
Questions connexes