IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Retourner à la MainActivity lors du clic sur le bouton back dans un ListFragment


Sujet :

Composants graphiques Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Retourner à la MainActivity lors du clic sur le bouton back dans un ListFragment
    Bonjour,
    Je n'ai vraiment pas tout compris aux fragments mais j'ai réussi à faire tourner à peu près mon application en suivants des exemples sur le net.
    Il s'agit de liste et d'ouvrir des fichiers. Ça fonctionne mais dernier point gênant : lorsque je clique sur le bouton "retour", mon application se ferme

    Voici mes morceaux de codes incirminés:
    déclaration du fragment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public void Load(){
            if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
                FileListFragment list = new FileListFragment();
                getFragmentManager().beginTransaction()
                        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                        .replace(android.R.id.content, list)
                        .commit();
            }
        }
    Code du fragment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    public class FileListFragment extends ListFragment {
     
        public interface FileNameListener {
            void onFinishUserDialog(String user);
        }
     
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            return inflater.inflate(R.layout.listfragment, container, false);
        }
     
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
     
            String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Imperco";
            File f = new File(path);
            File file[] = f.listFiles();
            String filenames[] = new String[file.length];
     
            for (int i=0; i < file.length; i++)
            {
                filenames[i]=file[i].getName();
            }
     
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
                    android.R.layout.simple_list_item_1, filenames);
            setListAdapter(adapter);
     
        }
     
     
        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
            FileNameListener activity = (FileNameListener) getActivity();
            String item = (String) getListAdapter().getItem(position);
            item = item.substring(0,item.indexOf("."));
            activity.onFinishUserDialog(item);
            getFragmentManager().beginTransaction()
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
                    .remove(this)
                    .commit();
        }
     
    }
    Récupération du résultat dans la MainActiviy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
        public void onFinishUserDialog(String fn) {
    //Traitement du fichier
    }
    Help !

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Elle se ferme simplement ou elle se ferme avec un "force close" ?

    Il nous faudrait plus de code de l'activité qui gère les fragments.

    Je vois par exemple que le fragment se gère lui-même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    getFragmentManager().beginTransaction()
    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
    .remove(this)
    .commit();
    Ce n'est à mon avis pas son rôle... c'est le rôle de l'activité de manager les différents fragments entre eux. Enfin grosso modo: si c'est l'activité qui met en place le fragment, c'est l'activité qui doit l'enlever... La seule exception éventuellement est pour les dialogs.


    onFinishUserDialog... ton fragment est un dialog ? dans ce cas il devrait hériter de DialogFragment (ListFragment n'amène pas grand chose de toute manière).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre actif Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Points : 245
    Points
    245
    Par défaut
    Bonjour,

    Il me semble que le comportement par default du back sur Android ferme l'activity complète (et non le dernier fragment).
    Pour ma part, j'ai un FrameLayout dans chaque layout de mes activity avec l'id "R.id.container" et je change de Fragment avec cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
        protected void showFragment(final Fragment fragment) {
            if (fragment == null)
                return;
            final FragmentManager fm = getFragmentManager();
            final FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.container, fragment).addToBackStack(null).commit();
        }
    Ce qui me donnele comportement que tu souhaite.

    GL HF

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci de votre aide.
    Je n'ai pas eu le temps de m'y remettre et ce ne sera pas avant ce weekend mais je peux déjà essayer de répondre à vos questions.
    @Nicroman
    Elle se ferme simplement ou elle se ferme avec un "force close" ?
    Je pense qu'elle se ferme simplement. Je n'ai aucun message d'erreur nulle part.

    ton fragment est un dialog ?
    Je ne connais pas trop quels sont les critères pour dire que c'est un dialog, mais je pense que oui. En fait lorsque je clique sur le menu "Ouvrir" ce fragment montre les fichiers disponibles dans un dossier spécifique sous forme de liste et lorsque je clique sur un des fichiers, son nom est affecté à une variable de la main MainActivity. Ensuite je traite le chargement de ce fichier.
    Je veux bien la traiter comme un DialogFragment mais il faut modifier pas mal de choses non?

    @Altak
    Merci Altak, je vais essayer ça dès que possible.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bon du coup j'ai galéré encore un moment avec ces fragments jusqu’à saturation et pour finir j'ai tous supprimé et casé ma liste dans un AlertDialog. C'est sans doute pas très beau, mais qu'est ce que ça fonctionne bien dans mon cas et avec mes connaissances.
    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     public void Load(){
            final ListViewCompat list = new ListViewCompat(MainActivity.this);
            final String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Imperco";
            File f = new File(path);
            File files[] = f.listFiles();
     
            if(files[0].isDirectory()) {
                Toast.makeText(getBaseContext(), "Dossier vide",Toast.LENGTH_SHORT).show();
                return;
            }
     
            String filenames[] = new String[files.length];
     
            for (int i=0; i < files.length; i++)
            {
                filenames[i]=files[i].getName();
            }
     
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, filenames);
            list.setAdapter(adapter);
     
            final AlertDialog.Builder filelist;
            filelist = new AlertDialog.Builder(MainActivity.this);
            filelist.setView(list);
            filelist.setTitle(getString(R.string.AlertMSG_OPEN));
     
            filelist.setNegativeButton(getString(R.string.AlertMSG_CANCEL), new DialogInterface.OnClickListener() {
                //Réaction au clic annuler
                public void onClick(DialogInterface dialog, int which) {
                    return;
                }
            });
            final AlertDialog thislist = filelist.create();
            thislist.show();
     
            list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View V, int position, long id) {
                    String item = (String) list.getAdapter().getItem(position);
                    filename = item.substring(0, item.indexOf("."));
                    File selectedfile = new File(path + "/" + filename + ".dat");
                    read_file(selectedfile);
                    thislist.dismiss();
                }
            });
     
            list.setOnItemLongClickListener (new AdapterView.OnItemLongClickListener() {
                @Override
                final public boolean onItemLongClick(AdapterView<?> arg0, final View arg1,final int position, long arg3) {
                    AlertDialog.Builder confirm;
                    confirm = new AlertDialog.Builder(MainActivity.this);
                    //Pré-rempli le champ avec la valeur actuelle du bouton
                    confirm.setMessage(getString(R.string.AlertMSG_ConfirmCancel));
                    confirm.setPositiveButton(getString(R.string.AlertMSG_YES), new DialogInterface.OnClickListener() {
                        //Réaction au bouton OK
                        public void onClick(DialogInterface dialog, int which) {
                            String item = (String) list.getAdapter().getItem(position);
                            File selectedfile = new File(path + "/" + item);
                            selectedfile.delete();
                            thislist.dismiss();
                        }
                    });
     
                    confirm.setNegativeButton(getString(R.string.AlertMSG_NO), new DialogInterface.OnClickListener() {
                        //Réaction au clic annuler
                        public void onClick(DialogInterface dialog, int which) {
                            //rien
                        }
                    });
                    confirm.show();
     
                    return false;
                }
            });
        }
    puis j'exploite le fichier sélectionné comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    private void read_file(File file){
            String[] data = new String[nb_button*2+3];
            Log.v ("file",file.toString());
            String line = null;
     
            try{
                BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
                //StringBuilder responseData = new StringBuilder();
                line = in.readLine();
                in.close();
     
            }catch (IOException e){
                Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
            }
     
            Log.v ("line",line);
     
            data = line.split(",");
     
            Log.v("line", data[0]);
            Log.v("line", String.valueOf(data.length));
     
            int readercursor = 0;
            title.setText(data[readercursor]);
            readercursor ++;
            BackgroundName = data[readercursor];
            readercursor ++;
     
            for (int i=0; i < phylayout.getChildCount(); i++){
                View child = phylayout.getChildAt(i);
                if (child instanceof ToggleButton){
                    ((ToggleButton) child).setText(data[readercursor]);
                    ((ToggleButton) child).setTextOn(data[readercursor]);
                    ((ToggleButton) child).setTextOff(data[readercursor]);
                    readercursor ++;
                }
            }
     
            for (int i=0; i < psylayout.getChildCount(); i++){
                View child = psylayout.getChildAt(i);
                if (child instanceof ToggleButton){
                    ((ToggleButton) child).setText(data[readercursor]);
                    ((ToggleButton) child).setTextOn(data[readercursor]);
                    ((ToggleButton) child).setTextOff(data[readercursor]);
                    readercursor ++;
                }
            }
     
            ImageView imageView = (ImageView) findViewById(R.id.background_image);
            imageView.setImageBitmap(BitmapFactory.decodeFile(BackgroundName));
            edit_mode=true;
            EditMode();
            Toast.makeText(this, filename + getString(R.string.AlertMSG_Loaded), Toast.LENGTH_SHORT).show();
        }
    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SP-2010] Infopath 2010 : ouvrir une url lors du clic sur un bouton
    Par kcizth dans le forum SharePoint
    Réponses: 1
    Dernier message: 27/06/2013, 13h20
  2. Réponses: 2
    Dernier message: 14/01/2012, 12h33
  3. [RichFaces] Problème lors du clic sur un bouton
    Par chahrazedd dans le forum JSF
    Réponses: 11
    Dernier message: 18/08/2011, 16h50
  4. Interruption d'une tache (SwingWorker) lors du clic sur un bouton
    Par Crowell dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 07/05/2007, 14h55
  5. JSP : Récupérer valeur lors du clic sur un bouton
    Par ze veritable farf dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 11/04/2006, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo