“? android: attr / activatedBackgroundIndicator” ทำงานอย่างไร


86

ผมกำลังมองหาวิธีการที่จะเน้นรายการที่เลือกในรายการในขณะที่แสดงแถบการดำเนินการตามบริบทสำหรับการเลือกและวิธีการแก้ปัญหาที่ผมพบคือการตั้งค่าandroid:backgroundแอตทริบิวต์ของ XML "?android:attr/activatedBackgroundIndicator"รูปแบบแถวของฉันไป

การตั้งค่านี้ทำงานอย่างไร

  1. กลไกที่เกี่ยวข้องคืออะไร?
  2. องค์ประกอบไวยากรณ์เช่น "?", "attr", "activatedBackgroundIndicator" หมายความว่าอย่างไร
  3. ความหมายของ "activatedBackgroundIndicator" กำหนดไว้ที่ไหน

คำตอบ:


221

หากคุณอยู่ในอารมณ์ทางนิติวิทยาศาสตร์นี่คือวิธีการขุดและค้นหาว่าเกิดอะไรขึ้น

android:background="?android:attr/activatedBackgroundIndicator"?

โดยสัญชาตญาณหมายถึงการตั้งค่าพื้นหลังเป็นวาดได้

แต่มาย่อยสลายสิ่งนี้เพิ่มเติมเพื่อดูว่าเราไปถึงสิ่งที่วาดได้ลึกลับของเราอย่างไร

จะแม่นยำมันหมายถึง "ตั้งแอตทริบิวต์พื้นหลังเพื่อสิ่งที่แอตทริบิวต์ 'activatedBackgroundIndicator' หมายถึงในรูปแบบปัจจุบัน

หากคุณเข้าใจส่วน "อ้างถึงในธีมปัจจุบัน" แสดงว่าคุณเข้าใจทุกอย่างที่เกิดขึ้นหลังปก

โดยทั่วไปactivatedBackgroundIndicator ไม่ได้เป็น drawable ที่เกิดขึ้นจริง แต่มีการอ้างอิงถึง drawable แอตทริบิวต์ "enableBackgroundIndictor" ถูกกำหนดไว้ที่ไหนจริง ๆ ?

มันกำหนดไว้ในไดเรกทอรี SDK ของคุณในชื่อไฟล์attrs.xml ตัวอย่างเช่น:

path_to_android_sdk / platforms / android-17 / data / res / values ​​/ attrs.xml

หากคุณเปิดไฟล์นั้นคุณจะประกาศดังต่อไปนี้:

<attr name="activatedBackgroundIndicator" format="reference" />

attrs.xml คือที่ที่คุณประกาศแอตทริบิวต์ทั้งหมดที่คุณจะใช้ในมุมมอง xml ของคุณในภายหลัง หมายเหตุเราจะประกาศแอตทริบิวต์และประเภทและไม่จริงการกำหนดค่าที่นี่

ค่าที่แท้จริงที่ได้รับมอบหมายในthemes.xml ไฟล์นี้อยู่ที่:

path_to_android_sdk / platforms / android-17 / data / res / values ​​/ themes.xml

ถ้าคุณเปิดแฟ้มที่คุณจะเห็นคำจำกัดความหลายขึ้นอยู่กับสิ่งที่รูปแบบที่คุณกำลังใช้ ตัวอย่างเช่นต่อไปนี้เป็นคำจำกัดความของชื่อธีม Theme, Theme.Light, Theme.Holo, Theme.Holo.Light ตามลำดับ:

<item name="activatedBackgroundIndicator">@android:drawable/activated_background</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item>

ตอนนี้เรามี drawables ลึกลับของเราแล้ว หากคุณเลือกอันแรกจะถูกกำหนดไว้ในโฟลเดอร์ที่วาดได้ที่:

path_to_android_sdk / platforms / android-17 / data / res / drawable / activated_background.xml

หากคุณเปิดไฟล์นั้นคุณจะเห็นคำจำกัดความของไฟล์ที่ดึงได้ซึ่งมีความสำคัญต่อการทำความเข้าใจว่าเกิดอะไรขึ้น

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" />
    <item android:drawable="@color/transparent" />
</selector>

ที่นี่เรากำลังกำหนด Drawable ที่มีสองสถานะ - สถานะเริ่มต้นเป็นเพียงพื้นหลังโปร่งใสและหากสถานะเป็น "state_activated" สิ่งที่ดึงได้ของเราคือ "list_selector_background_selected"

ดูลิงค์นี้สำหรับข้อมูลพื้นฐานเกี่ยวกับ drawables และ state

"list_selector_background_selected" คือไฟล์ png แพทช์ 9 ไฟล์ที่อยู่ในโฟลเดอร์ drawable-hdpi

ตอนนี้คุณสามารถดูได้แล้วว่าทำไมเราถึงกำหนด activatedBackgroundIndicator เป็นข้อมูลอ้างอิงแทนที่จะเชื่อมโยงโดยตรงกับไฟล์ที่วาดได้ซึ่งจะช่วยให้คุณสามารถเลือกสิ่งที่วาดได้ที่เหมาะสมขึ้นอยู่กับธีมของคุณ


3
คำตอบเดียวที่จะปกครองพวกเขาทั้งหมด โดยพื้นฐานแล้วถ้าใครจะสร้าง XML ด้วยตัวเลือกเดียวกันเขาสามารถสร้าง "activatedBackgroundIndicator" ของตัวเองได้หรือไม่
Gee.E

1
แน่นอน - คุณสามารถกำหนดใหม่ได้ใน theme.xml b / c ที่กำหนดเองของคุณซึ่งเป็นแอตทริบิวต์อ้างอิง
numan salati

คำตอบนี้ช่วยให้ฉันทราบวิธีตั้งค่ารายการดึงที่กำหนดเองในรายการลิ้นชักการนำทางของฉัน
Tastybrownies

นี่เป็นแหล่งข้อมูลที่ยอดเยี่ยมสำหรับการเริ่มทำงานกับselectorงานแบบกำหนดเองโดยใช้ drawables หลังจากอ่านสิ่งนี้ฉันใช้Style Attribute Docsเพื่อเติมเต็มส่วนที่เหลือ
Maurizio

1
คุณสามารถให้ตัวอย่างวิธีการลบล้างตัวบ่งชี้พื้นหลังนี้ได้หรือไม่? ของฉันไม่ทำงาน: / <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: activatedBackgroundIndicator"> @ drawable / activated_background </item> </style> activated_background.xml : <selector xmlns: android = " schemas.android.com/apk/res/android "> <item android: state_activated = "true" android: drawable = "@ color / yellow" /> <item android: drawable = "@ android: color / transparent "/> </selector>
vandus

13

ฉันสงสัยเรื่องนี้เช่นกันในช่วงหนึ่ง ทรัพยากร Android จำนวนมากดูเหมือนจะเป็นกล่องดำและไม่สามารถมองเห็นได้โดยตรง ฉันอาจจะหายไปบางที่ แต่หาไม่เจอในซอร์สโค้ด SDK นี่คือสิ่งที่ฉันรู้

  • android:background จะเบิกได้
  • ไวยากรณ์อยู่ในลักษณะ

    ต้องเป็นการอ้างอิงถึงทรัพยากรอื่นในรูปแบบ "@ [+] [package:] type: name" หรือแอตทริบิวต์ธีมในรูปแบบ "? [package:] [type:] name"

ในกรณีนี้?หมายถึงการมองไปที่รูปแบบในแพคเกจandroidและมันก็เป็นประเภทที่ชื่อเป็นattractivatedBackgroundIndicator

คุณควรจะสามารถเข้าถึงได้ในรหัสหลังด้วยandroid.R.attr.activatedBackgroundIndicatorเช่นกัน

คุณสามารถดูรายการattrคุณสมบัติของ Android ได้ที่R.attr

  • activatedBackgroundIndicator เป็นสิ่งที่วาดได้ใน Android 3.0+ เป็น

    วาดได้ใช้เป็นพื้นหลังสำหรับรายการที่เปิดใช้งาน

โดยพื้นฐานแล้วเป็นเพียงรายการมาตรฐานที่กำหนดไว้ในระบบปฏิบัติการ ฉันไม่พบแหล่งที่มาของ Android แต่นี่คือลิงค์ไปยังเอกสารประกอบ ActivatedBackgroundIndicator


5

นี่คือรูปแบบของการแนบค่าจากธีม ไม่ทราบค่าทางเทคนิคในระหว่างการคอมไพล์รีซอร์สเนื่องจากอาจไม่ทราบค่าธีม ณ จุดนั้น แต่ค่าที่ได้รับการแก้ไขที่รันไทม์ขึ้นอยู่กับรูปแบบที่เกิดขึ้นจริงที่นำมาจาก ContextThemeWrapper(มากที่สุด)

นี่เป็นวิธีการนำคุณค่าทรัพยากรกลับมาใช้ใหม่ ฉันไม่ได้พูดถึงประสิทธิภาพที่ชาญฉลาดที่นี่ แต่เป็นการจัดระเบียบและการบำรุงรักษาที่ชาญฉลาด แอ็ตทริบิวต์ทำหน้าที่เหมือนเป็นตัวแปรโดยมีสัญญาว่าจะเก็บค่าจริงไว้ที่รันไทม์

วิธีนี้ยังช่วยให้สามารถปรับแต่งได้มากขึ้น - แทนที่จะฮาร์ดโค้ดค่าของเช่นพื้นหลังหน้าต่างที่วาดได้มันจะดึงออกมาได้จริงจากธีมโดยให้แอตทริบิวต์ที่เลือกเป็นคีย์ ซึ่งช่วยให้คุณสามารถแทนที่ค่าสำหรับแอตทริบิวต์นั้นได้ คุณเพียงแค่ต้อง:

  1. สร้างธีมของคุณเอง (ซึ่งเป็นเพียงชื่อที่แปลกใหม่สำหรับทรัพยากร "สไตล์") ซึ่งส่วนใหญ่มาจากธีมเริ่มต้นอย่างใดอย่างหนึ่ง
  2. ระบุมูลค่าของคุณเองสำหรับแอตทริบิวต์ที่เป็นปัญหา

แพลตฟอร์มจะใช้ค่าของคุณโดยอัตโนมัติหากคุณได้ระบุธีมของคุณสำหรับกิจกรรมหรือแอปพลิเคชัน คุณทำเช่นนี้ตามที่อธิบายไว้ในคำถาม ไวยากรณ์ทั่วไปของการอ้างอิงรูปแบบแอตทริบิวต์อธิบายไว้ที่นี่: อ้างอิงแอตทริบิวต์สไตล์ คุณจะพบตัวอย่างและรายละเอียดของกลไกทั้งหมดที่นั่น

แก้ไข

สิ่งหนึ่งที่ควรสังเกตคือชื่อแอตทริบิวต์ที่แท้จริงและการมีอยู่ในแพลตฟอร์มเวอร์ชันต่างๆ เป็นเรื่องปกติที่จะมีการนำคุณลักษณะใหม่ ๆ มาใช้ในแพลตฟอร์มเวอร์ชันถัดไปเช่นบางส่วนถูกเพิ่มเข้ามาในเวอร์ชัน 3.0 เพื่อวัตถุประสงค์ในการจัดรูปแบบ ActionBar

คุณควรถือว่าชื่อแอตทริบิวต์เป็นส่วนหนึ่งของ API กล่าวคือเป็นส่วนหนึ่งของสัญญาที่คุณได้รับอนุญาตให้ใช้ สิ่งนี้คล้ายกับคลาสและลายเซ็นของพวกเขามาก - คุณใช้LocationManagerคลาสเพื่อจุดประสงค์ในการได้รับตำแหน่งอุปกรณ์ล่าสุดเนื่องจากคุณทราบจากแหล่งข้อมูลบางส่วน (แบบฝึกหัดการอ้างอิงคำแนะนำอย่างเป็นทางการ ฯลฯ ) จุดประสงค์ของคลาสนี้คืออะไร ในทำนองเดียวกันชื่อแอตทริบิวต์และวัตถุประสงค์ (บางครั้งก็ดีบางครั้งก็น่าสังเวช) กำหนดไว้ในเอกสารของแพลตฟอร์ม Android


2

อัปเดต: มีเวอร์ชันที่ละเอียดมากขึ้นจากคู่มือ API ดังนั้นฉันจึงขอเสนอราคา

ทรัพยากรแอตทริบิวต์สไตล์ช่วยให้คุณสามารถอ้างอิงค่าของแอตทริบิวต์ในธีมที่ใช้ในปัจจุบัน การอ้างอิงแอตทริบิวต์ style ช่วยให้คุณสามารถปรับแต่งรูปลักษณ์ขององค์ประกอบ UI ได้โดยจัดแต่งทรงผมให้ตรงกับรูปแบบมาตรฐานที่ธีมปัจจุบันให้มาแทนการระบุค่าแบบฮาร์ดโค้ด การอ้างอิงแอตทริบิวต์ style โดยพื้นฐานแล้วกล่าวว่า "ใช้สไตล์ที่กำหนดโดยแอตทริบิวต์นี้ในธีมปัจจุบัน"

ในการอ้างอิงแอตทริบิวต์ style ไวยากรณ์ของชื่อเกือบจะเหมือนกับรูปแบบทรัพยากรปกติ แต่แทนที่จะใช้สัญลักษณ์ at (@) ให้ใช้เครื่องหมายคำถาม (?) และส่วนชนิดทรัพยากรเป็นทางเลือก ตัวอย่างเช่น: "

คำตอบเดิม:

Numan salatiให้คำตอบที่สมบูรณ์แบบแล้ว แต่ยังไม่ได้ระบุถึง "?" ไวยากรณ์ นี่คือคำพูดจาก API Guide Accessing Resources

ในการอ้างอิงแอตทริบิวต์ style ไวยากรณ์ของชื่อเกือบจะเหมือนกับรูปแบบทรัพยากรปกติ แต่แทนที่จะใช้สัญลักษณ์ at (@) ให้ใช้เครื่องหมายคำถาม (?) และส่วนชนิดทรัพยากรเป็นทางเลือก ตัวอย่างเช่น:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.