Пользовательские кнопки в Android: Как получить границу/край/фрейм, когда я читаю фон из xml?

Используя Android Shapes в xml, я определил градиент, который я использую в качестве фона для кнопки.

Все это работает хорошо, но вокруг кнопки нет края. Я бы хотел, чтобы он выглядел похожим на обычную кнопку Android, но мне нужно больше гибкости для управления цветом и внешним видом.

Форма определяется следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient android:startColor="#FFFFFF" 
        android:endColor="#00FF00"
        android:angle="270" />
    <corners android:radius="3dp" />
    <stroke android:width="5px" color="#000000" />
</shape>

Я бы ожидал, что граница будет установлена ​​в xml. Почему "инсульт" не исправить? Кажется, что инсульт ничего не делает. Я проверил спецификацию Android Developer, но не смог найти ответ там: http://developer.android.com/guide/topics/resources/drawable-resource.html

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

Кто-нибудь может помочь? Я знаю, что есть альтернатива сделать изображение с правильными ребрами и использовать ImageButton, но там действительно должен быть способ исправить это программно.

Спасибо! Анна

Ответ 1

У меня была эта проблема некоторое время назад. Хотя я не совсем помню, почему я принял каждое решение, то, как я решил, это использовать слой-лист. Это позволяет вам складывать одну фигуру поверх другой. Например, следующий XML создает форму с сплошным черным контуром шириной 2 пикселя с градиентом от серого до белого до серого:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <padding android:left="1dp"
                android:top="1dp"
                android:right="1dp"
                android:bottom="1dp"/>
            <solid android:color="#FF000000"/>
            <corners android:radius="3dp"/>
        </shape>
    </item>

    <item>
        <shape>
            <padding android:left="2dp"
                android:top="2dp"
                android:right="2dp"
                android:bottom="2dp"/>
            <gradient android:startColor="#FFB0B0B0"
                android:centerColor="#FFFFFFFF"
                android:endColor="#FFB0B0B0"
                android:angle="315"/>
        </shape>
    </item>
</layer-list>

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

РЕДАКТИРОВАТЬ: Еще одна причина, по которой ваш штрих не может появиться, заключается в том, что вы забыли android: перед битом color = "....".

Ответ 2

У меня была та же проблема, что я заметил, так это то, что удар не применяется к кнопке как границе во время разработки, но во время выполнения я вижу границу.

Я использовал следующий код

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" android:padding="10dp">
    <solid android:color="@color/black" />
    <stroke  android:width="1px" android:color="@color/red" />

</shape>

поскольку steve hanley сказал abvoe, вы пропускаете android: для атрибута цвета.

Надеюсь, это поможет кому-то....

Ответ 3

Вероятно, многое до конца, но вы должны добавить дополнительный ff перед цветом.

<stroke android:width="5px" color="#ff000000" />

здоровается

Ответ 4

Использовать ImageButton

   <ImageButton
        android:layout_width="40dp"
        android:layout_height="30dp"
        android:src="@drawable/left_arrow"
        android:background="@drawable/button_selector"
        android:gravity="center"/>

Используйте назначаемый селектор в ImageButton и определите свои свойства

<item android:state_pressed="true" >
    <shape>
        <gradient
            android:startColor="@color/startColor"
            android:endColor="@color/endColor"
            android:angle="270" />
        <stroke
            android:width="0.5dp"
            android:color="@color/borderColor" />
        <corners
            android:topLeftRadius="5dp"
            android:bottomRightRadius="5dp"/>
    </shape>
</item>

<item android:state_focused="true" >
    <shape>
        <gradient
            android:startColor="@color/startColor"
            android:endColor="@color/endColor"
            android:angle="270" />
        <stroke
            android:width="0.5dp"
            android:color="@color/borderColor" />
        <corners
            android:topLeftRadius="5dp"
            android:bottomRightRadius="5dp"/>
    </shape>
</item>

<item>        
    <shape>
        <gradient
            android:startColor="@color/startColor"
            android:endColor="@color/endColor"
            android:angle="270" />
        <stroke
            android:width="0.5dp"
            android:color="@color/borderColor" />
        <corners
            android:topLeftRadius="5dp"
            android:bottomRightRadius="5dp"/>
    </shape>
</item>    

Ответ 5

<item android:state_enabled="false" android:drawable="@drawable/button_disabled" />

<item android:state_focused="true" android:drawable="@drawable/button_highlighted"/>
<item android:state_pressed="true" android:drawable="@drawable/button_highlighted"/>

<item>
    <shape>
        <gradient android:startColor="#fdfdfd" android:endColor="#f0f0f0" android:angle="270" />
        <stroke android:width="1dp" android:color="#56390a" />
        <corners android:radius="3dp" />
        <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    </shape>
</item>

Добавление stroke color #56390a решит проблему.