เนมสเปซ 'Android' ใน Android XML คืออะไร


164

นี่คือตัวอย่างของappเนมสเปซที่ฉันเห็นจากres/menu/main.xmlไฟล์

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >
<item android:id="@+id/action_settings"
    android:title="@string/action_settings"
    android:orderInCategory="100"
    app:showAsAction="never" />
</menu>

appเนมสเปซมีจุดประสงค์อะไร เป็นเนมสเปซ Android มาตรฐาน "มาตรฐาน" หรือไม่ เป็นตัวเลือกค่าเดียวกันสำหรับแอตทริบิวต์เดียวกันที่อยู่ในเนมสเปซที่แตกต่างกันสองรายการ (เช่นapp:showAsActionและandroid:showAsAction)

จากเอกสาร : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

นั่นคือบรรทัดในตัวอย่างด้านบนจะมีความหมายอย่างอื่นหากแอตทริบิวต์เป็นแทน:

android:showAsAction="never"

ดูเหมือนว่ามันอาจเป็นกลไก "subclassing" แต่ฉันไม่สามารถหาเอกสารจริงในappnamespace จาก Google / Android ได้

คำตอบ:


213

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

ในกรณีนี้appcompat-v7ไลบรารีใช้แอตทริบิวต์ที่กำหนดเองทำมิเรอร์android:เนมสเปซเพื่อรองรับ Android เวอร์ชันก่อนหน้า (ตัวอย่างเช่น: android:showAsActionถูกเพิ่มใน API11 เท่านั้น แต่app:showAsAction(ให้เป็นส่วนหนึ่งของแอปพลิเคชันของคุณ) จะทำงานในระดับ API ทั้งหมดที่แอปของคุณทำ) การใช้android:showAsActionระดับ API จะไม่สามารถทำได้หากไม่มีการกำหนดแอตทริบิวต์นั้น


1
ขอบคุณ! ในที่สุดฉันก็ดีใจที่ได้พบการกล่าวถึงนี้ในเอกสารประกอบ หนึ่งคำถามติดตามแม้ว่า เอกสารแถบการกระทำในลิงก์ของคุณบอกว่า: "โปรดสังเกตว่าแอตทริบิวต์ showAsAction ด้านบนใช้เนมสเปซที่กำหนดเองที่กำหนดไว้ในแท็ก <menu> สิ่งนี้จำเป็นเมื่อใช้แอตทริบิวต์ XML ที่กำหนดโดยห้องสมุดสนับสนุนเนื่องจากไม่มีแอตทริบิวต์เหล่านี้ใน เฟรมเวิร์ก Android บนอุปกรณ์รุ่นเก่าดังนั้นคุณต้องใช้เนมสเปซของคุณเองเป็นส่วนนำหน้าสำหรับแอตทริบิวต์ทั้งหมดที่กำหนดโดยห้องสมุดสนับสนุน "
coder123

1
ดังนั้นจะเกิดอะไรขึ้นกับอุปกรณ์รุ่นเก่าที่ไม่มีคุณสมบัติในกรอบ? ยังไม่เป็นที่ชัดเจนสำหรับฉันว่าการกำหนดเนมสเปซที่กำหนดเองทำงานอย่างไรหากไม่มีการสนับสนุนแอตทริบิวต์ การประกาศshowAsActionภายใต้เนมสเปซที่กำหนดเองหมายความว่าทำงานได้ตามที่คาดหวังบนแพลตฟอร์มใหม่และไม่สนใจกับรุ่นเก่ากว่าหรือไม่
coder123

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

2
ฉันขอโทษถ้าฉันไม่เพียง แต่ไม่ได้รับมัน คุณช่วยฉันเข้าใจไหมว่าการเปลี่ยนเนมสเปซนั้นให้คำจำกัดความของแอตทริบิวต์ได้อย่างไร ถ้าshowAsNameแอตทริบิวต์ไม่สนับสนุนในห้องสมุดเก่าวิธีการที่ไม่ใช้กำหนดเอง namespace ที่ช่วยให้แพลตฟอร์มที่จะรู้ว่าช่วงของตัวเลือกค่าได้ (คนifRoom, neverฯลฯ ) และรู้วิธีการตีความตัวเลือกเหล่านั้นหรือไม่ ฉันสมมติว่า "คุณสมบัติที่ไม่มี" หมายถึงคุณลักษณะที่ไม่มีการใช้งานในห้องสมุด การแลกเปลี่ยนandroid:เพื่อapp:ดูเหมือนจะไม่ได้ผลอย่างสมบูรณ์ ฉันพลาดอะไรไปรึเปล่า?
coder123

14
มีสองส่วนคือ 1) แอตทริบิวต์ที่กำหนดเอง ( app:showAsName) และค่าที่เป็นไปได้ทั้งหมดจะรวมอยู่ในแอปของคุณเมื่อคุณรวมappcompat-v7ไลบรารี (ซึ่งกำหนดไว้ในattrs.xmlไฟล์) 2) ไลบรารี AppCompat (โดยเฉพาะคือActionMenuViewซึ่งจะถูกใช้โดยอัตโนมัติเมื่อคุณใช้ActionBarActivity) แยกวิเคราะห์และใช้app:showAsActionเพื่อแสดงรายการอย่างถูกต้องในแบบเดียวกันในทุกระดับ API แน่นอนว่าต้องใช้ทั้ง XML และรหัสเพื่อทำงานร่วมกัน
ianhanniballake

0

คุณสามารถขอคำอธิบายได้จากลิงค์นี้

XML เนมสเปซ

การประกาศเนมสเปซประกาศเนมสเปซ XML โดยใช้แอตทริบิวต์ XML ที่สงวนไว้ xmlns หรือ xmlns: คำนำหน้าค่าที่ต้องเป็นชื่อเนมสเปซที่ถูกต้อง

ตัวอย่างเช่นการประกาศต่อไปนี้แมปคำนำหน้า "xhtml:" กับเนมสเปซ XHTML:

xmlns: XHTML = "http://www.w3.org/1999/xhtml"

องค์ประกอบหรือคุณลักษณะใด ๆ ที่ชื่อขึ้นต้นด้วยคำนำหน้า "xhtml:" จะถือว่าอยู่ในเนมสเปซ XHTML ถ้ามันหรือบรรพบุรุษมีการประกาศเนมสเปซข้างต้น

นอกจากนี้ยังเป็นไปได้ที่จะประกาศ namespace เริ่มต้น ตัวอย่างเช่น:

xmlns = "http://www.w3.org/1999/xhtml"

ในกรณีนี้องค์ประกอบใด ๆ ที่ไม่มีคำนำหน้าเนมสเปซจะถือว่าอยู่ในเนมสเปซ XHTML ถ้ามันหรือบรรพบุรุษมีการประกาศเนมสเปซเริ่มต้นด้านบน

หากไม่มีการประกาศเนมสเปซเริ่มต้นในขอบเขตชื่อเนมสเปซจะไม่มีค่า [6] ในกรณีนั้นองค์ประกอบที่ไม่มีคำนำหน้าเนมสเปซที่ชัดเจนจะถือว่าไม่อยู่ในเนมสเปซใด ๆ

คุณสมบัติไม่เคยอยู่ภายใต้ namespace เริ่มต้น แอ็ตทริบิวต์ที่ไม่มีคำนำหน้าเนมสเปซที่ชัดเจนจะถูกพิจารณาว่าไม่อยู่ในเนมสเปซใด ๆ

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