Làm thế nào để áp dụng hình dạng và bộ chọn đồng thời cho Nút?


83

Tôi đã áp dụng hình dạng cho một nút như:

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

Bây giờ tôi muốn sử dụng một bộ chọn như:

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

cho cả Nút này. Có thể ... ???

Câu trả lời:


186

sử dụng theo cách này:

<?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
Có, nó hoạt động bằng cách sử dụng: <selector xmlns: android = " schemas.android.com/apk/res/android "> <item android: state_pressed = "true"> <shape android: shape = " angular "> <angle android : radius = "15dip"> </corners> <solid android: color = "# febd26" /> </shape> </item> <item> <shape android: shape = "chữ nhật"> <gradient android: startColor = "# DD000000" android: endColor = "# DD2d2d2d" android: angle = "90"> </gradient> <angle android: radius = "15dip"> </corners> </shape> </item> </selector>
Khawar Raza

7
@KhawarRaza Trong tương lai, vui lòng đưa thông tin như vậy vào câu hỏi của bạn , nơi nó có thể được định dạng và tìm thấy dễ dàng hơn. Nhận xét có xu hướng biến mất theo thời gian.
Tim Đăng

Tôi đã thử thêm một phần tử hình dạng bên trong phần tử mục như bạn đã đề xuất nhưng nó chỉ xảy ra lỗi với một thông báo không giúp ích được gì nhiều. 09-13 15:25:02.868: ERROR/AndroidRuntime(9129): FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>. Tôi đang đặt bộ chọn làm android:backgroundthuộc tính của RoundedImageView[ github.com/vinc3m1/RoundsImageView#usage] . Có ai có bất kỳ ý tưởng về cách làm điều này?
toobsco42

Khi cố gắng sử dụng kỹ thuật này, tôi liên tục nhận được thông báo lỗi. Câu trả lời của AZ_ làm việc tốt hơn cho tôi.
Alan Nelson

@Alan Nelson, câu trả lời của tôi chỉ là bộ xương, trong khi AZ_ đã đưa ra ví dụ.
Hanry

26

Câu trả lời chi tiết đến từng điểm

Tạo tài nguyên màu trong

res / giá trị / màu sắc.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>

Tạo một cái có thể vẽ tại

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>

Tạo một có thể vẽ khác, bạn muốn chuyển đổi ở cùng một vị trí và đặt tên cho nó

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

Bây giờ, hãy tạo một danh sách trạng thái màu tại

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>

Bây giờ đặt nó thành nút của bạn như sau

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

Bây giờ điều này sẽ thực hiện chuyển đổi từ vàng nhạt

đến

vàng đậm.


Điều này hoạt động, bạn cũng có thể hướng dẫn để thực hiện nó cho hiệu ứng gợn sóng?
Hardik9850


hoặc chỉ thấy cái này có rất nhiều 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
sử dụng @ drawable / hình dạng thay vì @ drawable / shape.xml
Khizar Hayat

4

Bạn cũng có thể tạo một hình dạng bằng cách sử dụng một bộ chọn bên trong. Nếu hình dạng của bạn chỉ thay đổi màu sắc ở các trạng thái khác nhau, điều này sẽ rõ ràng hơn rất nhiều.

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>

Điều này không làm việc cho tôi, bộ chọn về màu sắc là không bao giờ được sử dụng ... Mặc dù tôi đồng ý nó là rất nhiều bụi
Gyome

@Gyome nó đang hoạt động. Xem liên kết này stackoverflow.com/questions/1219312/android-selector-text-color
Ji Fang

3
Tôi biết cách này đã cũ, nhưng chỉ cần lưu ý, phương pháp này chỉ hoạt động trong Android 5.0 trở lên.
lionscribe

4

Tôi biết đã quá muộn Nhưng đây là một ví dụ đã được giải quyết

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

và của tôi 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>

Vì vậy, về cơ bản tôi đang tạo một vòng tròn textviewvới bộ chọn. Ở đây tôi chỉ xử lý state_selectednot_selected. Hy vọng nó giúp


3

Đây là cách của tôi, và nó hoạt động!

<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

Sử dụng tên hình dạng của bạn khi bạn sử dụng bất kỳ hình ảnh nào và sử dụng bộ chọn hình dạng khi bạn sử dụng hình ảnh. Hãy thử bạn sẽ không phải đối mặt với bất kỳ vấn đề. Có phải đó là những gì bạn đã được hỏi?


2
đưa hình dạng xml của bạn trong drawable và vượt qua nó Android: drawable = "@ drawable / shape_xml" trong chọn của bạn và sử dụng chọn của bạn theo quan điểm của bạn ....
Vineet Shukla

1
Vui lòng viết ví dụ của bạn dưới dạng tốt hơn với đoạn mã.
Roy Lee

0

Ví dụ của tôi là một nút vòng tròn với state_pressed. mã dưới đây:

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

Để có thể tái sử dụng nhiều hơn, bạn có thể đặt trạng thái trên các thuộc tính đơn lẻ. Tránh sao chép hình dạng của bạn

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

Tôi đã có thể đặt nền theo chương trình sau khi bị vô hiệu hóa bằng phương pháp này.


Điều này dường như không hoạt động. Tôi nghĩ bộ chọn phải có nhiều mục con và trạng thái phải được đặt trên mỗi mục.
bmaupin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.