Aller au contenu

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

guigs06

Problème accès bouton lors d'un changement d'activity

Recommended Posts

Bonjour,

J'ai commencé Java depuis 5 jours et fait quelques tutos android , donc veuillez m'excuser si cette question vous paraît idiote ^^

* J'ai donc une "vue" qui contient un bouton, lors du click on passe sur une autre vue qui contient elle aussi un bouton, et lors du click sur ce bouton on revient à la première vue. ça fonctionne, seulement j'aimerais changer le titre du bouton 1 lors du click sur le bouton 2 de ma première classe. Là j'ai un crash de l'appli... (apparemment NullPointerException d'après les logs).

Voici mes classes :

public class Accueil extends Activity implements OnClickListener {

Button boutonItineraire = null;
Button boutonRetourAccueil = null;
Button bouton2 = null;
String i = new String("sfreg");

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       boutonItineraire = (Button)findViewById(R.id.buttonItineraire);
       boutonItineraire.setOnClickListener(this);
       //bouton2 = (Button)findViewById(R.id.button2);
   }

@Override
public void onClick(View v) {
	// TODO Auto-generated method stub

	if (v == boutonItineraire) {
		Intent intent = new Intent(this, Itineraire.class);
		startActivity(intent);
	}
}
}

et la deuxième :

public class Itineraire extends Accueil implements OnClickListener {

//Button boutonRetourAccueil = null;

/** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.layoutitineraire);

       boutonRetourAccueil = (Button)findViewById(R.id.buttonRetourAccueil);
       boutonRetourAccueil.setOnClickListener(this);
   }

@Override
public void onClick(View arg0) {
	// TODO Auto-generated method stub

	if (arg0 == boutonRetourAccueil) {
		i += "sdfsd";
		bouton2 = (Button)findViewById(R.id.button2);  
// ICI LE PROBLEME APPAREMMENT			
bouton2.setText(i);             
// Fin problème ;-)
		boutonRetourAccueil.setText(i);
		Intent newIntent = new Intent(this, Accueil.class);
		startActivity(newIntent);
	}
}

}

* Je voulais aussi savoir, est-ce que ma méthode est la bonne concernant le changement de vue ?

Et n'aurais-je pas de problème de mémoire ? J'ai développé pour un autre support avec lequel il y a beaucoup de problèmes mémoire à gérer (indice : je l'ai fait sous un pommier) donc je me demandais si j'allais avoir les mêmes soucy.

Merci beaucoup si quelqu'un daigne répondre à ce message (déjà si quelqu'un lit tout, respect !!) :D

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

C’est quoi R.id.button2 ?

Tu as dis que tu avais deux boutons en tout et il y a déjà R.id.buttonItineraire et R.id.buttonRetourAccueil.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

Oui je me suis mal exprimé pardon.

En fait sur ma première page il y a 3 boutons (je click sur "boutonItinéraire" pour changer d'activity) et il y a bouton2 et bouton3 et je voulais juste faire un test en chageant le nom du bouton2 avec le setText() c'est pour ça que je l'ai déclaré dans ma première classe (il est dans le main.xml aussi).

En gros c'est le fameu bouton qui doit changer lors du click sur boutonRetourAccueil (le "4ème" bouton en gros qui est sur la deuxième page"), et qui me fait crasher l'appli :/

Partager ce message


Lien à poster
Partager sur d’autres sites

En fait je ne comprends pas trop comment tu espères arriver à quelque chose de cette façon là.

Ta classe « Itinéraire » étend ta classe « Accueil », ce qui signifie qu’elle possèdera également un champ String i, mais ce ne sera pas du tout le même que celui de ton activité Accueil.

Quand une classe hérite d’une autre, les noms et types des champs et méthodes sont conservés, mais il n’y a pas du tout de partage des données (sauf en cas de champs statiques).

Et ton problème est parfaitement logique. Dans ton activité Itineraire, le layout ayant changé, les R.id.* ne réfèrent plus aux mêmes éléments, et comme il n’y a pas de R.id.button2 dans layoutitineraire.xml, findViewById() retourne null.

Pour obtenir le résultat que tu souhaites, je te conseillerais ceci :

- Ta classe Itineraire n’a aucune raison d’hériter de Accueil, l’héritage de classe sert à spécifier qu’une classe est plus spécifique qu’une autre, or Itineraire n’est pas plus spécifique qu’Accueil, c’est juste une activité différente qui se trouve devoir communiquer avec l’activité Accueil

- En démarrant tes activités de cette façon (un startActivity() dans chaque), tu risques de créer des comportements inattendus. En particulier, si quelqu’un clique alternativement sur chacun des boutons plusieurs fois d’affilée, les activités vont s’empiler dans la pile d’activités, et le bouton retour va devoir tout dépiler (je ne sais pas si j’explique clairement, essaye un peu et tu devrais voir ce que je veux dire). Ça peut être le comportement voulu, mais j’ai plutôt l’impression que ce que tu veux faire c’est que le bouton dans l’activité Accueil lance l’activité Itinéraire afin de récupérer des données (venant de l’utilisateur, par exemple), puis faire quelque chose avec une fois l’activité Itinéraire terminée.

Si c’est le cas, tu devrais plutôt utiliser startActivityForResult(), cf ici pour plus d’informations.

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok c'est gentil oui je viens de comprendre..

Dans mon idée les activity était des view alors que c'est plutot des controllers apparemment et les view seraient les layout.

Du coup en changeant juste le layout ça marche, même si j'ai un soucy une fois revenu sur la principale mon bouton ne s'active plus mais je vais me débrouiller merci beaucoup pour ces explications ! ^^

Partager ce message


Lien à poster
Partager sur d’autres sites

En général, on conseille d’avoir une activité par layout, donc dans ton cas il vaudrait mieux utiliser deux activités (sinon le bouton retour ne fonctionnera pas correctement dans le deuxième écran).

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah d'accord, alors j'ai tout faux :/ J'ai fait plusieurs layout par activité.. ça marche et vu que c'est basique ça ne prend pas trop de place dans le code mais bon j'imagine que ce n'est pas la meilleure solution en effet ^^

Partager ce message


Lien à poster
Partager sur d’autres sites





×
×
  • Créer...