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 :

findViewById ne marche pas dans onTabSelected


Sujet :

Android

  1. #1
    Membre régulier Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Points : 75
    Points
    75
    Par défaut findViewById ne marche pas dans onTabSelected
    Bonjour

    je suis nouveau en dev android et j'ai une petite question

    j'ai fait un mix entre le tutoriel Android et le projet par défaut d'Android studio
    et ça marche mais quand je switch entre les tab et que je cherche à mettre à jour un TextView

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
     
            mViewPager.setCurrentItem(tab.getPosition());
           TextView mMsg;
     
    mMsg = (TextView) (findViewById(R.id.h_message));
                        mMsg.setText(mr.TownName);
    ne marche pas car mMsg est null !
    pourquoi findViewById me retourne un null,

    je signale que le id.h_message fait partie du fragment .xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <TextView
                    android:id="@+id/h_message"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="12dip"
                    android:padding="10dip"
                    android:gravity="center"
                    android:text="@string/main"
                    style="@style/Text.Normal" />
    comment fait on pour acceder aux textview des fragments sélectionnés

    Merci

  2. #2
    Membre régulier Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Points : 75
    Points
    75
    Par défaut
    alors ce qui est bizarre, c'est que en modifiant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        mMsg = (TextView) (findViewById(R.id.h_message));
                        if (mMsg != null)   mMsg.setText("horaires Fragment");
    l'appli ne plante pas mais l'affichage ne se fait pas au lancement (comme il devrait le faire pour ce premier tab) mais plutot qd je reviens sur ce premier tab/frag en ayant parcouru au moins 1 autre...

    ???
    une explication ? et comment faire pour que ça marche depuis le début

    merci

  3. #3
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Je reformule ce que je comprends :

    Tu as une vue en onglet. Lors de l'appui sur un onglet, tu désirs qu'un TextView non-présent sur ta vue affichée de base soit mis à jour. Le tout dans un contexte de Fragment. C'est bien ça ?

    Dans cet optique, il est normal de ne pas trouver le TextView, celui-ci n'existant tout simplement pas encore. Avec l'utilisation de Fragment, seul celui affiché doit être chargé, et ensuite le chargement se fait à la demande, avec une mise en cache pour ne pas avoir a "recréer" X fois la même vue inutilement.

    Pour changer un onglet, les appels sont : appui utilisateur - création vue - mise des données dans la vue - affichage (- animation )- affichage pour l'utilisateur
    Tu reprends le TextView à l'appui utilisateur. La première fois, celui-ci sera null (n'existe pas) et les fois suivantes, il sera présent.

    Sachant que, si tu utilises un ViewPager, j'ai remarqué qu'il avait tendance à garder en mémoire 2 vues (ça doit être décrit dans sa doc, j'imagine... si ça ne l'est pas, ce comportement est susceptible d'être modifié par les constructeurs/opérateurs/ROM custom) : la vue en train d'être affichée et la dernière vue sur lequel l'utilisateur a été.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  4. #4
    Membre régulier Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Points : 75
    Points
    75
    Par défaut
    je reformule :
    quand l'appli se lance, elle affiche le premier fragment correspondnt au 1er Tab (onglet), le xml du frgment (que je donne dans le code) comprend bien le textview que je cherche à modifier mais en essayant de l'intercepter dans la routine onTabSelectected, je recupere un nill
    par contre si je passe sur un autre onglet et que je revienne sur le 1er; là, la mˆeme routine renvoie un textview valide et mon texte est mis à jour

    alors pourquoi ? et comment contourner le pb
    merci bien

  5. #5
    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
    Je reformule ce qu'a dit Hizin aussi:

    onTabSelected est appelé *AVANT* que les vues ne soient créées la première fois (quand on démarre l'appli).

    quand on se déplace de tab et qu'on revient sur le tab, onTabSelected est à nouveau appelé, mais les vues avait déjà été créées, et sont donc réutilisée, mMsg est donc non null.

    Pour être "clean", c'est le fragment qui doit mettre à jour le TextView (et pas le view pager)... Lui seul sait quand ses views sont créées.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre régulier Avatar de LotfiB
    Inscrit en
    Août 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 117
    Points : 75
    Points
    75
    Par défaut
    ok merci pour les éclaircissements
    ça veut dire que je m'y suis mal pris

    j'ai un frag general, un de config et un de boussole (SensorManager)

    l'idée est que le frag config modifie certaines donnée qui seront utilisées ds les 2 autres frag.

    et que qd le frag boussole est actif, je lance le listener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Register magnetic sensor
                    sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                            SensorManager.SENSOR_DELAY_NORMAL);
    et qd le frag n'est plus actif ( onTabUnselected), je le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sensorManager.unregisterListener(this);
    J'ai pensé aussi à me débarasser des Tabs et à ne garder que le sliding, je gagnerai de la place dans l'affichage

    alors où mettre la detection de enter/leave frag ? c'est le page viewer ou directement dans le frag
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onPause(), onStop(), onResume()

    Edit : ce que j'ai fait et ça marche mieux :
    Fragment implements SensorEventListener

    par contre je me suis apperçu que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            @Override
            public void onResume() {
                super.onResume();
     
                Toast.makeText(getApplicationContext(), "Start frag1", Toast.LENGTH_SHORT).show();
    m'explique que dès qu'un frag est actif, eh bien le OnResume du suivant est appelé, comme pour le préparer à s'afficher...
    y a de la doc sur ça pour étayer ?

    merci

Discussions similaires

  1. TO_DATE ne marche pas dans ma requete !
    Par merilith dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/06/2006, 05h31
  2. Outlook ne marche pas dans mon réseau sous linux
    Par Germain123 dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 25/03/2006, 22h15
  3. Balise <PRE> marche pas dans un form
    Par chateau64 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 14/11/2005, 09h20
  4. aperçu d image avec input type file marche pas dans ffx
    Par siddh dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/11/2005, 09h11
  5. [GifDecoder] marche pas dans applet avec IE
    Par formentor dans le forum Applets
    Réponses: 2
    Dernier message: 06/05/2003, 10h43

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