Case à cocher[] avec onClickListener[]?
EDIT: cette question est la plupart du temps fermée et les seuls problèmes que j'ai avec ce code sont discutés ici
Pour une partie de mon application, j'ai une page d'éléments qui sont représentés comme des cases à cocher, chacun avec un associé booléen qui finalement être collectées et stockées comme une chaîne de caractères comme suit:
final CheckBox gas_oil = (CheckBox) findViewById(R.id.gas_oil);
gas_oil.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
if (gas_oil.isChecked())
{
impacts.append(getString(R.string.gas_oil) + " | ");
anythingchecked = true;
}
}
});
c'est extrêmement fastidieux et ne semble pas être un très efficace moyen de le faire depuis que j'ai 9 ou 10 éléments que les utilisateurs peuvent consulter ou pas. aussi cette méthode signifie que si ils cliquent et décochez quelque chose, que l'article est toujours dans le StringBuilder impacts
et que si ils cliquez sur nouveau, puis il est là, à deux reprises.
Ma solution était d'avoir tout dans les tableaux:
String[] impactsn = getResources().getStringArray(R.array.impacts);
final boolean[] impactsb = new boolean[impactsn.length];
final CheckBox[] impactsc = new CheckBox[impactsn.length];
View[] impactsv = new View[]{findViewById(R.id.gas_oil),findViewById(R.id.ghost_fishing),findViewById(R.id.marsh_damage),findViewById(R.id.nav_haz),findViewById(R.id.shell_damage),findViewById(R.id.waste_pollution),findViewById(R.id.wild_entang),findViewById(R.id.other)};
for (int i = 0; i < impactsn.length; i++)
{
impactsc[i] = (CheckBox) impactsv[i];
impactsc[i].setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if (impactsc[i].isChecked())
impactsb[i] = true;
else
impactsb[i] = false;
}
});
}
malheureusement, cette opération entraîne le problème (comme je le comprends) des choses à l'intérieur d'un OnClickListener
être final. Avec le code écrit, i
ne peut jamais être en finale, donc je suis un peu au point mort.
Doit-on/peut-on avoir un tableau de OnClickListeners
ainsi? Devrais-je appeler une méthode en dehors de la code que j'ai ici?
Également, ci-dessous s'agit de la lecture, j'ai été l'intention de l'utiliser, je pense que la partie va très bien fonctionner:
String getImpacts ()
{
String[] impactsn = getResources().getStringArray(R.array.impacts);
StringBuilder impactss = new StringBuilder();
for (int i = 0; i < impactsn.length; i ++)
{
if (impactsb[i])
impactss.append(impactsn[i] + " | ");
}
return String.valueOf(impactss);
}
EDIT: c'est la version de code im en cours d'exécution avec maintenant:
package com.citsci.mardeb;
import android.app.De l'activité;
import android.contenu.res.Ressources;
import android.os.Faisceau;
import android.vue.Vue;
import android.widget de.Case à cocher;
import android.widget de.EditText;
public class Impacts s'étend de l'Activité met en œuvre la Vue.OnClickListener
{
int longueur = 7;
boolean[] impactsb = new boolean[] {false, false, false, false, false, false, false, false};
EditText;
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.impacts);
//for (int i = 0; i < longueur; i++)
//impactsb[i] = false;
View[] impactsv = new View[]
{
findViewById(R.id.gas_oil),
findViewById(R.id.ghost_fishing),
findViewById(R.id.marsh_damage),
findViewById(R.id.nav_haz),
findViewById(R.id.shell_damage),
findViewById(R.id.waste_pollution),
findViewById(R.id.wild_entang),
findViewById(R.id.other)
};
CheckBox[] impactsc = new CheckBox[length];
for (int i = 0; i < length; i++)
{
impactsc[i] = (CheckBox) impactsv[i];
impactsc[i].setOnClickListener(this);
}
}//end of onCreate
@Override
public void onClick(View v)
{
switch (v.getId()) {
case (R.id.gas_oil):
impactsb[0] =! impactsb[0];
break;
case (R.id.ghost_fishing):
impactsb[1] =! impactsb[1];
break;
case (R.id.marsh_damage):
impactsb[2] =! impactsb[2];
break;
case (R.id.nav_haz):
impactsb[3] =! impactsb[3];
break;
case (R.id.shell_damage):
impactsb[4] =! impactsb[4];
break;
case (R.id.waste_pollution):
impactsb[5] =! impactsb[5];
break;
case (R.id.wild_entang):
impactsb[6] =! impactsb[6];
break;
case (R.id.other):
impactsb[7] =! impactsb[7];
}
}
String getImpacts ()
{
String[] impactsn = new String[length];
Resources myResources = getResources();
impactsn = myResources.getStringArray(R.array.impacts);
StringBuilder impactss = new StringBuilder();
for (int i = 0; i < length; i ++)
{
if (impactsb[i])
impactss.append(impactsn[i] + " | ");
}
if (String.valueOf(impactss) != "")
impactss.insert(0, "Impacts: ");
return String.valueOf(impactss);
}
}//end of Impacts.class
haha vous pourrait tout à fait être bon, je vais faire tout comme je vais le long. brièvement, mon application est censée être une sorte de version intéressante de cette forme dhec formulaire. lorsque l'utilisateur a rempli le formulaire, cliquez sur soumettre et l'application collecte toutes les informations qu'ils ont présenté dans une chaîne de sorte qu'il peut être joint dans un mail, et soumis des. je n'ai aucune idée de ce que
HashMaps
sont pour le moment mais je vais regarder dans developer.android.com et sur ici et de voir si ceux qui semble le plus approprié.désolé pour la mise en forme bâclée, j'ai utiliser les onglets et utilise DONC des espaces, ses frustrant va-et-vient.
OriginalL'auteur dylan murphy | 2011-06-02
Vous devez vous connecter pour publier un commentaire.
N'utilisez pas anonyme (inline) auditeurs dans ce cas. Au contraire, votre Activité, mettre en œuvre l'auditeur...
Alors tout ce que vous devez faire pour mettre l'auditeur est...
Puis test dont la Case a été cliqué par l'aide de la Vue qui est passé à...
onClick(View v)
onClick(View v)
" est un peu déroutant, est-ce que vous avez voulu dire:@Override public void onClick(View v) { for (int i = 0; i < impactsn.length; i++) { if (v == impactsv[i]) impactsb[i] = true; else impactsb[i] = false; } }
désolé si peu ... je ne pourrais pas comprendre comment formater le code correctementVoir mon édité onClick(...) de la méthode.
ok, ignorer mon commentaire précédent. malades essayer.
hrumph ... après le dîner. aussi c'est peut-être moi qui suis gourmande/impatient, mais est-il de toute façon à faire
switch (v.getId()) {case findViewById(impactsv[0]): impactsb[0] = true;
travail? aussi avec votre solution, ce qui se produit lorsque l'utilisateur clique sur quelque chose de nouveau pour le désélectionner, est l'untoggle
pour les booléens? encore une fois, merci beaucoup, ill être de retour dans quelques heuresVoir mon édité cas. Utiliser le unaire 'PAS' opérateur ( ! aka logique compliment opérateur) pour basculer d'un booléen.
OriginalL'auteur Squonk
d'abord, vous n'avez pas à les avoir comme finale, vous pouvez les déclarer outsid de la fonction, alors vous ne serez pas demandé de les déclarer comme définitive.
deuxième, si vous avez besoin de savoir l'état des cases à cocher comme ils sont changé, vous pouvez ajouter un écouteur à chacun d'eux avec une autre tâche, bien sûr, vous pouvez le faire avec une boucle, et puis cette boucle appel à une autre fonction qui va avoir l'étiquette de ce chsckbox, et de réagir en fonction de cette balise.
Si vous n'avez pas besoin de connaître l'état lorsqu'ils sont modifiés, vous pouvez vérifier l'état de leur une fois que vous avez terminé avec cet écran, avec isSelected() la méthode.
Espère que cette aide,
En ce qui concerne meilleur.
alors que je suis sûr que vous avez peut-être raison, il est difficile de suivre ce que vous suggérez, sans que des exemples de code, vous pourriez peut-être modifier le code que j'ai fourni pour correspondre à ce que vous êtes en train de parler?
OriginalL'auteur Ben
Voici un code complet pour cela, il vous suffit de remplir entre à vos besoins :
public class mainA s'étend de l'Activité
{
Case à cocher[] chbx;Bouton appliquer;
}
hrm ce qui est intéressant, je cherche à maintenant.
j'aime la balise chose, j'ai mis en place. je n'ai uniquement besoin de vérifier l'état de tout à la fois, mais je suis plus que un peu confus quant à la façon dont vous le faisons avec la
apply
bouton. je vais éditer le code dans ma question afin de refléter ce que je suis actuellement en train de travailler.Désolé pour le retard à répondre, deux choses, d'abord, je n'aime pas à mettre en œuvre le onclick de l'interface dans mon activité principale, et dans l'autre main je suppose que vous n'écrivez pas une activité qui fonctionnent uniquement pour le onclick de l'interface, de cette manière, il est facile de faire des erreurs, il suffit de créer une classe ou même comme ceci : setOnClickListener(new View.onClickListener(){ public void onClick(){ @todo }});
La deuxième est de ta question, eh bien une fois que vous cliquez sur apply(peut-être à soumettre ou à définir) à l'intérieur de cette méthode onClick vérifier l'état de chacun d'eux avec la méthode isSelected(), et faire le travail qui doit être fait en fonction de chaque case, il est probable que chaque case est responsoible pour autre chose, donc chaque case à cocher si la case est cochée ou non appel à la méthode spécifique pour traiter cet état(activé ou désactivé).
OriginalL'auteur Ben