Existe-t-il un moyen simple d’append une bordure au haut et au bas d’une vue Android?

J’ai un TextView et j’aimerais append une bordure noire le long de ses bordures supérieure et inférieure. J’ai essayé d’append android:drawableTop et android:drawableBottom au TextView, mais cela ne faisait que rendre la vue entière noire.

  

Existe-t-il un moyen d’append facilement une bordure supérieure et inférieure à une vue (en particulier, un TextView) dans Android?

Dans Android 2.2, vous pouvez faire ce qui suit.

Créez un fichier XML dessinable tel que /res/drawable/textlines.xml et atsortingbuez-le comme propriété d’arrière-plan de TextView.

  

/res/drawable/textlines.xml

                

L’inconvénient est que vous devez spécifier une couleur d’arrière-plan opaque, car les transparents ne fonctionneront pas. (Au moins, je pensais qu’ils avaient fait mais je me suis trompé). Dans l’exemple ci-dessus, vous pouvez voir que la couleur unie de la première forme #FFdddddd est copiée dans la couleur du trait de 2ème forme.

J’ai utilisé une astuce pour que la bordure soit affichée à l’extérieur du conteneur. Avec cette astuce, seule une ligne est dessinée pour que l’arrière-plan soit affiché de la vue sous-jacente.

           

Option 1: Forme dessinable

C’est l’option la plus simple si vous voulez une bordure autour d’une mise en page ou d’une vue dans laquelle vous pouvez définir l’arrière-plan. Créez un fichier XML dans le dossier drawable qui ressemble à ceci:

      

Vous pouvez supprimer le solid si vous ne voulez pas de remplissage. Le set background="@drawable/your_shape_drawable" sur votre mise en page / vue.

Option 2: vue de fond

Voici un petit truc que j’ai utilisé dans un RelativeLayout . Fondamentalement, vous avez un carré noir sous la vue que vous voulez donner une bordure, puis donnez à cette vue un peu de remplissage (pas de marge!), Donc le carré noir apparaît sur les bords.

Évidemment, cela ne fonctionne correctement que si la vue ne comporte aucune zone transparente. Si c’est le cas, je vous recommande d’écrire un BorderView personnalisé qui ne dessine que la bordure – il ne devrait y avoir que quelques dizaines de lignes de code.

   

Si vous vous posez la question, cela fonctionne avec adjustViewBounds=true . Cependant, cela ne fonctionne pas si vous voulez avoir un arrière-plan dans un RelativeLayout entier, car il y a un bogue qui vous empêche de remplir un RelativeLayout avec une View . Dans ce cas, je recommanderais le dessin de Shape .

Option 3: 9 patch

Une dernière option consiste à utiliser un dessin à 9 patchs comme celui-ci:

Vous pouvez l’utiliser sur n’importe quelle vue où vous pouvez définir android:background="@drawable/..." . Et oui, il doit être 6×6 – j’ai essayé 5×5 et cela n’a pas fonctionné.

L’inconvénient de cette méthode est que vous ne pouvez pas changer les couleurs très facilement, mais si vous voulez des bordures fantaisies (par exemple, seulement une bordure en haut et en bas, comme dans cette question), vous ne pourrez peut-être pas les faire avec la Shape dessinable, ce qui n’est pas très puissant.

Option 4: vues supplémentaires

J’ai oublié de mentionner cette option très simple si vous ne voulez que des bordures au-dessus et au-dessous de votre vue. Vous pouvez placer votre vue dans un LinearLayout vertical (si ce n’est pas déjà), puis append des View vides au-dessus et au-dessous comme ceci:

  

Pour append une 1dp blanche de 1dp en bas seulement et avoir un arrière-plan transparent, vous pouvez utiliser ce qui est plus simple que la plupart des réponses ici.

Pour le TextView ou une autre vue, ajoutez:

 android:background="@drawable/borderbottom" 

Et dans le répertoire drawable , ajoutez le borderbottom.xml XML suivant, appelé borderbottom.xml

          

Si vous voulez une bordure en haut, changez l’ android:top="-2dp" en android:bottom="-2dp"

La couleur n’a pas besoin d’être blanche et l’arrière-plan n’a pas besoin d’être transparent non plus.

L’élément solid peut ne pas être requirejs. Cela dépendra de votre conception (merci V. Kalyuzhnyu).

Fondamentalement, ce XML créera une bordure en utilisant la forme de rectangle, mais pousse ensuite les côtés supérieur, droit et gauche au-delà de la zone de rendu pour la forme. Cela laisse juste la bordure inférieure visible.

Je voulais donc faire quelque chose de légèrement différent: une bordure en bas UNIQUEMENT, pour simuler un diviseur ListView. J’ai modifié la réponse de Piet Delport et obtenu ceci:

                

Notez en utilisant px plutôt que dp pour obtenir exactement 1 pixel diviseur (certains DPI de téléphone feront disparaître une ligne 1dp).

La réponse actuellement acceptée ne fonctionne pas. Il crée des bordures verticales minces sur les côtés gauche et droit de la vue à la suite de l’anticrénelage.

Cette version fonctionne parfaitement. Il vous permet également de définir les largeurs de bordure indépendamment et vous pouvez également append des bordures sur les côtés gauche / droit si vous le souhaitez. Le seul inconvénient est qu’il ne supporte PAS la transparence.

Créez un fichier au format XML appelé /res/drawable/top_bottom_borders.xml avec le code ci-dessous et atsortingbuez-le comme propriété d’arrière-plan de TextView.

                 

Testé sur Android KitKat via Marshmallow

Comme l’a dit @Nic Hubbard, il existe un moyen très simple d’append une ligne de démarcation.

   

Vous pouvez changer la hauteur et la couleur de fond comme vous le souhaitez.

Vous pouvez également encapsuler la vue dans un FrameLayout, puis définir la couleur d’arrière-plan et le remplissage de l’image selon vos souhaits. Cependant, la textview, par défaut, a un arrière-plan «transparent». Vous devez donc également modifier la couleur d’arrière-plan de la vue de texte.

Mes réponses sont basées sur la version @Emile mais j’utilise une couleur transparente au lieu de solide.
Cet exemple va dessiner une bordure inférieure de 2dp.

                

@ color / bgcolor est la couleur de l’arrière-plan sur laquelle vous dessinez votre vue avec une bordure.

Si vous souhaitez modifier la position de la bordure, modifiez le décalage avec l’un des éléments suivants:

 android:bottom="2dp" android:top="2dp" android:right="2dp" android:left="2dp" 

ou combinez-les pour avoir 2 ou plusieurs frontières:

 android:bottom="2dp" android:top="2dp" 

Pourquoi ne pas simplement créer une vue haute résolution 1dp avec une couleur d’arrière-plan? Ensuite, il peut être facilement placé où vous voulez.

Créez d’abord un fichier xml avec le contenu ci-dessous et nommez-le border.xml et placez-le dans le dossier de mise en page du répertoire res.

      

Après cela, à l’intérieur du code, utilisez

 TextView tv = (TextView)findElementById(R.id.yourTextView); tv.setBackgroundResource(R.layout.border); 

Cela fera une ligne noire en haut et en bas du TextView.

Notez ci-dessous le code

  

Pour changer cela:

  

Je préfère cette approche dans “drawable / top_bottom_border.xml”:

              

Cela ne fait que les bordures, pas un rectangle qui apparaîtra si votre arrière-plan a une couleur.

Juste pour append ma solution à la liste.

Je voulais une bordure inférieure semi-transparente qui dépasse la forme d’origine (la bordure semi-transparente était donc en dehors du rectangle parent).

              

Ce qui me donne

entrer la description de l'image ici

Essayez d’envelopper l’image avec une ligne linéaire et définissez son arrière-plan sur la couleur de bordure souhaitée dans le texte. Ensuite, définissez le remplissage sur la vue de texte pour qu’il corresponde à l’épaisseur souhaitée pour votre bordure.

Vous pouvez également utiliser un 9-path pour faire votre travail. Créez-le de sorte que les pixels colorés ne se multiplient pas en hauteur mais uniquement le pixel transparent.

 // Just simply add border around the image view or view  // After that dynamically put color into your view or image view object objView.setBackgroundColor(Color.GREEN); //VinodJ/Abhishek 
      
  

Il suffit d’append ce TextView ci-dessous le texte où vous souhaitez append la bordure