Есть ли простой способ добавить границу вверху и внизу Android View?

У меня есть TextView, и я хотел бы добавить черную рамку вдоль его верхней и нижней границ. Я попытался добавить android:drawableTop и android:drawableBottom в TextView, но это только привело к тому, что весь вид стал черным.

<TextView
    android:background="@android:color/green"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:drawableTop="@android:color/black"
    android:drawableBottom="@android:color/black"
    android:text="la la la" />

Есть ли способ легко добавить верхнюю и нижнюю границу к представлению (в частности, TextView) в Android?


person emmby    schedule 21.10.2009    source источник
comment
Удивительно, что никто не упомянул dividerVertical! Это то, что создано Android для создания вертикальных разделителей. Не может быть проще, и вы делаете все на панели Design WYSIWYG в Android Studio.   -  person Fattie    schedule 26.06.2014
comment
note dividerVertical был реализован в API 11.   -  person JPM    schedule 26.02.2015
comment
Может, покажете, как использовать dividerVertical?   -  person androidguy    schedule 24.02.2017


Ответы (23)


В Android 2.2 вы можете сделать следующее.

Создайте XML-файл, например /res/drawable/textlines.xml, и назначьте его как свойство фона TextView.

<TextView
android:text="My text with lines above and below"
android:background="@drawable/textlines"
/>

/res/drawable/textlines.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
      <shape 
        android:shape="rectangle">
            <stroke android:width="1dp" android:color="#FF000000" />
            <solid android:color="#FFDDDDDD" />

        </shape>
   </item>

   <item android:top="1dp" android:bottom="1dp"> 
      <shape 
        android:shape="rectangle">
            <stroke android:width="1dp" android:color="#FFDDDDDD" />
            <solid android:color="#00000000" />
        </shape>
   </item>

</layer-list>

Обратной стороной этого является то, что вам нужно указать непрозрачный цвет фона, поскольку прозрачность не будет работать. (По крайней мере, я так думал, но ошибался). В приведенном выше примере вы можете видеть, что сплошной цвет первой фигуры #FFdddddd копируется во второй цвет обводки фигур.

person Emile    schedule 30.11.2010
comment
Также см. Это решение, которое также работает для TextView, если вам нужна граница вокруг: stackoverflow.com/questions/3263611/ - person emmby; 09.12.2010
comment
Попробуйте использовать android:color="@null", чтобы избежать проблем с непрозрачным фоном. - person Matt Briançon; 27.07.2011
comment
@emmby: при тестировании этого кода на планшете требуется время для рендеринга на экране, через 1 секунду границы отображаются при прокрутке - person Chetan; 03.04.2012
comment
Трюк android: color = @ null не помог мне сохранить прозрачность и просто отобразить границу с одной стороны представления. Ответ от user1051892 ниже сделал работу! - person Rick Pastoor; 12.07.2013
comment
Это решение также сделало границу слева и справа, хотя и более тонкую. - person AlikElzin-kilaka; 30.07.2013
comment
почему бы не использовать @android: color / transparent вместо # 00000000, чтобы получить лучший узор? - person ademar111190; 18.08.2013
comment
Да, вы можете использовать @android: color / transparent. Я не просто для ясности в примере кода. - person Emile; 19.08.2013
comment
Это сломано на бутерброде с мороженым. На правом краю появится линия. - person markshiz; 05.06.2014
comment
@kilaka Если вы меняли цвета, убедитесь, что вы изменили их и в нижнем элементе. - person Dylan Vander Berg; 11.07.2014

Я применил трюк, чтобы рамка отображалась за пределами контейнера. С помощью этого трюка рисуется только линия, поэтому будет показан фон основного вида.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:bottom="1dp"
        android:left="-2dp"
        android:right="-2dp"
        android:top="-2dp">
        <shape android:shape="rectangle" >
            <stroke
                android:width="1dp"
                android:color="#FF000000" />

            <solid android:color="#00FFFFFF" />

            <padding android:left="10dp"
                android:right="10dp"
                android:top="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

</layer-list>
person user1051892    schedule 24.05.2012
comment
Это отлично сработало для меня, с некоторыми настройками, чтобы сделать линию немного тоньше. - person Jeff; 19.04.2013
comment
Очень хороший трюк, хотя было бы лучше, если бы нам не приходилось обманывать компьютер, чтобы добиться результата. - person Yukio Fukuzawa; 17.05.2013
comment
красиво сделано! то, что вы должны смотреть, это элемент слева, сверху, справа, снизу должен - (ширина штриха) dp - person asakura89; 10.06.2013
comment
Границы не было - просто содержимое моего представления выглядело меньше :( - person AlikElzin-kilaka; 30.07.2013
comment
Сделано красиво, проработано с прозрачным фоном. Проверено в 2.2 и 4.4.2. Должен охватывать все, что находится между ними :) - person HumaN; 27.12.2013
comment
Работа без цвета фона, отличный ответ. - person MaxEcho; 13.03.2014
comment
Правильный! Этот также работает на Android 4.0.3 и выше. - person andrea.rinaldi; 17.03.2014
comment
Спасибо! Я полдня возился, пытаясь сделать такое. Вы только что решили это для меня :) Очень признателен! - person developer82; 16.05.2014
comment
Это решение работает - мне просто не нравится объяснять следующему разработчику, почему я добавил отрицательные значения. В конце концов, это взлом. Хотя сделано хорошо. - person Kevin D.; 02.06.2017
comment
@emmby Я предлагаю выбрать этот ответ как действительный, поскольку он не добавляет фона, а только добавляет границу внизу. Другим людям будет легче найти правильный ответ. - person xarlymg89; 16.03.2018
comment
Удаляю эту строчку <solid android:color="#00FFFFFF" />, тоже работает ~ - person DawnYu; 15.05.2018

Чтобы добавить 1dp белую рамку только внизу и иметь прозрачный фон, вы можете использовать следующее, что проще, чем большинство ответов здесь.

Для TextView или другого вида добавьте:

android:background="@drawable/borderbottom"

И в каталог drawable добавьте следующий XML-код с именем borderbottom.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:top="-2dp" android:left="-2dp" android:right="-2dp">
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#ffffffff" />
            <solid android:color="#00000000" />
        </shape>
    </item>
</layer-list>

Если вам нужна граница вверху, измените android:top="-2dp" на android:bottom="-2dp".

Цвет не обязательно должен быть белым, как и фон не обязательно должен быть прозрачным.

Элемент solid может не требоваться. Это будет зависеть от вашего дизайна (спасибо В. Калюжню).

По сути, этот XML будет создавать границу, используя форму прямоугольника, но затем выталкивает верхнюю, правую и левую стороны за пределы области рендеринга формы. Это оставляет видимой только нижнюю границу.

person Tigger    schedule 23.06.2015
comment
Это лучшее решение, так как оно не создает перерисовки, как другие. - person Greg Ennis; 06.01.2016
comment
Есть ли причина, по которой отрицательные позиции вдвое больше, чем штрихи с (-2dp против 1dp)? Кажется, работает, когда они равны по количеству (-1 и 1). - person Denis Kniazhev; 18.08.2016
comment
@DenisKniazhev: При использовании -2dp результат всегда был чистым. Я думаю, что был тестовый пример, когда результат был не чистым. Я не могу вспомнить, был ли это экран с низкой или высокой плотностью или даже более старая версия Android (возможно, 2.x). - person Tigger; 18.08.2016
comment
Интересно. Знаете ли вы, является ли это общим случаем, например, если я использую 4dp для ширины штриха, должен ли я использовать -8dp для позиционирования? - person Denis Kniazhev; 18.08.2016
comment
@DenisKniazhev: (по памяти) это выглядело как вычисление с плавающей запятой, которое было просто маленьким или большим или маленьким. Это означает, что значение -5dp будет всем, что нужно со значением ширины 4pd. Просто нужно было быть немного больше, чтобы преодолеть неточность значения с плавающей запятой. - person Tigger; 19.08.2016
comment
Просто и элегантно. - person Dino Tw; 23.04.2018
comment
Как по мне solid избыточно - person Vlad; 04.05.2018

Вариант 1: фигура, которую можно рисовать

Это самый простой вариант, если вам нужна рамка вокруг макета или вида, в которой вы можете установить фон. Создайте XML-файл в папке drawable, который выглядит примерно так:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#8fff93" />

    <stroke
        android:width="1px"
        android:color="#000" />

</shape>

Вы можете удалить solid, если не хотите заливки. Набор background="@drawable/your_shape_drawable" на вашем макете / просмотре.

Вариант 2: фоновый режим

Вот небольшой трюк, который я использовал в RelativeLayout. В основном у вас есть черный квадрат под представлением, которое вы хотите дать рамкой, а затем добавьте этому представлению некоторый отступ (не поля!), Чтобы черный квадрат просвечивал по краям.

Очевидно, это работает правильно только в том случае, если в представлении нет прозрачных областей. Если это так, я бы порекомендовал вам написать собственный BorderView, который рисует только границу - это должно быть всего несколько десятков строк кода.

<View
    android:id="@+id/border"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/image"
    android:layout_alignLeft="@+id/image"
    android:layout_alignRight="@+id/image"
    android:layout_alignTop="@+id/main_image"
    android:background="#000" />

<ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_...
    android:padding="1px"
    android:src="@drawable/..." />

Если вам интересно, он действительно работает с adjustViewBounds=true. Однако это не сработает, если вы хотите иметь фон для всего RelativeLayout, потому что есть ошибка, из-за которой вы не можете заполнить RelativeLayout View. В этом случае я бы рекомендовал Shape drawable.

Вариант 3: 9 патчей

Последний вариант - использовать 9-патчовый рисунок, подобный этому:

Вы можете использовать его в любом представлении, где вы можете установить android:background="@drawable/...". И да, это должно быть 6x6 - я пробовал 5x5, и это не сработало.

Недостатком этого метода является то, что вы не можете очень легко изменить цвета, но если вам нужны необычные границы (например, только граница сверху и снизу, как в этом вопросе), вы не сможете сделать их с Shape drawable, что не очень мощно.

Вариант 4: дополнительные просмотры

Я забыл упомянуть об этом действительно простом варианте, если вам нужны только границы над и под вашим видом. Вы можете расположить свой вид вертикально LinearLayout (если это еще не сделано), а затем добавить пустые View сверху и снизу следующим образом:

<View android:background="#000" android:layout_width="match_parent" android:layout_height="1px"/>
person Timmmm    schedule 17.10.2012
comment
9 и возможность рисования формы в порядке, но я бы не рекомендовал добавлять представления или изображения для решения такой проблемы. Причина в том, что вы должны удалить как можно больше таких ‹elements› из ваших макетов, чтобы улучшить перерисовку макета и анимацию. Я бы сразу убрал их и реализовал что-то похожее на вариант 1 или 2. - person Emile; 06.11.2012
comment
@Emile Это правда, но если вы используете настраиваемый ListView, который не поддерживает разделители, простой View вполне подойдет. Влияние на производительность почти равно нулю, особенно если вы уверены, что не хотите менять глубину макета. Он также позволяет избежать ошибок с разделителями ListView на разных устройствах (я видел некоторые устройства, которые игнорируют это свойство). - person Tom; 14.01.2013
comment
Вы также можете использовать эффективный шаблон держателя просмотра со списками, чтобы сократить количество вызовов findViewByID, что часто является причиной низкой производительности списка. - person Emile; 15.01.2013
comment
В iOS у вас есть только один способ сделать это. На android вы должны протестировать как минимум четыре, в моем случае вариант 4 был подходящим. Имейте в виду, что иногда чертежи в качестве фона зависают для рендеринга. - person Ratata Tata; 22.10.2013
comment
Почему у Android не было самого простого решения для таких вещей? как на другом языке, например HTML, CSS или что-то в этом роде JavaFX, WPF ... - person Asif Mushtaq; 13.04.2017
comment
Использование варианта 2: фоновый просмотр (в относительном макете), и он работает как шарм. Большое спасибо :) - person Vinay Vissh; 18.07.2017
comment
Вариант 1 звучит хорошо, но он также создает границы слева и справа. - person Big McLargeHuge; 05.08.2019

Принятый на данный момент ответ не работает. Он создает тонкие вертикальные границы с левой и правой сторон вида в результате сглаживания.

Эта версия работает отлично. Он также позволяет вам устанавливать ширину границ независимо, и вы также можете добавлять границы с левой / правой стороны, если хотите. Единственный недостаток в том, что он НЕ поддерживает прозрачность.

Создайте XML-файл с именем /res/drawable/top_bottom_borders.xml с приведенным ниже кодом и назначьте его как свойство фона TextView.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#DDDD00" /> <!-- border color -->
        </shape>
    </item>

    <item
        android:bottom="1dp" 
        android:top="1dp">   <!-- adjust borders width here -->
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF" />  <!-- background color -->
        </shape>
    </item>
</layer-list>

Проверено на Android KitKat через Marshmallow

person gregschlom    schedule 10.06.2016
comment
Как сделать внутреннюю часть прозрачной? - person Hitesh Sahu; 12.07.2016
comment
@HiteshSahu Я думаю, что обратная сторона этого заключается в том, что вам придется сопоставить фон макета с фоном виджета здесь - person chntgomez; 19.07.2016

Поэтому я хотел сделать что-то немного другое: ТОЛЬКО границу внизу, чтобы имитировать разделитель ListView. Я изменил ответ Пита Делпорта и получил следующее:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
   <item>
      <shape 
        android:shape="rectangle">
            <solid android:color="@color/background_trans_light" />    

        </shape>
   </item>

    <!-- this mess is what we have to do to get a bottom border only. -->
   <item android:top="-2dp"
         android:left="-2dp"
         android:right="-2dp"
         android:bottom="1px"> 
      <shape 
        android:shape="rectangle">    
            <stroke android:width="1dp" android:color="@color/background_trans_mid" />
            <solid android:color="@null" />
        </shape>
   </item>

</layer-list>

Обратите внимание на использование px вместо dp, чтобы получить ровно 1 пиксельный разделитель (некоторые DPI телефонов заставят исчезнуть линию 1dp).

person phreakhead    schedule 18.07.2013
comment
дорогая! каково значение "@color/background_trans_light"? - person Shajeel Afzal; 08.08.2013
comment
Ура, @phreakhead, у меня это действительно работает! Без верхней, левой или правой границы. Именно то, что мне нужно, спасибо! - person shanehoban; 29.04.2014
comment
Объясните, пожалуйста, почему, когда вы ставите -2dp, он исчезает, а когда вы ставите -1dp, он все еще виден? Спасибо! - person Francisco Romero; 26.08.2015
comment
@phreakhead лучше, если вы добавите к этому некоторые пояснения - person Maveňツ; 07.08.2020

Как сказал @Nic Hubbard, есть очень простой способ добавить границу.

<View
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:background="#000000" >
</View>

Вы можете изменить высоту и цвет фона на все, что захотите.

person MattZ    schedule 23.11.2014

Вы также можете обернуть представление в FrameLayout, а затем установить цвет фона фрейма и отступы, которые вам нужны; однако текстовое представление по умолчанию имеет «прозрачный» фон, поэтому вам также потребуется изменить цвет фона текстового представления.

person okaram    schedule 30.09.2010
comment
Довольно просто. Вы управляете размером и направлением контуров с помощью полей внутреннего вида. Спасибо. - person SMBiggs; 21.04.2017

Мои ответы основаны на версии @Emile, но я использую прозрачный цвет вместо сплошного.
В этом примере будет нарисована нижняя граница 2dp.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle" >
            <stroke  android:width="2dp"
                     android:color="#50C0E9" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
    <item  android:bottom="2dp" >
        <shape android:shape="rectangle" >
            <stroke  android:width="2dp"
                     android:color="@color/bgcolor" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</layer-list>

@ color / bgcolor - это цвет фона, на котором вы рисуете вид с рамкой.

Если вы хотите изменить положение границы, измените смещение одним из следующих вариантов:

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

или объедините их, чтобы получить 2 или более границ:

android:bottom="2dp" android:top="2dp"
person vovahost    schedule 01.06.2013

Добавить файл в res / drawable

<?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:left="-2dp" android:right="-2dp">
            <shape android:shape="rectangle">
                <stroke
                    android:width="1dp"
                    android:color="#000000" />
            </shape>
        </item>
    </layer-list>

Добавить ссылку на этот файл в свойство background

person Oleg    schedule 11.04.2020

Почему бы просто не создать вид сверху 1dp с цветом фона? Тогда его можно будет легко разместить где угодно.

person Nic Hubbard    schedule 30.09.2013

Просто чтобы добавить свое решение в список ..

Мне нужна полупрозрачная нижняя граница, которая выходит за пределы исходной формы (поэтому полупрозрачная граница была за пределами родительского прямоугольника).

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
    <shape android:shape="rectangle" >      
      <solid android:color="#33000000" /> <!-- Border colour -->
    </shape>
  </item>
  <item  android:bottom="2dp" >
    <shape android:shape="rectangle" >     
      <solid android:color="#164586" />
    </shape>
  </item>
</layer-list>

Что дает мне;

введите описание изображения здесь

person Cadab    schedule 25.02.2015

Чтобы изменить это:

<TextView
    android:text="My text"
    android:background="@drawable/top_bottom_border"/>

Я предпочитаю этот подход в "drawable / top_bottom_border.xml":

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <gradient
                android:angle="270"
                android:startColor="#000"
                android:centerColor="@android:color/transparent"
                android:centerX="0.01" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:angle="90"
                android:startColor="#000"
                android:centerColor="@android:color/transparent"
                android:centerX="0.01" />
        </shape>
    </item>
</layer-list>

Это создает только границы, а не прямоугольник, который будет отображаться, если ваш фон имеет цвет.

person Dinidiniz    schedule 28.03.2016

Самый простой способ добавить границы для вставки границ с помощью InsetDrawable, ниже будет отображаться только верхняя граница:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetBottom="-2dp"
    android:insetLeft="-2dp"
    android:insetRight="-2dp">
    <shape android:shape="rectangle">

        <solid android:color="@color/light_gray" />
        <stroke
            android:width=".5dp"
            android:color="@color/dark_gray" />
    </shape>
</inset>
person Zaid Mirza    schedule 07.10.2018

Сначала создайте файл xml с содержимым, показанным ниже, назовите его border.xml и поместите его в папку макета внутри каталога res.

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="1dp" android:color="#0000" />
    <padding android:left="0dp" android:top="1dp" android:right="0dp"
        android:bottom="1dp" />
</shape>

После этого внутри кода используйте

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

Это сделает черную линию сверху и снизу TextView.

person Nikhil Dinesh    schedule 13.03.2012
comment
Да, это сработает, я проверил. Кнопка button = (Кнопка) findViewById (R.id.button); button.setBackgroundResource (R.layout.border); - person Nikhil Dinesh; 21.05.2012
comment
Я использовал черный цвет в приведенном выше XML-файле, ваш фоновый цвет может быть черным, попробуйте использовать другой цвет. Это определенно будет работать ‹? Xml version = 1.0 encoding = UTF-8?› ‹Shape xmlns: android = schemas.android.com/apk/res/android ›‹ solid android: color = # 474848 / ›‹ stroke android: width = 1dp android: color = # ffff00 / ›‹ padding android: left = 1dp android : top = 1dp android: right = 1dp android: bottom = 1dp / ›‹/shape› - person Nikhil Dinesh; 21.05.2012
comment
У меня не сработало. Граница была нарисована посередине текстового поля - по горизонтали. - person AlikElzin-kilaka; 30.07.2013

Запишите ниже код

<View
    android:layout_width="wrap_content"
    android:layout_height="2dip"
    android:layout_below="@+id/topics_text"
    android:layout_marginTop="7dp"
    android:layout_margin="10dp"
    android:background="#ffffff" />
person Abhi    schedule 17.02.2015

Вот способ добиться этого.

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <shape android:shape="rectangle">
                <stroke
                    android:width="1dp"
                    android:color="@color/grey_coaching_text" />
            </shape>
        </item>

        <item
            android:bottom="1dp"
            android:top="1dp">
            <shape android:shape="rectangle">
                <solid android:color="@color/white" />
            </shape>
        </item>
    </layer-list>

Первый элемент для обводки и второй для сплошного фона. Скрытие левой и правой границ.

person Kavya Shravan    schedule 29.10.2018

Просто добавьте представления вверху и внизу View

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/your_color"
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="@+id/textView"
        app:layout_constraintStart_toStartOf="@+id/textView" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:gravity="center"
        android:text="Testing"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/your_color"
        app:layout_constraintEnd_toEndOf="@+id/textView"
        app:layout_constraintStart_toStartOf="@+id/textView"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

</android.support.constraint.ConstraintLayout>
person Levon Petrosyan    schedule 23.01.2019

Попробуйте обернуть изображение линейной компоновкой и установить для фона цвет границы, который вы хотите вокруг текста. Затем установите отступ в текстовом представлении на толщину, которую вы хотите для границы.

person Matt    schedule 20.03.2011

Вы также можете использовать 9-путь для выполнения своей работы. Создайте его так, чтобы цветной пиксель не умножался по высоте, а только прозрачный пиксель.

person Kowlown    schedule 17.04.2012

Вы можете сделать это с помощью этого фрагмента кода -

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--Minus (-) how much dp you gave in the stroke width from left right-->
    <item android:left="-10dp" android:right="-10dp">
        <shape
            android:shape="rectangle">
            <stroke android:width="10dp" android:color="@android:color/holo_red_dark" />
           <!--This is the main background -->
            <solid android:color="#FFDDDDDD" />
        </shape>
    </item>
</layer-list>

Предварительный просмотр -

введите описание изображения здесь

person Gk Mohammad Emon    schedule 09.03.2021

<TextView
    android:id="@+id/textView3"
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:background="#72cdf4"
    android:text=" aa" />

Просто добавьте этот TextView под текстом, где вы хотите добавить границу

person Aquib Maniyar    schedule 20.06.2013

Просто для обеспечения соблюдения @phreakhead ´s и user1051892 ´s, <item android:bottom|android:left|android:right|android:top> в случае отрицательного результата должно быть больше, чем <stroke android:width>. В противном случае рисование предмета будет смешано с рисованием мазка, и вы можете подумать, что эти значения не работают.

person Garry Dias    schedule 07.09.2018