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 :

[Android] Obtenir un RemoteViews depuis un fichier XML


Sujet :

Android

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 34
    Par défaut [Android] Obtenir un RemoteViews depuis un fichier XML
    Bonjour à tous ! :-)

    Je cherche à obtenir un RemoteViews depuis un fichier XML stocké sur la mémoire interne/carte SD (n'importe). Je ne sais pas si cela est possible, mais ça m'arrangerait beaucoup... Ce que je veux faire, c'est actualiser un AppWidget depuis ce fichier XML ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RemoteViews views = new RemoteViews(context.getPackageName(), /*FICHIER XML*/);
    //Actions diverses sur le RemoteViews
    appWidgetManager.updateAppWidget(appWidgetIds, views);
    Merci de m'aider :-)

    Syrl

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    TU peux essayer de passer par les inflater :
    http://developer.android.com/referen...roup, boolean)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FileReader reader = new File("le chemin de ton fichier xml");
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
             factory.setNamespaceAware(true);
             XmlPullParser xpp = factory.newPullParser();
     
             xpp.setInput(reader);
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            RemoteView remoteView = (RemoteView) inflater.inflate(xmlParser, null, false);
    Jamais testé , après j'ai peur que la variable mLayoutId du RemoteViews te pose problèmes car tu n'auras pas l'id associé :/
    Peut être que le mieux reste de passer par la construction dynamique. Faudrait testé :s

    Peut être que le mieux serait plus d'avoir un xml de base vide avec juste une veiwgroup, auquel tu rajouterais ta vue obtenue par l'inflate de ton fichier Xml comme ci dessus via l'inflater, puis de l'ajouter dans la remoteView via la fonction addView, par contre n'oublie pas d'ajouter l'i dans ton viewGroup parent sinon ca va pas le faire

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 34
    Par défaut
    Merci beaucoup de ton aide !! :-)
    Je vais essayer cela et je vous tient au courant !
    Syrl

  4. #4
    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
    Heu...

    Je ne veux pas dire de bétise... mais quand tu parles de fichier XML tu parles de ressources "layout" ?
    Dans ce cas c'est simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    views = new RemoteViews(getPackageName(), R.layout.xxxxxxxx);
    Je ne suis pas sur de la solution de Feanorin... Qu'il faille passer par un XmlPullParser c'est quasi certain... mais un LayoutInflater ne fournit que des "View" qui n'ont pas grand chose à voir avec RemoteViews.
    Tout n'étant pas disponible en RemoteViews (par exemple les custom-views bien entendu, ou encore SurfaceView).

    Pour rappel, l’intérêt de RemoteViews est de fournir à une application tierce les moyens de construire une arborescence de views sans pour autant qu'elle accède au code de la source.
    De même l'application qui fournit les RemoteViews n'a aucun accès aux Views qui en découleront.

    D'ailleurs si on regarde le code de RemoteViews, tout ce que fait l'objet c'est de stocker le package-name & le layout-id, et de charger la ressource au moment du "apply" (quand l'application tierce a besoin de créer les views, avec du coup, selection de la ressource en fonction de l'orientation du téléphone etc...). Il y a donc fort peu de chances pour qu'on puisse charger un fichier XML directement !

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 34
    Par défaut
    Non je parle d'un fichier XML sur la mémoire interne, ou sur la carte SD, pas dans les ressources :-)
    Bon bah je vais essayer autrement alors ^^ (je n'ai toujours pas eut le temps de tester le code de Feanorin...)
    Merci !
    Syrl

  6. #6
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Je ne suis pas sur de la solution de Feanorin... Qu'il faille passer par un XmlPullParser c'est quasi certain... mais un LayoutInflater ne fournit que des "View" qui n'ont pas grand chose à voir avec RemoteViews.
    C'est ce que je pensais j'ai regardé le code de base depuis la classe RemoteViews ils passent bien par des inflaters, mais tu as raison il faudrait passer par la méthode performApply, mais elle est privé. car tu ne peux pas cast les Views en RemoteViews c'est la méthode performApply qui s'en charge de ce problème
    Ici le code :
    http://grepcode.com/file/repository....w.ViewGroup%29

    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
     public View More ...apply(Context context, ViewGroup parent, OnClickHandler handler) {
    2589        RemoteViews rvToApply = getRemoteViewsToApply(context);
    2590
    2591        View result;
    2592        // RemoteViews may be built by an application installed in another
    2593        // user. So build a context that loads resources from that user but
    2594        // still returns the current users userId so settings like data / time formats
    2595        // are loaded without requiring cross user persmissions.
    2596        final Context contextForResources = getContextForResources(context);
    2597        Context inflationContext = new ContextWrapper(context) {
    2598            @Override
    2599            public Resources More ...getResources() {
    2600                return contextForResources.getResources();
    2601            }
    2602            @Override
    2603            public Resources.Theme More ...getTheme() {
    2604                return contextForResources.getTheme();
    2605            }
    2606        };
    2607
    2608        LayoutInflater inflater = (LayoutInflater)
    2609                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    2610
    2611        // Clone inflater so we load resources from correct context and
    2612        // we don't add a filter to the static version returned by getSystemService.
    2613        inflater = inflater.cloneInContext(inflationContext);
    2614        inflater.setFilter(this);
    2615        result = inflater.inflate(rvToApply.getLayoutId(), parent, false);
    2616
    2617        rvToApply.performApply(result, parent, handler);
    2618
    2619        return result;
    2620    }

    Donc la seule possibilité serait la deuxième solution :
    Peut être que le mieux serait plus d'avoir un xml de base vide avec juste une veiwgroup, auquel tu rajouterais ta vue obtenue par l'inflate de ton fichier Xml comme ci dessus via l'inflater, puis de l'ajouter dans la remoteView via la fonction addView, par contre n'oublie pas d'ajouter l'i dans ton viewGroup parent sinon ca va pas le faire

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 34
    Par défaut
    Finalement, j'ai fait bien plus simple et ça marche :-)
    (Désolé de vous avoir fait chercher tout ce temps pour cela, mais c'est super sympa de votre part ! ^^)

    En revenant au problème de base (actualiser un appWidget sans bugs), je me suis rendu compte qu'il y avait bien plus simple :

    En fait, j'ai enregistré le RemoteViews en variable globale, et au fur et à mesure que le texte du widget ou que son apparence évolue, on modifie ce RemoteViews, et on l'affiche.

    Et cela fonctionne parfaitement : plus aucun bugs dans l'application !

    Merci beaucoup !
    Syrl :-)

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

Discussions similaires

  1. Appel d'un report depuis un fichier xml de jasperserver
    Par Gabriel.Entressangle dans le forum Jasperserver
    Réponses: 2
    Dernier message: 16/04/2008, 09h43
  2. Intégre des données depuis un fichier xml
    Par KATE6447 dans le forum InfoPath
    Réponses: 5
    Dernier message: 20/03/2008, 13h32
  3. Cast "dynamique" depuis un fichier xml
    Par Arno83 dans le forum Langage
    Réponses: 2
    Dernier message: 26/02/2008, 18h56
  4. Generateur de Forms depuis un fichier Xml..Style XAML
    Par sacofan dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/11/2006, 16h10
  5. [Image] charger une image depuis un fichier xml.
    Par Invité dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 21/11/2006, 14h59

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