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 :

Modifier des éléments d'un layout depuis une autre classe


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut Modifier des éléments d'un layout depuis une autre classe
    Bonjour tout le monde,

    Je suis étudiant et débutant en java et android.

    Je suis en train de modifier une application android qui permet de configurer des beacons bluetooth. Avec l’application d’origine on peut seulement paramétrer les beacons un par un, de ce fait je souhaite modifier l'application pour pouvoir en configurer un bon nombre automatiquement.

    J'ai un problème lorsque je souhaite modifier un élément dans le layout d'une classe depuis un autre classe.

    Depuis la classe Main j’arrive bien à interagir avec les éléments du layout Main. Mais depuis la classe Main, je n’arrive pas à interagir avec d’autre layout (PasswordDialog dans mon cas). Cela fait plusieurs jours que je galère dessus, j’ai essayé des réponses à des post similaires mais sans succès car la configuration de mes classes est assez spéciale et je ne veux pas trop les modifier pour ne pas altérer le fonctionnement de l'application. Si quelqu'un a des pistes je lui en serais très reconnaissant

    La classe main :

    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
     
    public class Main extends BaseActivity implements RadioGroup.OnCheckedChangeListener, MokoScanDeviceCallback, AdapterView.OnItemClickListener {
     
    	@Override
    		protected void onCreate(Bundle savedInstanceState) {
    			super.onCreate(savedInstanceState);
    			setContentView(R.layout.main);
     
    	// ...
     
    	}
     
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
     
                // ...
                final PasswordDialog dialog = new PasswordDialog(this); // Une autre fonction qui fait déjà appel à la classe PasswordDialog qui m'intérésse
                dialog.setSavedPassword(mSavedPassword);
                dialog.setOnPasswordClicked(new PasswordDialog.PasswordClickListener() {
                // ...
    			}
     
    	}	
     
        @OnClick({R.id.iv_about, R.id.iv_refresh, R.id.bt_auto})
        public void onClick(View view) {
            switch (view.getId()) {
                // ...
                case R.id.bt_auto: // Quand je clique sur le bouton bt_auto, le code ci-dessous s'éxécute
                    final PasswordDialog dialog = new PasswordDialog(this); 
                    dialog.AutoSetPassword("Moko4321"); // la méthode que j'essaye de lancer
    			// ...
    		}
    	}
    	// ...
    }
    Voici maintenant la classe PasswordDialog qui est dans un autre package. Je souhaite modifier un élément du layout passworddialog depuis ma classe Main :

    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
     
    public class PasswordDialog extends BaseDialog  {
        @Bind(R.id.et_password) 
        EditText etPassword; // L'élement que je souhaite modifier
     
        public PasswordDialog(Context context) {
            super(context);
        }
     
        // ...
     
        public void AutoSetPassword(String pass) { // Ma méthode pour modifier le EditText
            etPassword.setText(pass); // Ceci ne fonctionne pas
            // et
            ((EditText) findViewById(R.id.et_password)).setText(pass); // Si j'essaye ceci à la place, c'est pareil
        }
    }
    Merci beaucoup

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Seule ta classe PasswordDialog à une instance de la vue qu'il utilise , ta classe Main ne peut pas interagir dessus directement.

    Tu peux donc :
    - Ajouter une méthode à la classe PasswordDialog qui modifie le layout comme tu l'entends et l'appeler depuis Main quand tu veux
    ou
    - Ajouter une méthode à la classe PasswordDialog qui retourne la vue utilisée à Main pour qu'elle puisse faire les modifs.

    Je recommande plutôt la première solution.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut
    Citation Envoyé par grunk Voir le message
    Seule ta classe PasswordDialog à une instance de la vue qu'il utilise , ta classe Main ne peut pas interagir dessus directement.

    Tu peux donc :
    - Ajouter une méthode à la classe PasswordDialog qui modifie le layout comme tu l'entends et l'appeler depuis Main quand tu veux
    ou
    - Ajouter une méthode à la classe PasswordDialog qui retourne la vue utilisée à Main pour qu'elle puisse faire les modifs.

    Je recommande plutôt la première solution.
    Bonjour Grunk, merci tout d'abord d'avoir pris le temps de m'aider

    A vrai dire, j'ai déjà essayé les 2 solutions que tu proposes.

    La première solution est visible dans le 2ème bout de code de mon message d'origine avec la méthode "AutoSetPassword(String pass)".
    Cependant cette méthode n'arrive pas à récupérer l'élément demandé dans le layout. La méthode me renvoie "null" quand je la log.

    Je me demande si le problème vient pas du fait que la classe "PasswordDialog" est déjà instanciée depuis la classe "Main" en mode "final" (Visible dans la méthode "onItemClick" du premier bout de code).

    Mais lorsque j'essaye d'enlever le final en passant de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final PasswordDialog dialog = new PasswordDialog(this);
    à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PasswordDialog dialog = new PasswordDialog(this);
    j'ai l'erreur suivante : "Variable 'dialog' is accessed from within inner class, needs to be declared in final"

    Qu'en penses-tu ? Merci bien

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Ta classe BaseDialog doit surement avoir un moyen de récupérer la view (pour pouvoir faire un findviewbyid dessus). Si ce n'est pas le cas , il faut probablement la créer ou alors exposer le champs que tu veux modifier directement dans baseDialog pour qu'il soit accessible par ses enfants
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut
    Citation Envoyé par grunk Voir le message
    Ta classe BaseDialog doit surement avoir un moyen de récupérer la view (pour pouvoir faire un findviewbyid dessus). Si ce n'est pas le cas , il faut probablement la créer ou alors exposer le champs que tu veux modifier directement dans baseDialog pour qu'il soit accessible par ses enfants
    Merci Grunk, donc c'est pas un rapport avec le "final" ?

    Je vois pas trop où pourrait être le problème dans la classe BaseDialog. Pourrais-tu m'indiquer quelle modification je dois faire dessus ?

    Voici la classe Base Dialog (elle est extends de "Dialog" qui est une classe par défaut de "android.app") :

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    package com.moko.beacon.dialog;
     
    import android.annotation.SuppressLint;
    import android.app.Dialog;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.view.animation.Animation;
     
    import com.moko.beacon.R;
     
    import butterknife.ButterKnife;
     
    /**
     * @Date 2017/12/11 0011
     * @Author wenzheng.liu
     * @Description
     * @ClassPath com.moko.beacon.dialog.BaseDialog
     */
    public abstract class BaseDialog<T> extends Dialog {
        protected T t;
        private boolean dismissEnable;
        private Animation animation;
     
        protected BaseDialog(Context context) {
            super(context, R.style.BaseDialogTheme);
        }
     
        public BaseDialog(Context context, int themeResId) {
            super(context, themeResId);
        }
     
     
        @SuppressLint("InflateParams")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            View convertView = LayoutInflater.from(getContext()).inflate(getLayoutResId(), null);
            //final View convertView = LayoutInflater.from(getContext()).inflate(getLayoutResId(), null);
            ButterKnife.bind(this, convertView);
            renderConvertView(convertView, t);
            if (animation != null) {
                convertView.setAnimation(animation);
            }
            if (dismissEnable) {
                convertView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dismiss();
                    }
                });
            }
            setContentView(convertView);
        }
     
        protected abstract int getLayoutResId();
     
        //protected abstract void renderConvertView(final View convertView, final T t);
     
        protected abstract void renderConvertView(View convertView, T t);
     
     
        @Override
        public void show() {
            super.show();
            //set the dialog fullscreen
            //final Window window = getWindow();
            Window window = getWindow();
            assert window != null;
            //final WindowManager.LayoutParams layoutParams = window.getAttributes();
            WindowManager.LayoutParams layoutParams = window.getAttributes();
            layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
            // Réglez la hauteur de la fenêtre sur le contenu du package
            layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
            window.setAttributes(layoutParams);
        }
     
        public void setData(T t) {
            this.t = t;
        }
     
        protected void setAnimation(Animation animation) {
            this.animation = animation;
        }
     
        protected void setDismissEnable(boolean dismissEnable) {
            this.dismissEnable = dismissEnable;
        }
    }

    Merci bien

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Une variable final veux juste dire qu"'on ne peut pas changer sa référence donc absolument rien à voir avec ton problème.

    Vu les méthodes abstraites de ta classe BaseDialog , les classes filles semble déjà avoir une référence vers la vue , il suffit de l'utiliser pour trouver l'élément que tu veux.

    Sinon dans ton main tu dois pouvoir simplement aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dialog.findviewById(R.id.champsdesiré)
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Modifier la valeur d'un JtextArea depuis une autre classe
    Par marc.mezi dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 04/05/2015, 11h02
  2. Cacher un élément dans le layout depuis une page
    Par hadakamatcho dans le forum Tapestry
    Réponses: 2
    Dernier message: 23/08/2012, 11h13
  3. Rajouter des éléments dans une collection depuis une autre classe
    Par Sup3rc0c0 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 15/03/2012, 17h48
  4. Réponses: 1
    Dernier message: 05/10/2009, 03h50
  5. remplissage des éléments d'un html depuis un autre et print 'à distance'
    Par j.p.mignot dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/09/2008, 13h46

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