ทำไมบรรทัดนี้ xmlns: android =“ http://schemas.android.com/apk/res/android” จะต้องเป็นคนแรกในไฟล์ xml ของเลย์เอาต์?


คำตอบ:


118

ใน XML, xmlns ประกาศ Namespace ที่จริงแล้วเมื่อคุณ:

<LinearLayout android:id>
</LinearLayout>

แทนที่จะเรียกandroid:idใช้ xml จะใช้http://schemas.android.com/apk/res/android:idเพื่อให้มีความเป็นเอกลักษณ์ โดยทั่วไปหน้านี้ไม่มีอยู่ (เป็น URI ไม่ใช่ URL) แต่บางครั้งก็เป็น URL ที่อธิบายเนมสเปซที่ใช้

เนมสเปซมีการใช้งานเหมือนกันกับชื่อแพ็คเกจในแอปพลิเคชัน Java

นี่คือคำอธิบาย

Uniform Resource Identifier (URI)

Uniform Resource Identifier (URI) คือสตริงของอักขระที่ระบุอินเทอร์เน็ตอินเทอร์เน็ต

URI ที่พบบ่อยที่สุดคือ Uniform Resource Locator (URL) ซึ่งระบุที่อยู่โดเมนอินเทอร์เน็ต ประเภทอื่นที่ไม่ใช่ URI ทั่วไปคือ Universal Resource Name (URN)

ในตัวอย่างของเราเราจะใช้ URL เท่านั้น


13
แล้วทำไมเรามีandroid:layout_widthแทนเพียงlayout_width?
Shashwat

4
แล้วทำไมเราถึงใช้ "LinearLayout" แทน "android: LinearLayout"?
นักพัฒนา android

อาจเป็นเพราะ LinearLayout เป็นส่วนหนึ่งของรูทเนมสเปซและแอนดรอยด์: xxx เป็นส่วนหนึ่งของชื่อย่อย (" schemas.android.com/apk/res/android/android/id" )
NitroG42

4
แน่นอนว่าไม่สามารถดึง URL นี้มาได้มันเป็น URI: w3schools.com/xml/xml_namespaces.asp
NitroG42

1
จากdanielmiessler.com/study/url_vs_uri : "URL เป็น URI ประเภทหนึ่งดังนั้นถ้ามีคนบอกคุณว่า URL ไม่ใช่ URI เขาผิด แต่นั่นไม่ได้หมายความว่า URIs ทั้งหมดเป็น URL ผีเสื้อทั้งหมดบิน แต่ ไม่ใช่ทุกอย่างที่บินเป็นผีเสื้อส่วนที่ทำให้ URI URL นั้นคือการรวม "กลไกการเข้าถึง" หรือ "ตำแหน่งเครือข่าย" เช่น http: /, ftp: //, ldap: //, telnet: / /, ฯลฯ
yonivav

37

เพื่อให้เข้าใจว่าทำไมxmlns:android=“http://schemas.android.com/apk/res/android”ต้องเป็นคนแรกในไฟล์ xml เลย์เอาต์เราจะเข้าใจส่วนประกอบโดยใช้ตัวอย่าง

Sample::

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container" >    
</FrameLayout>

ตัวบ่งชี้ทรัพยากรสม่ำเสมอ (URI) :

  • ในการคำนวณตัวบ่งชี้ทรัพยากรที่เหมือนกัน (URI) คือสตริงของอักขระที่ใช้เพื่อระบุชื่อของทรัพยากร
  • การระบุเช่นนี้ช่วยให้มีปฏิสัมพันธ์กับการเป็นตัวแทนของทรัพยากรผ่านเครือข่ายโดยทั่วไปคือเวิลด์ไวด์เว็บโดยใช้โปรโตคอลเฉพาะ

เช่น: http://schemas.android.com/apk/res/android:idคือ URI ที่นี่


XML Namespace :

  • XML เนมสเปซใช้สำหรับจัดเตรียมองค์ประกอบและแอตทริบิวต์ที่มีชื่อไม่ซ้ำกันในเอกสาร XML xmlns:androidอธิบาย android namespace
  • มันใช้เช่นนี้เพราะมันเป็นตัวเลือกการออกแบบโดย Google เพื่อจัดการข้อผิดพลาดในเวลารวบรวม
  • นอกจากนี้สมมติว่าเราเขียนtextviewวิดเจ็ตของเราเองด้วยคุณสมบัติที่แตกต่างเมื่อเทียบกับ android textview, android namespace ช่วยแยกแยะระหว่างtextviewวิดเจ็ตที่กำหนดเองและ android ของเรา textviewวิดเจ็ต

8
คำตอบนี้คุ้มค่าที่จะอ่านจริง ๆ เมื่อเปรียบเทียบกับคำที่กล่าวไว้ข้างต้นซึ่งไม่ได้อธิบายอย่างชัดเจนว่า "ทำไม"
eRaisedToX

คุณกำลังบอกเช่น "การระบุเช่นนี้ช่วยให้มีปฏิสัมพันธ์กับการเป็นตัวแทนของทรัพยากรผ่านเครือข่ายโดยทั่วไปคือเวิลด์ไวด์เว็บโดยใช้โปรโตคอลเฉพาะตัวอย่าง: schemas.android.com/apk/res/android:idคือ URI ที่นี่" - แต่ถ้าฉันไม่มีการเชื่อมต่ออินเทอร์เน็ตพื้นที่ชื่อ android นี้จะโต้ตอบกับทรัพยากรบนเครือข่ายได้อย่างไร
kavie

29

xmlns อ้างถึงXML เนมสเปซ

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

บันทึก : เนมสเปซ URI ไม่ได้ถูกใช้โดยตัวแยกวิเคราะห์เพื่อค้นหาข้อมูล

วัตถุประสงค์คือเพื่อให้เนมสเปซมีชื่อเฉพาะ อย่างไรก็ตามบ่อยครั้งที่ บริษัท ต่างๆใช้เนมสเปซเป็นตัวชี้ไปยังเว็บเพจที่มีข้อมูลเนมสเปซ


7

นี่เป็นเพียงการประกาศชื่อพื้นที่ XML เราใช้ Space Name นี้เพื่อระบุว่าแอตทริบิวต์ที่แสดงด้านล่างเป็นของ Android ดังนั้นพวกเขาจึงเริ่มต้นด้วย " android: "

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

ดังนั้นการประกาศ Space Name นี้จะต้องรวมอยู่ในแท็กเปิดของมุมมองรูทของไฟล์ XML ของคุณ


ง่ายและชัดเจน ฉันไม่รู้เกี่ยวกับคำตอบอื่น ๆ แต่คำตอบของคุณใช้ได้เหมือนแม่เหล็กกับความสับสนและแนวคิดของฉันชัดเจนในขณะนี้
สแต็ค


3
  • Xmlns หมายถึงเนมสเปซ xml
  • มันถูกสร้างขึ้นเพื่อหลีกเลี่ยงการตั้งชื่อความขัดแย้งใน xml ของ
  • เพื่อหลีกเลี่ยงการตั้งชื่อความขัดแย้งด้วยวิธีอื่นเราจำเป็นต้องให้คำนำหน้าแต่ละองค์ประกอบ
  • เพื่อหลีกเลี่ยงการใช้คำนำหน้าซ้ำในแต่ละแท็ก xml เราใช้ xmlns ที่รูทของ xml ดังนั้นเราจึงมีแท็กxmlns: android =” http://schemas.android.com/apk/res/android
  • ตอนนี้androidที่นี่ก็หมายความว่าเรากำลังกำหนด namespace“ http://schemas.android.com/apk/res/android ” ให้กับมัน
  • เนมสเปซนี้ไม่ได้เป็น URL แต่ URI หรือที่เรียกว่า URN (ชื่อทรัพยากรสากล) ซึ่งไม่ค่อยได้ใช้แทน URI
  • เนื่องจาก android นี้จะรับผิดชอบในการระบุองค์ประกอบที่เกี่ยวข้องกับ android ในเอกสาร xml ซึ่งจะเป็น android: xxxxxxx เป็นต้นหากไม่มี namespace android นี้: xxxxxxx จะไม่ได้รับการยอมรับ

ในการใส่คำของคนธรรมดา:

ไม่มี xmlns: android =” http://schemas.android.com/apk/res/android ” แท็กที่เกี่ยวข้องกับ Android จะไม่ถูกจดจำในเอกสาร xml ของเลย์เอาต์ของเรา


2

ใน XML ชื่อองค์ประกอบถูกกำหนดโดยนักพัฒนา ซึ่งมักส่งผลให้เกิดข้อขัดแย้งเมื่อพยายามผสมผสานเอกสาร XML จากแอปพลิเคชัน XML ที่แตกต่างกัน ผู้ใช้หรือแอปพลิเคชัน XML จะไม่ทราบวิธีจัดการความแตกต่างเหล่านี้ ความขัดแย้งของชื่อใน XML สามารถหลีกเลี่ยงได้อย่างง่ายดายโดยใช้คำนำหน้าชื่อ เมื่อใช้ส่วนนำหน้าใน XML จะต้องกำหนดเนมสเปซสำหรับส่วนนำหน้าเนมสเปซสามารถกำหนดได้โดยแอตทริบิวต์ xmlns ในแท็กเริ่มต้นขององค์ประกอบการประกาศเนมสเปซมีไวยากรณ์ต่อไปนี้ xmlns: คำนำหน้า = "URI"


2
xmlns:android="http://schemas.android.com/apk/res/android"

นี่คือรูปแบบของ xmlns: android = "@ + / id" ตอนนี้เพื่ออ้างอิงมันเราใช้เป็นตัวอย่าง

android:layout_width="wrap_content"
android:text="Hello World!"

อีก xmlns คือ

 xmlns:app="http://schemas.android.com/apk/res-auto"

ซึ่งอยู่ในรูปแบบของ xmlns: app = "@ + / id" และการใช้งานจะได้รับด้านล่าง

 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintLeft_toLeftOf="parent"

2

ฉันคิดว่ามันชัดเจนกับ namespace ในขณะที่เราสามารถสร้างคุณลักษณะของเราเองและถ้าผู้ใช้ระบุคุณลักษณะเช่นเดียวกับ Android มันหลีกเลี่ยงความขัดแย้งของ namespace


2

xmlns: androidนี่คือแท็กเริ่มต้นสำหรับกำหนด android namespace ใน Android นี่คือการประชุม standerd ที่กำหนดโดยนักพัฒนา android ของ google เมื่อคุณใช้และเค้าโครงเริ่มต้นหรือ custome แล้วต้องใช้ namespace นี้

กำหนดเนมสเปซ Android ควรตั้งค่าแอตทริบิวต์นี้เป็น " http://schemas.android.com/apk/res/android " เสมอ

จากเอกสารองค์ประกอบ<manifes>


1
xmlns:android="http://schemas.android.com/apk/res/android" 

xmlns : เป็นชื่อพื้นที่ xml และURL: " http://schemas.android.com/apk/res/android " นั้นไม่มีอะไรนอกจาก

XSDซึ่งเป็น [นิยาม XML schema]: ซึ่งใช้กำหนดกฎสำหรับไฟล์ XML

ตัวอย่าง:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" 
android:layout_width="match_parent"
android:layout_height="match_parent">

<EditText
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginBottom="4dp"
   android:hint="User Name"
  />
</LinearLayout> 

ให้ฉันอธิบายว่ากฎประเภทใด .

  1. ในไฟล์ XML ด้านบนเราได้กำหนด layout_width สำหรับเลย์เอาต์ของเราตอนนี้ถ้าคุณจะกำหนดคุณสมบัติเดียวกันเป็นครั้งที่สองคุณจะได้รับข้อผิดพลาด
  2. EditText อยู่ที่นั่น แต่ถ้าคุณต้องการเพิ่ม EditText อื่น ๆ ก็ไม่มีปัญหา

กฎประเภทดังกล่าวมีการกำหนดไว้ใน XML XSD: " http://schemas.android.com/apk/res/android "

สายไปหน่อย แต่ฉันหวังว่านี่จะช่วยคุณได้


0

เป็นการประกาศพื้นที่ชื่อ XML เพื่อระบุว่าแอตทริบิวต์ที่อยู่ในกลุ่มมุมมองที่ชะลอตัวลงนั้นเกี่ยวข้องกับ Android


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