8
votes

Style EditText Content 'On the Fly'?

Je travaille sur un éditeur de texte riche dans Android. Fondamentalement, il a des boutons audacieux, en italique et de liaison liés à un EditText pour changer le style du contenu. Je l'ai bien fonctionné si vous sélectionnez d'abord le texte que vous souhaitez styler, puis sélectionnez la touche à l'aide de cette méthode: http://developer.android.com/guide/appendix/faq/commontasks.htm#SelectingText .

Ce que j'essaie de faire est de faire fonctionner comme un éditeur de texte riche, où vous pouvez utiliser les boutons comme une bascule pour styler le texte aussi longtemps que vous le souhaitez, puis cliquez à nouveau sur la bascule pour arrêter d'utiliser le style. Donc, si je voulais taper ' faire attention à cela! ' en gras, je cliquerais sur le bouton "B", puis commencez à taper le texte et tout ce que je tape serait audacieux jusqu'à ce que je clique sur le "B 'Bouton à nouveau.

Des idées sur la manière de tirer ça? J'espère avoir été assez clair :)


3 commentaires

Il suffit d'ouvrir / fermer la balise HTML du style sélectionné avant / après le curseur.


Je ne suis pas tout à fait sûr que vous avez fourni une indication suffisamment précise de ce que le problème réel est. Vous avez indiqué votre objectif, mais n'a pas vraiment précisé ce que votre obstacle actuel est. Pouvez-vous s'il vous plaît élaborer?


En fait, je suis vraiment intéressé, BTW, parce que je suis intéressé par l'ajout de capacités simples d'édition de texte WYSIWYG / riches en riche à mon application.


5 Réponses :


5
votes

Vous pouvez simplement mettre à jour le style après chaque caractère de type à l'aide d'un textwatcher code> et le addtextChangeDlistener () code> méthode.

OK, il s'agit juste du code d'exemple Bones Bare. P>

int mStart = -1;

// Bold onClickListener
public void onClick(View view)
{
    if(mStart == -1) mStart = mEditText.getText().length();
    else mStart = -1;
}

// TextWatcher
onTextChanged(CharSequence s, int start, int before, int count)
{
    if(mStart > 0)
    {
        int end = mEditText.getText().length();
        mEditText.getText().setSpan(new StyleSpan(android.graphics.Typeface.BOLD), mStart, end - mStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}


4 commentaires

Ce type de fonctionnement, mais j'ai besoin d'obtenir le code HTML de l'EDITTTEXT à l'aide de la méthode HTML.TOHTML, ce qui provoque l'addition d'une balise HTML autour de chaque personnage saisi.


Je ne dis pas de formater chaque personnage, je dis à mettre à jour le formatage de chaque caractère. Je vais mettre à jour ma réponse avec un exemple.


Merci pour le code, mais il semble faire la même chose: ajoute une style à chaque personnage saisi. Je peux le réparer en appelant Removesespan en tant que types d'utilisateurs, mais il doit y avoir un meilleur moyen que cela.


Merci Caseyb, cela a aidé à me procurer une solution. Voir ci-dessous.



0
votes

Une seule possibilité, je ne suis pas sûr que ce soit la meilleure solution, mais c'est ce qui se voit à l'esprit et qui sait que cela vous inspirera à une solution plus élégante:

Peut-être que vous pourriez envisager de suivre en interne une structure de style hiérarchique du "document", de toutes ses balises de style et de reconstruire / remplacer la sortie finale avec chaque caractère dactylographié? Bien sûr, vous devrez suivre la position du curseur aussi.


1 commentaires

Merci pour cela, ça me va sur la bonne voie. Cependant, cela a des faiblesses. À savoir, si vous revenez au milieu d'un texte préalablement stylé, vous ne divisez pas la portée afin de pouvoir insérer un nouveau texte avec le style actuel sélectionné. De plus, je ne pense pas que vous preniez en charge plusieurs styles appliqués sur le même texte ici ou du moins pas de manière à permettre à plusieurs niveaux de sélection. Par exemple, je pourrais commencer par audacieux et en italique, puis basculez-vous en italique, puis revenez audacieux et en italique. Ensuite, plus tard, je pourrais changer d'avis et vouloir revenir en arrière et changer quelque chose au milieu.



12
votes

Pour les personnes intéressées, j'ai eu ceci pour travailler en enregistrant l'emplacement du curseur (variable de stylestart 'ci-dessous) lorsque le togglebutton a été enfoncé, puis que l'utilisateur tape plus de caractères, je supprimais effectivement le style correspondant avec Removespan (), puis re-ajoutez-le avec SetSpan () à l'aide de l'emplacement du curseur d'origine enregistré + la longueur des caractères actuellement dactylographiés.

Vous devez également suivre si l'utilisateur modifie la position du curseur afin que vous ne styez pas de texte que vous n'avez pas. 't veux. Voici le code TextWatcher: p> xxx pré>

et voici l'une des actions de clic ToggleButton: P>

final ToggleButton boldButton = (ToggleButton) findViewById(R.id.bold);   

            boldButton.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {

                    EditText contentText = (EditText) findViewById(R.id.content);

                    int selectionStart = contentText.getSelectionStart();

                    styleStart = selectionStart;

                    int selectionEnd = contentText.getSelectionEnd();

                    if (selectionStart > selectionEnd){
                        int temp = selectionEnd;
                        selectionEnd = selectionStart;
                        selectionStart = temp;
                    }


                    if (selectionEnd > selectionStart)
                    {
                        Spannable str = contentText.getText();
                        StyleSpan[] ss = str.getSpans(selectionStart, selectionEnd, StyleSpan.class);

                        boolean exists = false;
                        for (int i = 0; i < ss.length; i++) {
                            if (ss[i].getStyle() == android.graphics.Typeface.BOLD){
                                str.removeSpan(ss[i]);
                                exists = true;
                            }
                        }

                        if (!exists){
                            str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                        }

                        boldButton.setChecked(false);
                    }
                }
        });


1 commentaires

Solution incroyable!



1
votes

Il y a une éditeur de texte riche en riche édittext open source appelé Android-Richtexteditor mais Le code a été inexplicablement supprimé dans R5. Le code est toujours là dans les révisions plus anciennes; Utilisez simplement SVN pour vérifier R4 ou plus tôt pour y accéder. Le code semble prendre en charge les italiques, le soulignement, le sélecteur de couleur, la taille du texte et plus encore.

Aussi répondu à ces questions: 1 , 2


0 commentaires

2
votes

Je sais que c'est un vieux fil, mais mon collègue aperçu droidwriter sur le la toile. J'ai joué un peu et je suis assez explicite et très facile à utiliser et à modifier. J'espère que cela aide toute personne qui cherche à créer un éditeur de texte riche.


0 commentaires