Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Proprement appeler un objet View ?

De OnCreate() à une autre méthode.

    23 septembre 2018 à 21:50:22

    Bonjour, 

    Je suis le cours "Développez votre première application Android". Je suis au cours 4 de la partie 2 : "Implémenter la logique du jeu dans le contrôleur".

    Il s'agit d'un jeu de quizz où une question est posée dans un TextView, et 4 réponses dans des Button sont proposées. Lorsque que l'on clique sur la bonne réponse, on affiche un Toast "Correct". La logique est créée avec un index de 0 à 3, dont le bon index est stocké avec la question en amont. 

    J'ai souhaité aller plus loin :

    1) Lorsque la réponse est correcte, le background de mon Button devient vert.

    2) Lorsque la réponse est incorrecte, le background de mon Button devient rouge et celui de la bonne réponse devient vert.

    Le problème vient du point 2) parce que sur ma méthode OnClick, je travaille sur ma View (à savoir le Button) de la réponse incorrecte. Donc là pas de soucis. Par contre je n'ai plus accès au Button de la réponse correcte puisque celui-ci est initialisé dans ma méthode OnCreate().

    J'ai "contourné" le problème en allant chercher le parent du ma réponse incorrecte sous forme de ViewGroup et en allant cherchant la View Button correspondant à la réponse correcte. Mais je trouve ça vraiment moche...

    Connaissez-vous une façon plus jolie ? 

    Mes initialisations de variable et la méthode OnCreate() de ma classe.

        private TextView mQuestion;
        private Button mAnswer1;
        private Button mAnswer2;
        private Button mAnswer3;
        private Button mAnswer4;
    
        private View mCorrectView;
        private ViewGroup mAllViews;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_game);
    
            mQuestion = (TextView) findViewById(R.id.activity_game_question_text);
            mAnswer1 = (Button) findViewById(R.id.activity_game_answer1_btn);
            mAnswer2 = (Button) findViewById(R.id.activity_game_answer2_btn);
            mAnswer3 = (Button) findViewById(R.id.activity_game_answer3_btn);
            mAnswer4 = (Button) findViewById(R.id.activity_game_answer4_btn);
    
            // Use the tag property to 'name' the buttons
            mAnswer1.setTag(0);
            mAnswer2.setTag(1);
            mAnswer3.setTag(2);
            mAnswer4.setTag(3);
            mQuestion.setTag(4);
    
    
            // Use the same listener for the four buttons.
    // The tag value will be used to distinguish the button triggered
            mAnswer1.setOnClickListener(this);
            mAnswer2.setOnClickListener(this);
            mAnswer3.setOnClickListener(this);
            mAnswer4.setOnClickListener(this);
    
           
    
        }

    Ma méthode OnClick() sachant que le Listener est directement implémenté dans ma classe.

    @Override
        public void onClick(View v) {
            int responseIndex = (int) v.getTag();
            if(responseIndex == mCurrentQuestion.getAnswerIndex()){
                // Answer is correct
                Toast.makeText(this, "Correct!", Toast.LENGTH_SHORT).show();
    
                v.setBackgroundColor(0xFF008000); // Green color
    
            }
            else{
                //Answer is wrong
                Toast.makeText(this, "Wrong Answer!", Toast.LENGTH_SHORT).show();
               v.setBackgroundColor(0xFFFF0000); // Red Color
              
    
                mAllViews = (ViewGroup) v.getParent(); // Search for all views
               mCorrectView = mAllViews.getChildAt(mCurrentQuestion.getAnswerIndex()+1); // Get the view of correct answer
               mCorrectView.setBackgroundColor(0xFF008000);
    
            }
        }


    Je précise que le code actuel fonctionne, c'est juste que les 3 dernières lignes de ma méthode OnClick() me gênent beaucoup !

    Merci pour votre aide =D

    • Partager sur Facebook
    • Partager sur Twitter
      27 septembre 2018 à 17:29:01

      Salut, 

      Tu as 4 boutons, donc, tu peux faire (une solution parmi d’autres)

      créer une Méthode qui prend un index et qui te retourne le bouton correspondant. 

      Pour limplementation ça se fait en deux lignes, tu met tes 4 boutons dans un array et tu retournes le Bouton au bon index. Pour faire ça proprement tu peux rajouter une condition pour éviter les crash en cas d’index > 3

      Ensuite dans ton listener, tu commences par récupérer ce bouton puis tu le compares à la view. 

      Soit cest egal dans ce cas t’appliques ton vert sur la vue. Soit c’est différent et tu appliques le vert que le bouton récupéré et le rouge sur la vue. 

      PS : ce n’est pas parce que tu l’as initialisé dans le onCreate que tu n’y a pas accès. 

      • Partager sur Facebook
      • Partager sur Twitter
        28 septembre 2018 à 8:59:56

        Oh merci ! Je vais essayer.

        -
        Edité par PimpreneIIe 18 octobre 2018 à 16:33:08

        • Partager sur Facebook
        • Partager sur Twitter

        [Android] Proprement appeler un objet View ?

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown