129 votes

Sélectionner + copier du texte dans un TextView ?

Existe-t-il un moyen de permettre à l'utilisateur de sélectionner / copier du texte dans un TextView ? J'ai besoin de la même fonctionnalité que EditText où l'on peut appuyer longuement sur le contrôle et obtenir les options de sélection / copie, mais j'ai besoin que le contrôle ressemble à un TextView.

J'ai essayé plusieurs choses, comme faire en sorte qu'un EditText utilise l'option editable="none" ou inputType="none", mais ces options conservent l'arrière-plan encadré d'un EditText, ce que je ne veux pas,

Remerciements

------- Mise à jour ----------------------

C'est là à 99%, tout ce que je voudrais, c'est que la barre de sélection soit visible (le truc orange). A part ça, c'est bon, je pourrais vivre avec ça :

<EditText 
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:editable="false"
  style="?android:attr/textViewStyle"
  android:textColor="@color/white"
  android:textAppearance="@android:style/TextAppearance.Medium"
  android:cursorVisible="false"
  android:background="@null" />

Je suppose que cela est dû au fait que cursorVisible="false", mais sans cela, le curseur est présent même si aucune sélection n'est effectuée.

6voto

fmarton Points 126

J'essaie de mettre en œuvre la même chose, et votre question m'a aidé à définir correctement la mise en page de mon editext. Merci donc ! :)

J'ai ensuite réalisé que la surbrillance sera visible si le curseur est activé. J'ai donc caché le curseur dans le fichier layout.xml, comme vous, et j'ai ajouté un eventlistener pour le clic long afin de n'afficher le curseur qu'au début de la sélection.

Ajoutez donc l'écouteur dans votre activité dans la section onCreate :

public TextView htmltextview;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    htmltextview.setOnLongClickListener(new OnLongClickListener(){

        public boolean onLongClick(View v) {
            htmltextview.setCursorVisible(true);
            return false;
        }
    });

}

Et voilà, il n'y a pas de curseur au début, et si vous faites un clic long, le curseur apparaît avec les limites de la sélection.

J'espère pouvoir vous aider.

Santé, fm

5voto

Wahib Haq Points 390

J'ai également essayé de faire quelque chose de similaire mais j'avais besoin d'une approche personnalisée avec la manipulation de la mise en évidence du texte dans TextView. J'ai déclenché le surlignage et la copie sur LongClick action.

C'est ainsi que j'ai réussi à utiliser SpannableString :

SpannableString highlightString = new SpannableString(textView.getText());
highlightString.setSpan(new BackgroundColorSpan(ContextCompat.getColor(getActivity(), R.color.gray))
            , 0, textView.getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(highlightString);
copyToClipboard(urlToShare);

et la fonction de copie :

public void copyToClipboard(String copyText) {
    ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText("url", copyText);
    clipboard.setPrimaryClip(clip);
    Toast toast = Toast.makeText(getActivity(), "Link is copied", Toast.LENGTH_SHORT);
    toast.show();
}

J'espère que cela sera utile à quelqu'un qui se retrouve sur cette question :)

0voto

herschel Points 2706

Bien que je ne sois pas sûr qu'il s'agisse d'une réponse, veuillez vérifier. este

Définir les EditText de manière à ce qu'ils ressemblent à des TextViews normaux

0voto

Celeron Points 1

J'ai constaté que cela ne fonctionnait pas la première fois que je double-cliquais, mais que cela fonctionnait ensuite (du moins dans Android 11). Cela m'a indiqué qu'il avait besoin d'obtenir le focus. Donc, dans l'événement onCreate, j'ai d'abord rendu la vue texte sélectionnable, puis j'ai demandé à ce que le focus soit déplacé vers la vue texte. Je ne dis pas que la vue texte peut perdre le focus et que la première tentative de sélection fonctionnera. Ce n'est pas garanti. Ce qui est garanti, c'est qu'une fois le focus obtenu, la sélection fonctionnera à chaque fois jusqu'à ce que le focus soit à nouveau perdu. N'oubliez pas les animations des androïdes. Prévoyez donc au moins une demi-seconde pour que l'animation, qui ne peut être remplacée, se déroule lorsque le clavier est caché.

// In onCreate

TextView1.setTextIsSelectable( true );
// Allow animations to play out. 

    timer = new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    TextView1.requestFocus();
                }
            });
        }
    };
    _timer.schedule(timer, (int)(1000));
    }

0voto

Merci beaucoup gilbot pour votre explication. Je voudrais juste ajouter quelque chose.

La couleur d'arrière-plan du texte sélectionné suit la couleur de fond du thème de l'application. colorAccent

Par exemple, voir l'image ci-dessous

styles.xml

Aquí AppTheme est mon thème d'application.

<item name="colorAccent">@color/cold</item>

et le colorAccent sera la couleur d'arrière-plan du texte sélectionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X