Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Nouvelle instance après btn retour

Sujet résolu
    18 septembre 2017 à 16:48:27

    Bonjour,

    Je développe une application de gestion de tickets (en mode connecté) ; celle-ci est associé à une application web depuis laquelle je récupère les données via une API.

    Je dispose de 4 activités :

    1. Main : interface de connexion

    2. Tickets : liste des tickets

    3. Ticket : affichage d'un ticket

    4. AddWork : Ajouter une date/heure d'intervention pour le ticket courant

    Sur Tickets, j'ai une listview avec la liste des tickets. Lorsque je clique sur un ticket, je démarre une nouvelle activité sur Ticket et passe à la nouvelle activité 2 informations : l'ID du ticket et son nom.

    Sur la vue du ticket, j'ai un bouton pour ajouter une intervention. Lorsque l'on clique sur celui-ci je démarre une nouvelle activité de AddWork mais ne termine pas l'activité Ticket.

    public void button_show_add_work_form_handler(View target) {
        Intent intent = new Intent(getApplicationContext(), AddWorkActivity.class);
        intent.putExtra("ticket_id", current_ticket.getId());
        intent.putExtra("ticket_fullname", current_ticket.getFullName());
        startActivity(intent);
    }
    
    

    Sur ma vue AddWork, j'ai la possibilité depuis l'appbar de faire retour (ou depuis le bouton retour de mon téléphone).

    Lorsque je fais retour, ça clos correctement mon activité AddWork et je retourne sur mon Ticket ; seulement une nouvelle instance de Ticket est utilisé ce qui fait planter mon application car deux valeurs ne sont pas renseignés (l'ID et le nom du ticket que j'ai mentionné un peu plus haut).

    Dans ma classe Ticket, j'ai essayé ceci sans résultat.

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("ticket_fullname", current_ticket.getFullName());
        outState.putInt("ticket_id", current_ticket.getId());
    }
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_ticket);
    
            String ticket_fullname;
            Integer ticket_id;
    
            if(savedInstanceState != null) { // si l'on fait retour depuis l'ajout d'une intervention
                ticket_fullname = savedInstanceState.getString("ticket_fullname");
                ticket_id      = savedInstanceState.getInt("ticket_id");
            }
            else { // depuis la liste des tickets
                ticket_fullname = getIntent().getSerializableExtra("ticket_fullname").toString();
                ticket_id      = (Integer) getIntent().getSerializableExtra("ticket_id");
            }
    

    Ces deux informations sont importantes (au moins la première) :

    - l'ID pour charger le ticket (depuis l'API de l'application web)

    - le nom : pour afficher le nom du ticket sans attendre le retour de l'API

    Informations que je n'arrive pas à garder/retransmettre lorsque je fais un "retour" sur ma vue AddWork.

    N'hésitez pas s'il manque des informations, en vous remerciant par avance :)

    • Partager sur Facebook
    • Partager sur Twitter
      18 septembre 2017 à 17:46:39

      Salut,

      Peut-être que tu devrais regarder la méthode startActivityForResult qui te permet de lancer une nouvelle activité qui renvoie un résultat. Comme ça quand tu fermes ton activité AddWork, tu peux renvoyer le ticket à jour à ton activité Ticket.

      -
      Edité par rolandl 19 septembre 2017 à 9:58:42

      • Partager sur Facebook
      • Partager sur Twitter
        19 septembre 2017 à 9:57:42

        Salut,

        Effectivement, j'ai réussi avec cette méthode, merci :)

        J'ai dû surcharger la méthode sur le bouton de retour :

        • Le bouton retour du téléphone appelait correctement onActivityResult
        • Le bouton retour de l'appbar ne l'appelait pas

        Le résultat pour ceux qui auraient le même soucis.

        TicketActivity

            public void button_show_add_work_form_handler(View target) {
                Intent intent = new Intent(getApplicationContext(), AddWorkActivity.class);
                intent.putExtra("ticket_id", current_ticket.getId());
                intent.putExtra("ticket_fullname", current_ticket.getFullName());
                startActivityForResult(intent, ADD_WORK_REQUEST);
            }
        
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
        
                this.ticket_id = data.getIntExtra("ticket_id", 0);
                this.ticket_fullname = data.getStringExtra("ticket_fullname");
            }

        AddWorkActivity

            private Integer ticket_id;
            private String ticket_fullname;
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_add_work);
        
                ticket_fullname = getIntent().getStringExtra("ticket_fullname");
                ticket_id        = getIntent().getIntExtra("ticket_id", 0);
            }
        
            @Override
            public boolean onOptionsItemSelected(MenuItem item) {
                Intent i = new Intent();  // or // Intent i = getIntent()
                i.putExtra("ticket_id", this.ticket_id);
                i.putExtra("ticket_fullname", this.ticket_fullname);
                setResult(1, i);
        
                finish();
                return true;
            }
        • Partager sur Facebook
        • Partager sur Twitter

        [Android] Nouvelle instance après btn retour

        × 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