Як застосувати форму та селектор одночасно для кнопки?


83

Я застосував фігуру для кнопки, наприклад:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle" >
    <gradient android:startColor="#DD000000" android:endColor="#DD2d2d2d"  android:angle="90"></gradient>
    <corners android:radius="15dip"></corners>

</shape>

Тепер я хочу використовувати селектор типу:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/active"
      android:state_pressed="true" />
<item android:drawable="@drawable/passive"/>

для цієї кнопки. Це можливо ...???

Відповіді:


186

використовуйте цей спосіб:

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

   <item android:state_pressed="true" >
       <shape>.......</shape>
   </item>
   ..........
   ..........
</selector>

8
Так, це працювало, використовуючи: <selector xmlns: android = " schemas.android.com/apk/res/android "> <item android: state_pressed = "true"> <shape android: shape = "прямокутник"> <кути android : radius = "15dip"> </corners> <solid android: color = "# febd26" /> </shape> </item> <item> <shape android: shape = "rectangle"> <gradient android: startColor = "# DD000000" android: endColor = "# DD2d2d2d" android: angle = "90"> </gradient> <кути android: radius = "15dip"> </corners> </shape> </item> </selector>
Khawar Raza

7
@KhawarRaza У майбутньому, будь ласка, вводьте подібну інформацію у своє запитання , де її можна буде відформатувати та знайти легше. Коментарі з часом зникають.
Тім Пост

Я спробував додати елемент фігури всередині елемента item, як ви запропонували, але він просто помиляється із повідомленням, яке не надто допомагає. 09-13 15:25:02.868: ERROR/AndroidRuntime(9129): FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>. Я встановлюю селектор як android:backgroundатрибут RoundedImageView[ github.com/vinc3m1/RoundedImageView#usage] . Хтось має ідеї, як це зробити?
toobsco42

При спробі використовувати цю техніку я постійно отримував повідомлення про помилку. Відповідь AZ_ для мене спрацювала краще.
Алан Нельсон,

@ Алан Нельсон, моя відповідь - просто скелет, тоді як AZ_ подав приклад.
Хенрі

26

Детальна до точної відповіді

Створити кольоровий ресурс в

res / values ​​/ colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>


    <item name="yellow" type="color">#F7B500</item>
    <item name="yellow_dark" type="color">#AC7E00</item>

    <integer-array name="androidcolors">
        <item>@color/yellow</item>
        <item>@color/yellow_dark</item>
    </integer-array>

</resources>

Створіть малювальну сторінку в

res / drawable / bg_yellow_round.xml

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

    <solid android:color="@color/yellow" />

    <stroke
        android:width="2dp"
        android:color="@color/yellow" />

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

</shape>

Створіть інший малювальний файл, який ви хочете перекласти там же, і назвіть його

res / drawable / bg_yellow_dark_round.xml

<solid android:color="@color/yellow_dark" />

<stroke
    android:width="2dp"
    android:color="@color/yellow_dark" />

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

Тепер створіть список станів кольорів за адресою

res / color / btn_selector_yellow.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">

    <item android:drawable="@color/yellow" android:state_focused="true" android:state_pressed="false"/>
    <item android:drawable="@drawable/bg_yellow_dark_round" android:state_pressed="true"/>
    <item android:drawable="@drawable/bg_yellow_round"/>

</selector>

Тепер встановіть для своєї кнопки наступне

<Button
                android:id="@+id/button1"
                android:layout_width="248dp"
                android:layout_height="44dp"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="10dp"
                android:layout_marginTop="20dp"
                android:background="@color/btn_selector_yellow"
                android:text="AZ_ is so cool" />

Тепер це зробить перехід з світло-жовтий

до

темно-жовтий.


Це працює, чи можете ви також допомогти реалізувати його для ефекту брижі?
Hardik9850,


або просто переконайтеся, що є багато google.com/…
AZ_

11

shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/star_off"/>
    <corners android:radius="5dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">

    <item android:drawable="@color/tab_focused" android:state_focused="true" android:state_pressed="false"/>
    <item android:drawable="@color/tab_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/shape"/>

</selector>

1
використовувати @ drawable / shape замість @ drawable / shape.xml
Khizar Hayat

4

Ви також можете створити фігуру, яка використовує селектор всередині. Якщо ваша форма просто змінює свій колір у різних штатах, це набагато чистіше.

color / color_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/blue_dark" android:state_pressed="true" />
    <item android:color="@color/blue_light" />
</selector>

drawable / shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/color_selector" />
    <corners android:bottomLeftRadius="6dip" android:bottomRightRadius="6dp" />
    <padding android:bottom="0dip" android:left="0dip" android:right="0dip" android:top="0dip" />
</shape>

Це не працює для мене, селектор кольору ніколи не використовується ... Хоча я згоден, що він набагато чистіший
Gyome

@Gyome це працює. Дивіться це посилання stackoverflow.com/questions/1219312/android-selector-text-color
Ji Fang

3
Я знаю, що це старе, але лише для запису, цей метод працює лише в Android 5.0 та новіших версіях.
lionscribe

4

Ну, я знаю, що це занадто пізно. Але ось вирішений приклад

 <TextView
            android:id="@+id/txt_out_going_calls"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="04dp"
            android:layout_weight="1"
            android:background="@drawable/header_text_view_selector"
            android:gravity="center"
            android:text="@string/outgoing_calls_tab_button_text"
            android:textColor="@color/home_text_color" />

і мій header_text_view_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">

        <shape xmlns:android="http://schemas.android.com/apk/res/android">
            <solid android:color="@color/home_fragment_tab_color_selected"/>
            <corners android:radius="25dip" />
            <padding android:bottom="08dip" android:left="9dip" android:right="9dip" android:top="08dip" />
        </shape>
    </item>
    <item android:state_selected="false">

        <shape>
            <solid android:color="@color/home_fragment_tab_color_simple"/>
            <corners android:radius="25dip" />
            <padding android:bottom="08dip" android:left="9dip" android:right="9dip" android:top="08dip" />
        </shape>
    </item>
</selector>

Тому в основному я створюю округлий textviewселектор. Тут я обробляю лише state_selectedі not_selected. Сподіваюся, це допоможе


3

Це мій спосіб, і це працює!

<item android:state_pressed="true">

    <shape android:shape="oval">


        <gradient android:centerX=".6"
            android:centerY=".40"
            android:endColor="@color/colorPrimary"
            android:gradientRadius="20"
            android:startColor="@color/colorPrimary"
            android:type="radial" />

        <stroke android:width="1dp"
            android:color="#FFFFFF" />

        <size android:width="55dp"
            android:height="55dp" />

    </shape>
</item>

<item android:state_focused="false">
    <shape android:shape="oval">


        <gradient android:centerX=".6"
            android:centerY=".40"
            android:endColor="@android:color/transparent"
            android:gradientRadius="20"
            android:startColor="@android:color/transparent"
            android:type="radial" />

        <stroke android:width="1dp"
            android:color="#FFFFFF" />

        <size android:width="55dp"
            android:height="55dp" />

    </shape>
</item>


0

Використовуйте назву вашої фігури, як будь-яке зображення, і використовуйте його селектор, як і зображення. Спробуйте, ви не зіткнетеся з жодною проблемою. Це ти просив?


2
помістіть свою форму xml у витяжний файл та передайте її android: drawable = "@ drawable / shape_xml" у вашому селекторі та використовуйте свій селектор у вашому поданні ....
Vineet Shukla

1
Будь ласка, напишіть свій приклад у кращій формі з фрагментом коду.
Рой Лі,

0

Мій приклад - це кнопка кола з state_pressed. код нижче:

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


    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="@color/light_primary_color" />
        </shape>

    </item>
    <item>
        <shape android:shape="oval">
            <solid android:color="@color/accent_color" />
        </shape>
    </item>

</selector>

0

Щоб бути більш багаторазовим, ви можете встановлювати стани для окремих властивостей. Уникайте дублювання фігур

<selector
    xmlns:android="http://schemas.android.com/apk/res/android"
>
    <item>
        <shape android:shape="rectangle" >
            <corners android:radius="5dp"/>
            <solid
                android:state_enabled="false"
                android:color="@color/transparent"
            />
            <solid
                android:state_enabled="true"
                android:color="@color/background"
            />
            <stroke
                android:width="@dimen/dividerHeight"
                android:color="@color/dividerLight"
            />
        </shape>
    </item>
</selector>

За допомогою цього методу мені вдалося програмно встановити фон після відключення.


Здається, це не працює. Я думаю, що селектор повинен мати кілька дочірніх елементів, і стан повинен бути встановлений для кожного елемента.
bmaupin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.