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

Android Discussion :

Garder ouverte une fenêtre de dialogue


Sujet :

Android

  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Garder ouverte une fenêtre de dialogue
    Bonjour à toutes et à tous,

    Dans mon application, le code suivant me sert à entrer une valeur de configuration. Si, suite à un test, le résultat ne me convient pas, je souhaite que la fenêtre de dialogue reste ouverte afin de modifier la valeur qui ne me convenait pas.

    Problème : Quelque soit le bouton utilisé, "Valider", "Rien", "Annuler", la fenêtre de dialogue se ferme. J'ai essayé de mettre en ligne 24 un "dlg.show();", mais ça ne fait rien du tout.

    Question : est-il possible de garder la fenêtre ouverte et si oui, comment fait-on ?

    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
    	static AlertDialog dlg;
    	public static void showSystem() {
    		final AlertDialog.Builder infoSys = new AlertDialog.Builder(context);
    		infoSys.setTitle("Réglages système");
    		LinearLayout fntrPrinc = new LinearLayout(context);
    		fntrPrinc.setOrientation(1);
    		LinearLayout fntrSec03 = new LinearLayout(context);
    		fntrSec03.setOrientation(0);
    		TextView prm3 = new TextView(context);
    		prm3.setText(" Durée à éclairage max");
    		final EditText edPrm3 = new EditText(context);
    		edPrm3.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_SIGNED );
    		edPrm3.setText(String.valueOf(INIT.prefsGPS.tMaxLumAff));
    		edPrm3.setHint("minutes");
    		fntrSec03.addView(prm3);
    		fntrSec03.addView(edPrm3);
    		fntrPrinc.addView(fntrSec03);
    		infoSys.setView(fntrPrinc);
    		infoSys.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
    			public void onClick(DialogInterface dialog, int which) {
    				if ("Ça me convient, on ferme le Dialogue")
    					// Faire ce qu'il faut , puis le dialogue va se fermer
    				else
    					// Je voudrais que le dialogue reste ouvert pour modifier ce qui n'allait pas
    			}
    		});
    		infoSys.setNeutralButton("Rien", new DialogInterface.OnClickListener() {
    			public void onClick(DialogInterface dialog, int which) {
    			}
    		});
    		infoSys.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
    			public void onClick(DialogInterface dialog, int which) {
    			}
    		});
    		dlg = infoSys.create();
    		dlg.show();
    	}
    Merci de votre aide.

    Pierre

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut
    Il faut passer par un popup personnalisé
    Recherche sur Google des exemples.

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par anto2b Voir le message
    Il faut passer par un popup personnalisé
    Recherche sur Google des exemples.
    J'ai regardé, vu pas mal de popups personnalisés : c'est surtout au niveau du look. Je n'en ai pas trouvé (ou je n'ai pas compris) qui gèrent ce problème.

    Cordialement.

    Pierre

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut
    Pour personnaliser ton popup tu peux faire un "inflater" sur le layout de ton choix

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Je ne cherche pas à personnaliser ma boîte de dialogue, je cherche simplement à faire que si une condition que j'ai choisie n'est pas remplie, la boîte ne se ferme pas. Je ne vois pas en quoi un LayoutInflater va m'aider en cela ... ou alors, je n'ai vraiment rien compris. Un petit exemple.

    Merci de votre aide.

    Pierre

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    J'ai déjà rencontré ce problème, et il y a plusieurs solutions :
    • Tu peux garder ton AlertDialog en tant que variable globale, et ainsi, si ton test échoue, tu peux réafficher l'AlertDialog
    • Deuxième manière, beaucoup plus sale (et pas sûr qu'elle fonctionne tout le temps) : tu peux ajouter un listener sur les boutons générés par le AlertDialog.Builder. En effet, ils possèdent leur id unique. Si mes souvenirs sont bons, il s'agit de android.R.id.button1, button2 et button3.

  7. #7
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Simon MARQUIS Voir le message
    ...
    • Tu peux garder ton AlertDialog en tant que variable globale, et ainsi, si ton test échoue, tu peux réafficher l'AlertDialog
    Est-ce que mettre mon AlertDialog en variable globale consiste à modifier ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	static AlertDialog dlg;
    	public static void showSystem() {
    		final AlertDialog.Builder infoSys = new AlertDialog.Builder(context);
    en cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	static AlertDialog dlg;
    	static AlertDialog.Builder infoSys;
    	public static void showSystem() {
    		infoSys = new AlertDialog.Builder(context);
    Dans les deux cas, le comportement est le même. Par exemple, si mon test échoue, et que je place l'instruction "showSystem();" à cet endroit (ligne 24 de mon premier code), cela relance ma boîte de dialogue ... mais avec les paramètres d'entrée (valeur de la ligne 13) et non pas en conservant la valeur qui faisait fauter mon test.. Je peux effectivement relancer ma boîte de dialogue avec les valeurs frappées, mais alors, il faut que je rajoute du code tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    si ouverture normale de la boîte 
    	alors utiliser le paramètres d'entrée
    sinon
    	utiliser les derniers paramètres frappés au clavier
    Citation Envoyé par Simon MARQUIS Voir le message
    ...
    • Deuxième manière, beaucoup plus sale (et pas sûr qu'elle fonctionne tout le temps) : tu peux ajouter un listener sur les boutons générés par le AlertDialog.Builder. En effet, ils possèdent leur id unique. Si mes souvenirs sont bons, il s'agit de android.R.id.button1, button2 et button3.
    Un petit exemple de code de cette deuxième manière de faire.

    NOTA : c'est quand même du bricolage tout cela. Je suis étonné qu'en Java ce mode de fonctionnement ne soit pas prévu. Je me réfère à un langage que je connais et où c'est possible : Delphi ou Lazarus basés sur le Pascal Objet (on met ModalResult à 0 et la boîte reste ouverte)

    Merci de votre aide.

    Pierre

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Ce n'est pas tout à fait ça.
    Voici un exemple simplifié de ta situation et d'une solution possible (je ne l'ai pas testé)

    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
    AlertDialog dlg;
     
    public function showSystem(){
    		dlg = new AlertDialog.Builder(this)
    		.setTitle("...")
    		/*...initialisation de tout le reste */
    		.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
    			public void onClick(DialogInterface dialog, int which) {
    				if ("Ça me convient, on ferme le Dialogue")
     
    				else {
    					if(dlg != null)
    						dlg.show();
    				}
    			}
    		})
    		.create();
    		dlg.show();
    }
    Normalement, la dialog va se réafficher sans réinitialiser les valeurs entrées par l'utilisateur.

    Pour la deuxième solution je t'invite à regarder par là et tu remarqueras l'existence de ces 3 ids qui correspondent aux boutons "positive" "negative" et "neutral" des AlertDialog.
    Ainsi, tu dois pouvoir ajouter des listener dessus en faisant quelque chose 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
    AlertDialog dlg;
    public function showSystem(){
    		dlg = new AlertDialog.Builder(this)
    		.setTitle("...")
    		/*...initialisation de tout le reste */
    		.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
    			public void onClick(DialogInterface dialog, int which) {
    				if ("Ça me convient, on ferme le Dialogue")
     
    				else {
    					if(dlg != null)
    						dlg.show();
    				}
    			}
    		})
    		.create();
    		dlg.getView().findViewById(android.R.id.button1).SetOnClickListener(/*... Ici, instancier un listener qui permettra de ne pas fermer l'AlertDialog automatiquement*/);
    		dlg.show();
    }

    En réponse à ton "NOTA" : Oui, c'est un peu du bricolage et c'est voulu. Ce Builder a été mis en place pour aider les développeurs à réaliser des pop-up génériques. De plus, les pop-up sont sensées être utilisées le moins souvent possible (comme expliqué dans les GuideLines Android). Envisage peut être de transformer ce popup en Activity.

  9. #9
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Oui c'est aussi ce que je voulais faire remarquer...

    La notion de "Dialog" est un truc vraiment old-school windows... d'ailleurs cela fait un moment que je n'ai pas vu d'application avec fenêtres modales...

    Un choix de préferences par exemple, est une activité comme une autre, et les principes d'Android sont clairs là dessus, le dialog doit être reservé à la confirmation d'une action: http://developer.android.com/design/...owledging.html


    Par exemple, pour un Login on a une activité à part entière...
    Code pseudo-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
     
    LoginActivity.onOk() {
       startProgress(); // là c'est un dialog modal pour le coup !
       new LoginCheckTask().execute(); // va vérifier le login en arrière plan puis appeler onLoginOk / onLoginFailed
    }
     
    LoginActivity.onLoginOk() {
       endProgress();
       setResult(OK);
       finish();
    }
     
    LoginActivity.onLoginFailed(int reason) {
        endProgress();
        Toast.makeToast(reason,...).show();
    }

  10. #10
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Simon MARQUIS,

    j'ai appliqué ce que tu m'as dit, mais je me retrouve avec une exception où on me dit que je dois d'abord faire un removeView sur les parents des enfants.

    Dans mon cas, infoSys ne présente pas de méthode remove View, pas plus que de getParent ...

    Comment corriger ce problème.

    Merci de votre aide.

    Pierre

    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
    	static AlertDialog dlg;
    	public static void showSystem() {
    		final AlertDialog.Builder infoSys = new AlertDialog.Builder(context);
    		infoSys.setTitle("Réglages système");
    		final LinearLayout fntrPrinc = new LinearLayout(context);
    		fntrPrinc.setOrientation(1);
    		LinearLayout fntrSec03 = new LinearLayout(context);
    		fntrSec03.setOrientation(0);
    		TextView prm3 = new TextView(context);
    		prm3.setText(" Durée à éclairage max");
    		final EditText edPrm3 = new EditText(context);
    		edPrm3.setInputType(InputType.TYPE_CLASS_NUMBER);
    		edPrm3.setText(String.valueOf(INIT.prefsGPS.tMaxLumAff/60000));
    		edPrm3.setHint("minutes");
    		fntrSec03.addView(prm3);
    		fntrSec03.addView(edPrm3);
     
    /*		if (nouvRep)
    			fntrPrinc.addView(fntrSec00);
    		fntrPrinc.addView(fntrSec01);
    		fntrPrinc.addView(fntrSec02);*/
    		fntrPrinc.addView(fntrSec03);
     
    		infoSys.setView(fntrPrinc);
    		fntrPrinc.setGravity(Gravity.CENTER_HORIZONTAL);
    		infoSys.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
    			@Override
    			public void onClick(DialogInterface dialog, int which) {
    				String str = edPrm3.getText().toString();
    				long valT = 0;
    				if (str.equals("") || str.equals("0")) {
    					if(infoSys != null) {
    						infoSys.show();
    					}
    //					showSystem();
    					Toast.makeText(FCH.context, "Valeur incorrecte, reprendre",Toast.LENGTH_SHORT).show();
    //					valT = 600000;
    				}
    				else
    					valT = Integer.parseInt(edPrm3.getText().toString())*60000;
    				INIT.prefsGPS.tMaxLumAff = valT;
    			}
    		});
    		infoSys.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
    			public void onClick(DialogInterface dialog, int which) {
    			}
    		});
    		dlg = infoSys.create();
    		dlg.show();
    	}



    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
    04-09 09:04:55.210: D/AndroidRuntime(7615): Shutting down VM
    04-09 09:04:55.210: W/dalvikvm(7615): threadid=1: thread exiting with uncaught exception (group=0x40c581f8)
    04-09 09:04:55.225: E/AndroidRuntime(7615): FATAL EXCEPTION: main
    04-09 09:04:55.225: E/AndroidRuntime(7615): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.view.ViewGroup.addViewInner(ViewGroup.java:3342)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.view.ViewGroup.addView(ViewGroup.java:3213)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.view.ViewGroup.addView(ViewGroup.java:3193)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at com.android.internal.app.AlertController.setupView(AlertController.java:402)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at com.android.internal.app.AlertController.installContent(AlertController.java:242)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.app.AlertDialog.onCreate(AlertDialog.java:336)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.app.Dialog.dispatchOnCreate(Dialog.java:353)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.app.Dialog.show(Dialog.java:257)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at com.example.Prefs.PRM$6.onClick(PRM.java:167)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.os.Looper.loop(Looper.java:137)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at android.app.ActivityThread.main(ActivityThread.java:4511)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at java.lang.reflect.Method.invokeNative(Native Method)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at java.lang.reflect.Method.invoke(Method.java:511)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
    04-09 09:04:55.225: E/AndroidRuntime(7615): 	at dalvik.system.NativeStart.main(Native Method)

Discussions similaires

  1. agrandir une fenêtre de dialogue
    Par maraval dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 20/05/2010, 23h13
  2. Réponses: 4
    Dernier message: 04/04/2007, 10h37
  3. Réponses: 13
    Dernier message: 27/10/2006, 17h24
  4. TreeView dans une fenêtre de dialogue
    Par Bilouzzz dans le forum MFC
    Réponses: 3
    Dernier message: 16/09/2005, 15h55

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