djipe Posté(e) 26 juin 2010 Share Posté(e) 26 juin 2010 (modifié) Salut les gars, Je me suis enfin lancé dans la prog. Mais depuis cet aprem, je bute sur un problème. Voilà mon CdC : J'ai constitué sous éclipse 2 layout : main et main1 main : constitué d'un texte spécifique + 1 bouton nommé button01 main1 : constitué d'un texte spécifique + 1 bouton nommé button02 fonctions souhaitées : Click sur button01 => afficher main1 Click sur button02 => afficher main Lorsque je lance la compilation sur mon émulateur, j'ai le message d'erreur : "The appli hello... has stopped unexpectely. Please try again" Voilà mon code source : package fr.free.djipe0.android.hellodjipe; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class HelloDjipe extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button button = (Button) findViewById(R.id.Button01); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click setContentView(R.layout.main1); } }); final Button button1 = (Button) findViewById(R.id.Button02); button1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click setContentView(R.layout.main1); } }); } Qu'est-ce que vous en pensez ? Par avance merci :) Modifié 26 juin 2010 par djipe Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 26 juin 2010 Share Posté(e) 26 juin 2010 Déjà tu affiches le main1 quelque soit le bouton cliqué ... de plus je suppose que l'un des boutons n'est pas dans main, donc il va avoir du mal à le trouver ;). Là, tu recherches, si je ne m'abuse les deux boutons dans le même layout ... Après, je ne suis pas un spécialiste, je te donne que mon avis après rapide visualisation de ton code. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djipe Posté(e) 26 juin 2010 Auteur Share Posté(e) 26 juin 2010 Déjà tu affiches le main1 quelque soit le bouton cliqué ... de plus je suppose que l'un des boutons n'est pas dans main, donc il va avoir du mal à le trouver ;). Là, tu recherches, si je ne m'abuse les deux boutons dans le même layout ...Après, je ne suis pas un spécialiste, je te donne que mon avis après rapide visualisation de ton code. En fait, je suis newbie en Java :( C'est ce que je me suis dit : il doit chercher dans le mauvais main le bouton. Mais je ne sais pas comment lui dire de chercher dans l'autre main. Est-ce que tu sais comment je peux lui demander de scruter le bouton depuis le bon main ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 26 juin 2010 Share Posté(e) 26 juin 2010 Je pense qu'il faut juste que tu déclare ton layout et ton premier listener dans le oncreate. Ensuite, si bouton01 cliqué alors tu l'envoie vers une autre méthode où il changera le layout et déclarera l'autre listener. Le mieux même serait de créer deux méthodes. La première avec set de main + listener bouton01, la deuxième set main1 et listener bouton02. Dans le oncreate, tu appeles la première méthode. Comme ça, il devrait switcher de l'un à l'autre. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 26 juin 2010 Share Posté(e) 26 juin 2010 c'est "mal" de faire plusieurs "setContentView" dans la vie d'une Activity Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djipe Posté(e) 26 juin 2010 Auteur Share Posté(e) 26 juin 2010 J'ai essayé tant bien que mal de déchiffrer vos recommandation (merci google :)) Du cou, voilà mon nouveau code : public class HelloDjipe extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button bouton1 = (Button) findViewById(R.id.Button01); bouton1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click setContentView(R.layout.main1); } }); setContentView(R.layout.main1); Button bouton2 = (Button) findViewById(R.id.Button02); bouton2.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click setContentView(R.layout.main); } }); } } Maintenant, ça marche presque... Le truc ne bug plus au départ. Ca, c'est la bonne nouvelle. Mais... Maintenant, lorsque l'appli s'initialise, il affiche le main1. Puis, sur click du bouton, il passe sur le main0. Mais ensuite, plus rien : il reste tjs sur le main0 :( Est-ce que vous voyez comment j'peux résoudre le truc ? Au fait, encore merci pour votre aide :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 26 juin 2010 Share Posté(e) 26 juin 2010 Comme dit plus haut, c'est pas top top de faire plusieurs setContentView dans une activity. Dis plutôt ce que tu souhaites faire et nous te dirons comment ;). Pourquoi ne pas rendre des layout invisibles et ne les afficher qu'en cas d'action (setVisibility()) ? Comme ça tu ne perds pas le lien avec les bouton --> id Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djipe Posté(e) 26 juin 2010 Auteur Share Posté(e) 26 juin 2010 Comme dit plus haut, c'est pas top top de faire plusieurs setContentView dans une activity. Dis plutôt ce que tu souhaites faire et nous te dirons comment ;). Pourquoi ne pas rendre des layout invisibles et ne les afficher qu'en cas d'action (setVisibility()) ? Comme ça tu ne perds pas le lien avec les bouton --> id En fait, je suis newbie de chez newbie en java : je ne connais que les langages visualbasic, visualpascal et l'assembleur :( Du coup, j'commence avec un grand handicap :( J'apprécie ta proposition :) Je souhaite avoir 2 écrans différents et sur chacun d'eux un bouton qui permet de basculer de l'un à l'autre. Pour différencier les 2 écrans, un texte en haut dit si on est sur l'écran 1 ou 2. Merci pour ton aide :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
akex Posté(e) 26 juin 2010 Share Posté(e) 26 juin 2010 tu peux faire un linearlayout avec deux view dedans (un bouton dans chaque view). A l'init tu rends visible la premiere view et invisible la deuxieme. Et quand cliques sur un bouton ou l'autre tu decide de la visibilité de telle ou telle view :). Je t'ai donné la fonction pour ça ... Va jeter un oeil sur l'aide de Google et les méthodes associées à l'objet view Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djipe Posté(e) 26 juin 2010 Auteur Share Posté(e) 26 juin 2010 tu peux faire un linearlayout avec deux view dedans (un bouton dans chaque view). A l'init tu rends visible la premiere view et invisible la deuxieme. Et quand cliques sur un bouton ou l'autre tu decide de la visibilité de telle ou telle view :).Je t'ai donné la fonction pour ça ... Va jeter un oeil sur l'aide de Google et les méthodes associées à l'objet view C'est ce que j'ai essayé de faire... Mais maintenant, lorsque je click sur le bouton pour changer d'écran que l'appli bug :( Voilà mon nouveau code : public class HelloDjipe extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final RelativeLayout Layout1 = (RelativeLayout)findViewById(R.layout.main); final RelativeLayout Layout2 = (RelativeLayout)findViewById(R.layout.main); setContentView(R.layout.main); Button bouton1 = (Button) findViewById(R.id.Button01); bouton1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Layout1 .setVisibility(View.GONE); Layout2.setVisibility(View.VISIBLE); } }); setContentView(R.layout.main1); Button bouton2 = (Button) findViewById(R.id.Button02); bouton2.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Layout2 .setVisibility(View.GONE); Layout1.setVisibility(View.VISIBLE); } }); } } Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cuillère Posté(e) 27 juin 2010 Share Posté(e) 27 juin 2010 Yop. C'est vrai que 2 setContentView dans la même activity c'est pas top. Alors, une solution un peu plus "propre" : Lors du click sur ton Button01, appeler une nouvelle activité via un intent. Et lors du click sur ton Button02, appeler l'activité qui contient le Button01. on aurait donc : public class HelloDjipe extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button bouton1 = (Button) findViewById(R.id.Button01); bouton1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent i = new Intent(HelloDjipe.this, Activity02.class); startActivity(i); } }); } Et la seconde activité, il ne faut pas oublier de la déclarer dans le manifest : public class Activity02 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main1); Button bouton2 = (Button) findViewById(R.id.Button02); bouton2.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent i = new Intent(Activity02.this, HelloDjipe.class); startActivity(i); } }); Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djipe Posté(e) 27 juin 2010 Auteur Share Posté(e) 27 juin 2010 (modifié) Je viens de tester ton bout de code. Y a un ch'ti bug quelque part, mais je sais pas encore où : Donc, l'appli se compile sans problème, le main 1 s'affiche normalement, mais lorsque je click sur le bouton, l'appli plante. :( J'vais poursuivre mes investigations... ;) Modifié 27 juin 2010 par djipe Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 27 juin 2010 Share Posté(e) 27 juin 2010 ou alors : 1 framelayout qui contient 2 autre layouts que tu masque de maniere alternative Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djipe Posté(e) 27 juin 2010 Auteur Share Posté(e) 27 juin 2010 Là, j'suis totalement largué :( Je pense que je vais adopter une autre approche : Je vais chercher sur le net des codes sources complet fonctionnant pour les analyser... Si vous en avez à me conseiller, je suis preneur :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 27 juin 2010 Share Posté(e) 27 juin 2010 (modifié) Comme dit plus haut, c'est pas top top de faire plusieurs setContentView dans une activity. [...] Oups c'est ce que j'ai fais intuitivement sur mon dev. :/ ça marche nickel mais c'était un merdié à gérer. M'en vais relire toute cette discution histoire de peut-être reprendre mon code un peu plus proprement. Modifié 27 juin 2010 par Burn2 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
popolbx Posté(e) 27 juin 2010 Share Posté(e) 27 juin 2010 j'ai exactement fait plus compliqué ce week end :) j'ai 6 écrans qui changent dans la même activity. Pour faire simple: un linearlayout en fill parent. Dans le linear tu y colle ton premier main : main0. Ensuite adieu les setContentView: sur le ckick tu récupère le layout: LinearLayout v = (LinearLayout) findViewById(R.id.LinearLayout02); puis tu dégage le main0: v.removeViewAt(0); tu inflate le nouveau main1: View wizard = View.inflate(arg0.getContext(), R.layout.main1, null); et tu l'ajoute au linearlayout: v.addView(wizard,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); et si ton main1 contient des boutons tu initialise les listeners juste après. testé et approuvé :D Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djipe Posté(e) 27 juin 2010 Auteur Share Posté(e) 27 juin 2010 Pour le moment, j'sais pas ce que c'est le lineralayout ni le fill parent :( En attendant plus de précisions, j'vais mener des recherches avec mon ami google ;) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 28 juin 2010 Share Posté(e) 28 juin 2010 Ca s'appelle pas des onglets, ce que vous cherchez à faire ? http://developer.android.com/intl/fr/resources/tutorials/views/hello-tabwidget.html Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 28 juin 2010 Share Posté(e) 28 juin 2010 j'ai exactement fait plus compliqué ce week end :)j'ai 6 écrans qui changent dans la même activity. Pour faire simple: un linearlayout en fill parent. Dans le linear tu y colle ton premier main : main0. Ensuite adieu les setContentView: sur le ckick tu récupère le layout: LinearLayout v = (LinearLayout) findViewById(R.id.LinearLayout02); puis tu dégage le main0: v.removeViewAt(0); tu inflate le nouveau main1: View wizard = View.inflate(arg0.getContext(), R.layout.main1, null); et tu l'ajoute au linearlayout: v.addView(wizard,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); et si ton main1 contient des boutons tu initialise les listeners juste après. testé et approuvé :D AU niveau du temps d'exécution ressource etc, ça change énormément la donne ou pas? Parce qu'en fait, j'ai 2 fenêtres dans mon cas qui défilent. (comprendre qu'en fait c'est un assistant à 7 pages, la page 1 est différente donc j'ai un layout pour elle , puis j'ai un deuxième layout. (avec des boutons next prévious etc). Pour savoir quoi charger j'ai en fait un int qui me sers de numéro de page et donc quand j'appuis sur next, si mon numéro de page == 1 je charge le layout suivant (en mappant les boutons etc). Et idem si j'appuis sur back et que mon num page passe à 0 je charge le layout précédent. C'est trop bourrin ou en fait on peut le faire comme ça? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 28 juin 2010 Share Posté(e) 28 juin 2010 Parce qu'en fait, j'ai 2 fenêtres dans mon cas qui défilent. (comprendre qu'en fait c'est un assistant à 7 pages, la page 1 est différente donc j'ai un layout pour elle , puis j'ai un deuxième layout. plusieurs activities c'est mieux dans ce cas Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 28 juin 2010 Share Posté(e) 28 juin 2010 Le ViewFlipper peut aussi être une piste à explorer : http://developer.android.com/reference/android/widget/ViewFlipper.html Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Burn2 Posté(e) 28 juin 2010 Share Posté(e) 28 juin 2010 plusieurs activities c'est mieux dans ce cas Le problème étant que dans ce cas là je me retrouvais à devoir passer plein de paramêtres en dur. :/ Concrètement c'est un assistant qui permet de créer un profile donc sur la page 1 y a le nom du profile, et 3/4 truc à activer, puis de 1 à 7 la configuration pour les 7 jours. ça aurait été le merdié à gerer pour garder tous les paramêtres en faisant un précédent et un suivant. :/ là ça marche parfaitement bien, mais est ce que c'est propre et est ce que ça se fait "dans les écoles" ou pas? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cuillère Posté(e) 28 juin 2010 Share Posté(e) 28 juin 2010 Pour le bug dans mon bout de code, ça vient peut-être du manifest. TU as déclaré la seconde activity dans le manifest ? <?xml version="1.0" encoding="utf-8"?> package="com.formula" android:versionCode="1" android:versionName="1.0"> android:label="@string/app_name"> android:label="@string/app_name"> Tu as rajouté ça dans le manifest ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 28 juin 2010 Share Posté(e) 28 juin 2010 un ptit logcat ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alocaly Posté(e) 28 juin 2010 Share Posté(e) 28 juin 2010 Si tu es un débutant, utilise la méthode de Cuillère. Ce que tu veux, c'est deux activity( deux 'pages' ), avec un bouton pour s'appeler l'une / l'autre. Tous les autres trucs sont plus hardcore, et nécessitent d'être plus soigneux ( en particulier c'est facile de faire leaker des resources ) Emmanuel / Alocaly Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.