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

Composants graphiques Android Discussion :

TextView avec couleurs


Sujet :

Composants graphiques Android

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut TextView avec couleurs
    Bonjour,

    Je voudrais créer un éditeur de texte très simple avec des couleurs, c'est-à-dire que je veux être capable, en cliquant sur un mot écrit en noir, de mettre la première syllabe en rouge et la dernière en bleu.

    Quelqu'un saurait-il m'indiquer comment créer une telle vue ?

    J'ai réussi à le faire en J2SE grâce à JTextPane et StyledDocument.

    Merci de votre aide, je débute tout juste

  2. #2
    Expert éminent

    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
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Il me semble que tu peux passer par un format Html

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mText.setText(Html.fromHtml("<balise>" + string + "</balise>" + "<balise2>" + string2 + "</balise2>"));
    Cela devrait marcher .

    Sinon tu peux toujours essayer de créer ta propre TextView qui implémentera n Color avec ses positions
    http://grepcode.com/file/repository..../TextView.java

    Les fonctions intéressantes dans ton cas updateTextColors
    et te créer une nouvelle Fonction setColor(int color, int posdeb, int posend)
    il y aura d'autres modification surement mais je pense que cela soit possible .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    merci, je vais plutôt opter pour créer ma TextView. D'après ce que j'ai compris il faut créer une classe MyTextView qui dérive de TextView.
    Mais concernant la nouvelle fonction dont tu parles setColor(int color, int posdeb, int posend), tu as une idée de comment l'implémenter?

    cordialement

  4. #4
    Expert éminent

    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
    Points : 9 149
    Points
    9 149
    Par défaut
    Mais concernant la nouvelle fonction dont tu parle setColor(int color, int posdeb, int posend), tu a une idée de comment l implémenter?
    Hmm , je ne me suis pas pencher dessus ...

    mais en faisant une recherche j'ai trouvé ceci :
    http://developer.android.com/referen...ngBuilder.html

    Google l'a déjà fait en fait .

    public abstract void drawText (Canvas c, int start, int end, float x, float y, Paint p)

    Since: API Level
    Just like drawText(char[], int, int, float, float, Paint).
    il te faut juste sauvegarder tes couleur (donc tes Paints) avec leur position respective dans cette classe.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    Merci pour ton aide, ça marche plutôt bien avec les HTML et je vais m'en contenter pour le moment.
    Admettons que j'ai une TextView avec un texte simple, je voudrais pouvoir cliquer sur un mot(click long) et accéder depuis le code au mot sélectionné et changer la couleur de ce mot uniquement (callback avec des index begin et end)
    J'ai essayé pas mal de truc pour réussir à accéder au mot cliqué mais sans succès (j'ai aussi essayé la EditView).
    Tu saurais comment faire pour faire ça stp?

    Merci

  6. #6
    Expert éminent

    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
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Je n'y avais pas pensé mais tu peux aussi utiliser les gradient pour ta demande .
    Maintenant vu ce que tu veux faire je ne pense pas que cela soit utile .
    Enfin c'était pour l'info.

    Sinon pour revenir sur ta demande.

    Admettons que j ai une textView avec un texte simple, je voudrais pouvoir cliquer sur un mot(click long) et accéder depuis le code au mot sélectionné et changer la couleur de ce mot uniquement(callback avec des index begin et end)
    Tu peux utiliser cette méthode , il te suffira just de connaître la position du click de l'utilisateur , après avec l'offset à toi de trouver le mot correspondant avec les séparateur connu (espace , point ,...).
    http://developer.android.com/referen...(float, float)


    Ou si tu veux que l'utilisateur sélectionne direct le mot utilise alors ces deux fonctions GetSelctionStart et GetSelectionEnd, qui te retournerons le début et la fin du mot choisi :
    http://developer.android.com/referen...SelectionEnd()

    Edit : la première solution requière l'API 14
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    en fait je ne veux pas que mon texte soit éditable. J'utilise donc une TextView au lieu d'une EditView.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <TextView android:text="@string/hello" 
        android:id="@+id/mytext" 
     
        android:textColor="#FF000000"
         android:layout_width="1314dp" 
         android:layout_height="1127dp"
         android:editable="false"
         android:textIsSelectable="true"
        android:cursorVisible="true" 
         >
    </TextView>
    Je n'arrive pas à voir le curseur, ni sélectionner le texte, donc getSelectionStart et getSelectionEnd me retourne toujours 0, car j'ai fait un setText. Le clic long devrait normalement mettre surligner tout le mot en vert mais ça ne marche pas. Tu saurais ce qui ne va pas dans mon xml?

    merci

  8. #8
    Expert éminent

    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
    Points : 9 149
    Points
    9 149
    Par défaut
    Après une recherche, il est conseillé d'utiliser la WebView qui te permettra de gérer les sélections.

    http://stackoverflow.com/questions/6...ew-android-2-2

    Ou utiliser une EditText en autorisant pas son editable, du coup cela devient une TextView avec les sélections de texte possibles.
    http://stackoverflow.com/questions/6...ar-to-edittext
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    merci, j'ai déjà travaillé sur ces liens mais ça ne correspond pas a ce que je veux faire exactement. j'ai passé 2 jours a essayer de trouver comment faire sans succès, ça m'a l'air bien compliqué android comparé a swing. j'ai essayé plein de combinaisons xml pour le edittext mais rien n'y fait.
    je ne veux pas avoir le menu copy sur un long click, je veux uniquement avoir le mot sélectionné sur simple click ou long click et changer sa couleur.

    en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <EditText 
    android:text=" This is not an editable EditText" 
    android:id="@+id/entry" 
    android:layout_width="wrap_content" 
    android:textColor = "#FF000000"
    android:editable = "false"
    android:textIsSelectable = "false"
    android:cursorVisible="true" 
    android:layout_height="wrap_content"
    android:background = "#00000000">
    </EditText>
    le long click m'affiche toujours l'option pour la copie, et le curseur n'apparait pas. getSelectionStart et getSelectionEnd me retournent toujours 0, avec le TextView ça me donne -1 pour les 2.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut remplacement d'une partie de texte TextView
    Bonsoir,

    j'ai une TextView avec un texte très long. En cliquant sur un mot du texte, je voudrais changer la couleur du mot uniquement grâce au HTML et setText.
    Le problème est que setText permet uniquement de mettre à jour tout le texte, ce qui n'est pas très bon en terme de performances.
    Y' aurait-il un moyen de mettre a jour uniquement une partie du texte, c-à-d une sorte de setText(newText, beginOffset, endOffset)?

    Merci

  11. #11
    Expert éminent

    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
    Points : 9 149
    Points
    9 149
    Par défaut
    je ne veux pas avoir le menu copy sur un long click, je veux uniquement avoir le mot sélectionné sur simple click ou long click et changer sa couleur.
    Alors intercepte le long click, et change le menu en le redirigeant vers un menu de choix de couleur (Lineargradient par exemple).

    Tu as un CallBack sur la sélection qui revient à utiliser le SelectionStart et SelectionEnd.
    http://developer.android.com/referen...nged(int, int)

    Si le SelectionStart te retourne -1 c'est qu'il n'y a pas de sélection dans la TextView (normalement)
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    en fait la callback du long click arrive avant que le texte soit choisi, donc on aura toujours -1. Je ne sait pas quelle callback est appelée quand un mot est sélectionné.
    j'ai finalement utilisé cela :

    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
     
    public boolean onTouch(View v, MotionEvent event) {
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        // do something here when the element is clicked
     
                        int x = (int) event.getX();
                        int y = (int) event.getY();
     
                        x -= texeditText.getTotalPaddingLeft();
                        y -= texeditText.getTotalPaddingTop();
     
                        x += texeditText.getScrollX();
                        y += texeditText.getScrollY();
     
                        Layout layout = texeditText.getLayout();
                        int line = layout.getLineForVertical(y);
                        int xoff = layout.getOffsetForHorizontal(line, x); 
     
                        String word = getWordFromSelectedText(xoff);
     
                    }
    Concernant le curseur et le focus, j'ai un peu chercher mais ça n'est pas clair a 100% . Avec un editText, quand je fais un click long sur un mot, il est surligné en vert et 2 "curseurs" verts apparaissent en bas a l’extrémité du mot.
    Est-ce qu'il s'agit de curseurs? Est-ce-que getSelectionStart et End sont sensés retourner ces 2 valeurs? Je n'ai jamais réussi a voir un seul curseur a la fois, comment faire pour ne voir qu'un curseur la ou je clique?
    Concernant le focus, ça correspond a quoi sur un editText?
    Sur J2SE desktop on appelle le curseur(caret) le trait vertical qui clignote, est-ce-que la même chose existe sur Android?
    Merci

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    Bonsoir,

    j'ai une TextView avec un texte très long. En cliquant sur un mot du texte, je voudrais changer la couleur du mot uniquement grâce au HTML et setText.
    Le problème est que setText permet uniquement de mettre à jour tout le texte, ce qui n'est pas très bon en terme de performances.
    Y' aurait-il un moyen de mettre a jour uniquement une partie du texte, c-à-d une sorte de setText(newText, beginOffset, endOffset)?

    Merci
    Si j'ai dans ma textView "Salut le forum je m'appelle kaiser", si je clique sur "appelle", je veux mettre le mot appelle en rouge.
    Donc je dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String newText = "Salut le forum je m'" + "<font color=\"red\">" + "appelle" +"</font>" + "kaiser";
    texeditText.setText(Html.fromHtml(newText));
    Donc je dois dupliquer le texte de la textView, ce qui est très mauvais pour la mémoire si le texte est grand.
    Je cherche a savoir si on peux faire un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String textToReplace = "<font color=\"red\">" + "appelle" +"</font>";
     texeditText.setText(Html.fromHtml(textToReplace), xoff).
    pour ne remplacer le texte qu'a partir de l'offset que je connais grâce a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int line = layout.getLineForVertical(y);
    int xoff = layout.getOffsetForHorizontal(line, x);
    Cela évite d'allouer une nouvelle chaine en RAM

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    Concernant le curseur et le focus, j'ai un peu chercher mais ça n'est pas clair a 100% . Avec un editText, quand je fais un click long sur un mot, il est surligné en vert et 2 "curseurs" verts apparaissent en bas a l’extrémité du mot.
    Est-ce qu'il s'agit de curseurs? Est-ce-que getSelectionStart et End sont sensés retourner ces 2 valeurs? Je n'ai jamais réussi a voir un seul curseur a la fois, comment faire pour ne voir qu'un curseur la ou je clique?
    Concernant le focus, ça correspond a quoi sur un editText?
    Sur J2SE desktop on appelle le curseur(caret) le trait vertical qui clignote, est-ce-que la même chose existe sur Android?
    Merci
    Tu pourrais aussi éclairer la dessus si ça te parle? Merci

  15. #15
    Expert éminent

    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
    Points : 9 149
    Points
    9 149
    Par défaut
    Désolé pas trop le temps de faire des test pour te suivre
    mais normalement le getSelectionStart et End doivent te retrouner le début et la fin de ta sélection donc tes curseurs.

    Concernant le focus, ça correspond a quoi sur un editText?
    Ben c'est savoir si ton EditText a le focus donc si l'utilisateur est en train de travailler dessus. Si ton EditText n'a pas le focus c'est que l'utilisateur est sur une autre View.

    Donc je dois dupliquer le texte de la textView, ce qui est très mauvais pour la mémoire si le texte est grand.
    Je cherche a savoir si on peux faire un truc comme ça :
    Hmm, surtout je ne sais pas quel index te retournera exactement getSelectionStart pas dit qu'il prenne en compte la balise colorr de ton format html peut être qu'il faudra que tu prenne en compte ceci.
    En gros si l'utlisateur change de couleur bien regarder si une balise existe ou pas.

    pour ne remplacer le texte qu'a partir de l'offset que je connais grâce a :
    Il faudrait regarder dans la classe , sinon dans le code ...
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  16. #16
    Expert éminent

    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
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Une conversation a été ouverte sur ce sujet :
    http://www.developpez.net/forums/d11...setforeground/

    Il existe , désolé je ne savais pas une classe qui justement te permet d'effectuer ta demande sur la gestion des couleurs au sein d'une TextView.
    SpannableString
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

Discussions similaires

  1. Réponses: 10
    Dernier message: 30/11/2006, 17h36
  2. Combobox avec couleur et font
    Par charaf dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 27/06/2006, 20h12
  3. Ligne dans une BufferedImage avec couleur inverse
    Par bourbon dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/05/2006, 01h31
  4. PopupMenu : afficher un dessin avec couleur personnalisée
    Par MiJack dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/02/2006, 12h54
  5. [VB.NET] Brush avec couleur définie en RGB
    Par jennings dans le forum Windows Forms
    Réponses: 7
    Dernier message: 31/12/2004, 08h41

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