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

Я бы ожидал, что NullReferenceException

Не существует никакой ссылки [null] , поэтому «NullReferenceException» не следует ожидать. Нулевая дататайт не является нулевой ссылкой . Это нулевое значение .

Однако, поскольку ndate равно null, как выполняется вызов свойства, поскольку нет объекта для вызова свойства HasValue?

Вопрос предполагает ложную предпосылку. Есть объект. Существует нулевое значение DateTime, представляющее нулевое значение нулевой DateTime. Это значение является объектом.

Рассмотрим ваш код:

DateTime? ndate = null; 
Console.WriteLine(ndate.HasValue); 

Это всего лишь короткий способ написать то, что логически похоже:

DateTime ndate = default(DateTime); 
bool ndateHasValue = false;
Console.WriteLine(ndateHasValue); 

Тип с нулевым значением - это просто приятный способ написать код, который означает «пожалуйста, приложите булеву к этой вещи, которая отслеживает, является ли она логически нулевой или нет».

377
задан Jonik 23 October 2013 в 13:08
поделиться

22 ответа

В 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 копируется в цвет обводки 2-й фигуры.

401
ответ дан Pi Delport 23 October 2013 в 13:08
поделиться

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

-1
ответ дан Garry Dias 23 October 2013 в 13:08
поделиться

Вот способ достижения этого.

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

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

0
ответ дан Kavya Shravan 23 October 2013 в 13:08
поделиться
<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>
0
ответ дан Vinoj Vetha 23 October 2013 в 13:08
поделиться
// 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
0
ответ дан Vinod Joshi 23 October 2013 в 13:08
поделиться
<TextView
    android:id="@+id/textView3"
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:background="#72cdf4"
    android:text=" aa" />

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

0
ответ дан Aquib Maniyar 23 October 2013 в 13:08
поделиться

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

1
ответ дан Kowlown 23 October 2013 в 13:08
поделиться

Самый простой способ добавить границы для вставки границ, используя 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>
2
ответ дан Zaid Mirza 23 October 2013 в 13:08
поделиться

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

1
ответ дан Matt 23 October 2013 в 13:08
поделиться

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

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

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

4
ответ дан Adeel 23 October 2013 в 13:08
поделиться

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

<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" />
3
ответ дан Adeel 23 October 2013 в 13:08
поделиться

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

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

<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

4
ответ дан Cadab 23 October 2013 в 13:08
поделиться

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

5
ответ дан Nic Hubbard 23 October 2013 в 13:08
поделиться

Мои ответы основаны на версии @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"
7
ответ дан vovahost 23 October 2013 в 13:08
поделиться

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

7
ответ дан okaram 23 October 2013 в 13:08
поделиться

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

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

Вы можете изменить высоту и цвет фона на любое другое.

8
ответ дан MattZ 23 October 2013 в 13:08
поделиться

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

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

Создайте отрисовываемый файл 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 через Зефир

35
ответ дан gregschlom 23 October 2013 в 13:08
поделиться

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

77
ответ дан Tigger 23 October 2013 в 13:08
поделиться

Итак, я хотел сделать что-то немного другое: ТОЛЬКО границу снизу, чтобы имитировать разделитель 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).

35
ответ дан phreakhead 23 October 2013 в 13:08
поделиться

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

4
ответ дан Willi Mentzel 23 October 2013 в 13:08
поделиться

Вариант 1: Shape Drawable

Это самый простой вариант, если вы хотите создать рамку вокруг макета или вида, в котором вы можете установить фон. Создайте файл 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/...". И да, это должно быть 6х6 - я пробовал 5х5, и это не сработало.

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

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

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

<View android:background="#000" android:layout_width="match_parent" android:layout_height="1px"/>
95
ответ дан Pi Delport 23 October 2013 в 13:08
поделиться

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

<?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>
260
ответ дан Tanis.7x 23 October 2013 в 13:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: