Есть ли простой способ добавить границу к верхней и нижней части 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?

Ответ 1

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

Создайте xml drawable, например /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 копируется во втором цвете штрихов.

Ответ 2

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

<?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>

Ответ 3

Вариант 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. В основном у вас есть черный квадрат под видом, который вы хотите дать границе, а затем дайте этому виду некоторое дополнение (не margin!), Чтобы черный квадрат показывался по краям.

Очевидно, что это работает только в том случае, если в представлении нет прозрачных областей. Если это так, я бы порекомендовал вам написать пользовательский 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-патч, как показано на рисунке:

6hQyT.png

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

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

Вариант 4: Дополнительные виды

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

<View android:background="#000" android:layout_width="match_parent" android:layout_height="1px"/>

Ответ 4

Чтобы добавить только 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 будет создавать границу с использованием формы прямоугольника, но затем толкает верхнюю, правую и левую стороны за область визуализации для фигуры. Это оставляет видимость нижней границы.

Ответ 5

Итак, я хотел сделать что-то немного другое: только на нижней границе, чтобы имитировать разделитель ListView. Я изменил ответ Piet Delport и получил следующее:

<?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).

Ответ 6

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

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

Создайте xml drawable с именем /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

Ответ 7

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

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

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

Ответ 8

Вы также можете обернуть представление в FrameLayout, а затем установить цвет фона фона и дополнение к тому, что вы хотите; Тем не менее, textview по умолчанию имеет "прозрачный" фон, поэтому вам также нужно будет изменить цвет фона textview.

Ответ 9

Мои ответы основаны на версии @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"

или объединить их в две или более границы:

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

Ответ 10

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

Ответ 11

Сначала создайте 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.

Ответ 12

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

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

<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>

Что дает мне;

enter image description here

Ответ 13

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

<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>

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

Ответ 14

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

<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" />

Ответ 15

InsetDrawable способ добавить границы для вставки границ, используя 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>

Ответ 16

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

Ответ 17

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

Ответ 18

Просто добавьте Просмотров в верхней и нижней части 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>

Ответ 19

// Just simply add border around the image view or view

<ImageView
                android:id="@+id/imageView2"
                android:layout_width="90dp"
                android:layout_height="70dp"
                android:layout_centerVertical="true"
                android:layout_marginRight="10dp"
                android:layout_toLeftOf="@+id/imageView1"
                android:background="@android:color/white"
                android:padding="5dip" />

// After that dynamically put color into your view or image view object

objView.setBackgroundColor(Color.GREEN);

//VinodJ/Abhishek

Ответ 20

<shape xmlns:android="http://schemas.android.com/apk/res/android">

<solid android:color="@color/light_grey1" />
<stroke
    android:width="1dip"
    android:color="@color/light_grey1" />

<corners
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    android:topLeftRadius="5dp"
    android:topRightRadius="5dp" />

    </shape>

Ответ 21

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

    <?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>

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

Ответ 22

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

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

Ответ 23

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