Ai đó có thể giải thích attr?


89

Tôi đang xem mã mẫu Thư viện tổ ong ( tại đây ) và tôi đã xem qua mã sau khi cố gắng thêm các mục hành động trong ứng dụng của riêng mình:

<item android:id="@+id/camera"
    android:title="Camera"
    android:icon="?attr/menuIconCamera"
    android:showAsAction="ifRoom" />

Tôi ?attrđang ném cho tôi một vòng lặp. Ai đó có thể vui lòng giải thích điều này đang làm gì không? Làm thế nào điều này có liên quan đến một có thể vẽ? Tôi dường như không thể tìm thấy bất kỳ thông tin tốt nào trên Google. Ngoài ra, có danh sách hoặc thư viện các thuộc tính mà chúng ta có thể sử dụng cho các biểu tượng thay vì chỉ menuIconCamera?

Cảm ơn

Chỉnh sửa: Tôi đã xem xét thêm xung quanh và thấy rằng attrs.xml trông như thế này:

<resources>
<declare-styleable name="AppTheme">
    <attr name="listDragShadowBackground" format="reference" />
    <attr name="menuIconCamera" format="reference" />
    <attr name="menuIconToggle" format="reference" />
    <attr name="menuIconShare" format="reference" />
</declare-styleable>

Thật không may, điều đó chỉ làm cho tôi càng khó hiểu hơn. Cái này đang làm gì vậy?

Câu trả lời:


64

Các ?attr/menuIconCameraphương tiện giá trị mà một biểu tượng từ menuIconCamerathuộc tính của chủ đề hiện tại sẽ được sử dụng.

Phải có một drawable được gán cho menuIconCamerathuộc tính ở đâu đó trong themes.xmltệp. Nếu có hai chủ đề có các giá trị khác nhau của thuộc tính này thì biểu tượng thực tế sẽ phụ thuộc vào chủ đề hiện đang được sử dụng.

Các attrs.xmltập tin được sử dụng để xác định thuộc tính tùy chỉnh. Nếu không có định nghĩa này, trình biên dịch sẽ coi các thuộc tính không xác định là sai.


1
bạn nói đúng, <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </item>, Cảm ơn bạn rất nhiều. Tôi thấy rằng ic_menu_camera_holo_light là một bản vẽ cục bộ. 3.x không có các biểu tượng công cộng được tích hợp sẵn như 2.x đã có?
FuegoFingers

Tôi không nghĩ bằng cách nào đó nó được kết nối với phiên bản Android. Đây chỉ là một cách làm cho các thuộc tính phụ thuộc vào một chủ đề đã chọn.
Michael

51

Các ?attr:cú pháp được sử dụng để truy cập vào các thuộc tính của chủ đề hiện tại. Xem các thuộc tính kiểu tham chiếu .


3
Liên kết được cung cấp rất, rất hữu ích. Cảm ơn!
sven

3
Rất hữu ích, nhưng bạn vẫn nên đăng các phần chính của liên kết đó.
gustavohenke

1
Đây là phần hữu ích nhất của bài viết được liên kết: 'Tài nguyên thuộc tính kiểu cho phép bạn tham chiếu giá trị của thuộc tính trong chủ đề hiện đang được áp dụng. Tham chiếu thuộc tính kiểu cho phép bạn tùy chỉnh giao diện của các phần tử giao diện người dùng bằng cách tạo kiểu cho chúng để phù hợp với các biến thể tiêu chuẩn được cung cấp bởi chủ đề hiện tại, thay vì cung cấp một giá trị được mã hóa cứng. Tham khảo một thuộc tính phong cách chủ yếu nói, "sử dụng phong cách mà được xác định bởi thuộc tính này, trong chủ đề hiện tại."'
bigtex777

24

Tôi biết bài viết này rất cũ, nhưng tôi cảm thấy lời giải thích sau đây sẽ giúp người mới bắt đầu hiểu nó một cách dễ dàng.

Vì vậy, trong điều kiện của giáo dân,

someAttribute="?attr/attributeName" có nghĩa -

thiết lập giá trị của someAttribute để bất cứ điều gì là giá trị của AttributeName trong chủ đề hiện tại

Một ví dụ phổ biến xảy ra khi tạo kiểu cho Thanh công cụ

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/primary_color</item>
       //some more stuff here
</style>
<!-- custom toolbar style -->
<style name="myToolbar" parent="Widget.AppCompat.Toolbar">
      <item name="android:background">?attr/colorPrimary</item>
     //some code here
</style>

Ở đây giá trị của android:backgroundsẽ được đặt thành @color/primary_color?attr/colorPrimaryđề cập đến @color/primary_colortrong chủ đề hiện tại (AppTheme)


16

Tiếng Anh của tôi không tốt, xin lỗi. Nhưng tôi biết câu hỏi này

android:icon="?attr/menuIconCamera" muốn sử dụng

attrs.xml

<resources>
    <declare-styleable name="AppTheme">
        <attr name="listDragShadowBackground" format="reference" />
        <attr name="menuIconCamera" format="reference" />
        <attr name="menuIconToggle" format="reference" />
        <attr name="menuIconShare" format="reference" />
    </declare-styleable>
</resources>

styles.xml

<style name="AppTheme.Light" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarStyle">@style/ActionBar.Light</item>
        <item name="android:windowActionBarOverlay">true</item>
        <item name="listDragShadowBackground">@android:color/background_light</item>
        <item name="menuIconCamera">@drawable/ic_menu_camera_holo_light</item> //this....
        <item name="menuIconToggle">@drawable/ic_menu_toggle_holo_light</item>
        <item name="menuIconShare">@drawable/ic_menu_share_holo_light</item>
    </style>

sử dụng @drawable/ic_menu_camera_holo_light


4

Điều này dành cho các Thuộc tính kiểu giới thiệu. xem R.attr

?[<package_name>:][<resource_type>/]<resource_name>

Tham chiếu các thuộc tính kiểu


3
Một điều dường như không được ghi lại ở bất kỳ đâu là '<package_name>' là tên gói đầy đủ của bất kỳ tài nguyên nào được khai báo. Cụ thể hơn, nó không phải là tiền tố không gian tên XML, mặc dù cú pháp có thể gợi ý điều đó. Ví dụ: để tham chiếu đến một tập tin được khai báo bởi thư viện appcompat, hãy sử dụng android.support.v7.appcompat:.
Dừng làm tổn hại đến cộng đồng

4

Bài đăng trên blog này thực hiện một công việc tuyệt vời về cách tham chiếu các giá trị cho các thuộc tính kiểu được xác định trong chủ đề hiện tại: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • Khi bạn nhìn thấy ?ký hiệu - điều đó có nghĩa là chúng tôi đang cố gắng tham chiếu một thuộc tính kiểu - một giá trị có thể thay đổi tùy thuộc vào chủ đề hiện tại. Trong mỗi chủ đề cụ thể, chúng ta có thể ghi đè thuộc tính này, vì vậy bố cục XML không cần phải thay đổi và chủ đề chính xác cần được áp dụng.

  • Khi bạn nhìn thấy @ký hiệu - chúng tôi tham chiếu giá trị tài nguyên thực tế (màu, chuỗi, kích thước, v.v.). Tài nguyên này phải có giá trị thực tế. Trong trường hợp này, chúng tôi biết chính xác giá trị mà chúng tôi đang xử lý.

Đây là một ví dụ:

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="LauncherButton" parent="TextAppearance.AppCompat.Medium">
        <item name="android:textColor">?colorAccent</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_centerHorizontal">true</item>
        <item name="android:textAllCaps">false</item>
    </style>
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.