Aller au contenu

2 boutons sur 2 layout qui font planter l'appli


djipe

Recommended Posts

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é par djipe
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 :)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 :)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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);                
           }
       });     

    }

}

Lien vers le commentaire
Partager sur d’autres sites

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);

           }       
        });

Lien vers le commentaire
Partager sur d’autres sites

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é par djipe
Lien vers le commentaire
Partager sur d’autres sites

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 :)

Lien vers le commentaire
Partager sur d’autres sites

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é par Burn2
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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?

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...