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 :

Problème d'initialisation d'une application


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 Problème d'initialisation d'une application
    Bonsoir à toutes et à tous,

    Dans une application, je souhaite récupérer la largeur d'un LinearLayout. Je procède comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MainActivity extends Activity implements SensorEventListener{
     
    	LinearLayout affCarte;
    	int AffX, AffY; // dimension en pixels de la fenêtre d'affichage de la carte
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		affCarte = (LinearLayout)findViewById(R.id.AffCarte);
    		AffX = affCarte.getWidth();
            }
    AffX me retourne systématiquement 0.

    Si je place l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		AffX = affCarte.getWidth();
    dans un appel d'évènement, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	@Override
    	public final void onSensorChanged(SensorEvent event) {
    		AffX = affCarte.getWidth();
    	}
    cette fois, AffX me retourne bien la largeur du Layout.

    J'ai essayé de placer cette instruction dans un onStart, dans un onResume : ça retourne toujours 0.

    Apparemment, tant qu'on est est dans la phase d'initialisation, on n'arrive pas à récupérer cette valeur. Comment faire car j'ai besoin de connaître cette valeur pour d'autres initialisations (cadrage d'image).

    Merci de votre aide.

    Pierre

  2. #2
    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
    Le plus simple est d'utiliser un OnLayoutChangeListener

    Si le SDK utilisé est <11, alors il faut hériter de la view et surcharger la fonction onLayout()

    Si ce n'est pas indiscret, quel est le but ultime ? (comment la taille va-t-elle être utilisée par la suite) parce que "recadrage d'image" ne me dit pas grand chose à vrai dire

  3. #3
    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
    Une autre approche :
    En fait, le on create ne fait que créer les objets (le temps où onCreate est en cours d’exécution, l'interface finale n'est pas visible par l'utilisateur).
    Leurs dimensions ne sont donc encore pas récupérables.
    Cependant, tu peux le faire dans la méthode onStart ou onResume ou attacher un écouter sur la view affCarte (expliqué par nicroman)

  4. #4
    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
    ... Cependant, tu peux le faire dans la méthode onStart ou onResume ...
    La récupération des dimensions du Layout dans l'une ou l'autre de ces deux méthodes n'a aucun effet .

    Cordialement.

    Pierre

  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
    Suppression pour doublon (message parti tout seul, je ne sais pas pourquoi) : voir message suivant

  6. #6
    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 nicroman Voir le message
    ... Si ce n'est pas indiscret, quel est le but ultime ? (comment la taille va-t-elle être utilisée par la suite) parce que "recadrage d'image" ne me dit pas grand chose à vrai dire
    Ce n'est pas indiscret. Je souhaite réaliser une application de navigation par GPS sur fond de cartes scannées en étant indépendant de tout autre logiciel de géo-référencement et autres quels qu'ils soient. Les cartes sont composées de dalles (2000 x 2000 pixels²) que je remplace par morceaux au fur et à mesure que je me déplace géographiquement. Le cadrage ? comment faire si je ne connais pas les dimensions de la fenêtre dans laquelle je veux centrer mes images ?

    Citation Envoyé par nicroman Voir le message
    Le plus simple est d'utiliser un OnLayoutChangeListener

    Si le SDK utilisé est <11, alors il faut hériter de la view et surcharger la fonction onLayout() ...
    Cette méthode nécessite de connaître les dimensions du Layout or ... c'est ce que je veux connaître !

    J'avoue que j'ai du mal à rentrer dans cet environnement.

    Cordialement.

    Pierre

  7. #7
    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
    Citation Envoyé par ChPr Voir le message
    Ce n'est pas indiscret. Je souhaite réaliser une application de navigation par GPS sur fond de cartes scannées en étant indépendant de tout autre logiciel de géo-référencement et autres quels qu'ils soient. Les cartes sont composées de dalles (2000 x 2000 pixels²) que je remplace par morceaux au fur et à mesure que je me déplace géographiquement. Le cadrage ? comment faire si je ne connais pas les dimensions de la fenêtre dans laquelle je veux centrer mes images ?
    Haaa oui c'est vrai...

    Je me demande si tu ne fais pas le truc à l'envers (mais ce n'est pas le sujet du message)...
    En gros... tu as une surface que tu dois remplir avec des pixels... le plus simple est donc d'hériter de view, et surcharger onDraw.. Quand le onDraw est appelé on a les width/height de la view.
    Là... ou les données sont présentes, et on dessine la bitmap.... ou les données ne sont pas présentes, dans ce cas on les demande (asynctask, thread, ou autre) et on dessine une bitmap temporaire... quand les données arrivent on demande un refresh de la view.
    Donc à aucun moment tu n'as besoin de connaitre "à l'avance" la taille de la view... Tout est fait "à la demande" dans le onDraw.


    Cette méthode nécessite de connaître les dimensions du Layout or ... c'est ce que je veux connaître !

    J'avoue que j'ai du mal à rentrer dans cet environnement.
    Je ne comprends pas... c'est un listener, attaché à la view (addOnLayoutxxxxx) qui est appelé à chaque fois que la view change de taille/position dans son layout (ce qui est le cas après le onMeasure()).

  8. #8
    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 nicroman Voir le message
    ...En gros... tu as une surface que tu dois remplir avec des pixels... le plus simple est donc d'hériter de view, et surcharger onDraw.. Quand le onDraw est appelé on a les width/height de la view. ...
    C'est ce que je fais, j'ai surchargé cette méthode et j'y fais mes différents dessins sur ma carte et, finalement, c'est là que j'ai récupéré les dimensions du Layout pour faire mes différents décalages et mises à l'échelle dans d'autres listeners. Je n'ai donc plus besoin du OnLayoutChangeListener.
    Citation Envoyé par nicroman Voir le message
    ... Je ne comprends pas... c'est un listener, attaché à la view (addOnLayoutxxxxx) qui est appelé à chaque fois que la view change de taille/position dans son layout (ce qui est le cas après le onMeasure()).
    Pour autant, moi non plus, je ne comprends pas, ce listener demande des valeurs de dimensions en paramètres alors que je n'en ai pas à lui fournir !

    Cordialement.

    Pierre

  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
    Non il les reçoit, il ne les demande pas... c'est le principe de tous les listeners (onClick/onLongClick/etc...) :
    Code java : 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
     
    class MonActivity extends Activity implements View.OnLayoutChangeListener
    {
     
        public void onCreate(...)
        {
            ...
     
            View v = findViewById(R.id.image);
            v.addOnLayoutChangeListener(this);
        }
     
     
        public void onLayoutChange (View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom)
        {
            // quant on passe ici, la view "R.id.image" qui est d'ailleurs dans "v" vient d'être déplacée/redimensionnée, on a même les anciennes tailles/positions.
        }
    }

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

Discussions similaires

  1. Problème au lancement d'une application
    Par Benjam dans le forum OpenGL
    Réponses: 11
    Dernier message: 20/09/2006, 12h04
  2. Réponses: 3
    Dernier message: 28/06/2006, 17h19
  3. [C#] problème de fermeture d'une application
    Par padodanle51 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/05/2006, 14h07
  4. Problème d'accès depuis une application
    Par Cédric_07 dans le forum Access
    Réponses: 5
    Dernier message: 24/05/2006, 10h21
  5. [MySQL] Problème de tri pour une application
    Par nanor21 dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 11/05/2006, 19h08

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