Không gian tên Android XML của 'ứng dụng' là gì?


164

Dưới đây là một ví dụ về appkhông gian tên mà tôi đã thấy từ một res/menu/main.xmltệp

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

Không appgian tên phục vụ mục đích gì? Đây có phải là không gian tên Android "chuẩn" không? Các tùy chọn giá trị giống nhau có sẵn cho cùng một thuộc tính được đặt trong hai không gian tên khác nhau (ví dụ app:showAsActionandroid:showAsAction).

Từ các tài liệu : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

tức là, dòng trong ví dụ trên có nghĩa gì khác nếu thuộc tính thay thế:

android:showAsAction="never"

Có vẻ như nó có thể là một loại cơ chế "phân lớp" nào đó, nhưng tôi dường như không thể tìm thấy bất kỳ tài liệu thực sự nào về appkhông gian tên từ các nguồn Google / Android.

Câu trả lời:


213

Không appgian tên không dành riêng cho thư viện, nhưng nó được sử dụng cho tất cả các thuộc tính được xác định trong ứng dụng của bạn, cho dù theo mã của bạn hoặc bởi các thư viện bạn nhập, tạo một không gian tên toàn cầu duy nhất cho các thuộc tính tùy chỉnh - nghĩa là các thuộc tính không được xác định bởi hệ thống Android .

Trong trường hợp này, appcompat-v7thư viện sử dụng các thuộc tính tùy chỉnh phản chiếu các thuộc tính android:không gian tên để hỗ trợ các phiên bản Android trước đó (ví dụ: android:showAsActionchỉ được thêm vào API11, nhưng app:showAsAction(được cung cấp như một phần của ứng dụng của bạn) hoạt động trên tất cả các cấp API mà ứng dụng của bạn làm) - rõ ràng sử dụng android:showAsActionsẽ không hoạt động ở các cấp API mà thuộc tính đó không được xác định.


1
Cảm ơn bạn! Tôi rất vui vì cuối cùng đã tìm thấy một đề cập về điều này trong tài liệu. Một câu hỏi tiếp theo, mặc dù. Các tài liệu trên thanh hành động trong liên kết của bạn cho biết: "Lưu ý rằng thuộc tính showAsAction ở trên sử dụng không gian tên tùy chỉnh được xác định trong thẻ <menu>. Điều này là cần thiết khi sử dụng bất kỳ thuộc tính XML nào được xác định bởi thư viện hỗ trợ, vì các thuộc tính này không tồn tại trong Khung Android trên các thiết bị cũ hơn. Vì vậy, bạn phải sử dụng không gian tên của riêng mình làm tiền tố cho tất cả các thuộc tính được xác định bởi thư viện hỗ trợ. "
coder123

1
Vậy điều gì xảy ra trên các thiết bị cũ hơn, nơi các thuộc tính không tồn tại trong khung? Tôi vẫn chưa rõ cách xác định không gian tên tùy chỉnh hoạt động xung quanh việc hỗ trợ còn thiếu cho một thuộc tính. Việc khai báo showAsActiondưới một không gian tên tùy chỉnh có nghĩa là nó hoạt động như mong đợi trên các nền tảng mới hơn và bị bỏ qua trên các nền tảng cũ hơn?
coder123

4
Các thuộc tính không tồn tại được âm thầm bỏ qua. Khi bạn tạo một thuộc tính tùy chỉnh, bạn đảm bảo rằng thuộc tính tùy chỉnh sẽ tồn tại trong thời gian chạy (rõ ràng: định nghĩa của nó được bao gồm trong ứng dụng của bạn). Do đó, thư viện hỗ trợ sử dụng các thuộc tính tùy chỉnh để mã tùy chỉnh của họ để xây dựng menu có thể sử dụng một đường dẫn mã duy nhất hoạt động trên tất cả các phiên bản API, về cơ bản thay thế mọi nhu cầu sử dụng các android:phiên bản.
ianhanniballake

2
Tôi xin lỗi nếu tôi không chỉ không nhận được nó. Bạn có thể giúp tôi hiểu cách đơn giản thay đổi không gian tên cung cấp định nghĩa cho một thuộc tính không? Nếu showAsNamethuộc tính không được hỗ trợ trong một thư viện cũ, làm thế nào để sử dụng một tùy chỉnh namespace cho phép nền tảng để biết loạt các lựa chọn có thể giá trị ( ifRoom, never, vv), và biết làm thế nào để giải thích những lựa chọn? Tôi giả sử rằng "các thuộc tính không tồn tại" có nghĩa là các thuộc tính không tồn tại trong thư viện. Trao đổi android:cho app:hầu như không phải là một cách giải quyết hoàn chỉnh. Tui bỏ lỡ điều gì vậy?
coder123

14
Có hai phần với nó: 1) thuộc tính tùy chỉnh ( app:showAsName) và tất cả các giá trị có thể có của nó được bao gồm trong ứng dụng của bạn khi bạn bao gồm appcompat-v7thư viện (định nghĩa nó trong attrs.xmltệp của nó ). 2) Thư viện AppCompat (đặc biệt là ActionMenuView mà được sử dụng tự động khi bạn sử dụng ActionBarActivityphân tích) và sử dụng app:showAsActionđể hiển thị đúng mục trong cùng một cách trên tất cả các cấp độ API. Nó chắc chắn yêu cầu cả XML và mã để làm việc cùng nhau.
ianhanniballake

0

Bạn có thể nhận được một số giải thích từ liên kết này

Không gian tên XML

Khai báo không gian tên Một không gian tên XML được khai báo sử dụng thuộc tính XML dành riêng xmlns hoặc xmlns: tiền tố, giá trị phải là tên không gian tên hợp lệ.

Ví dụ: khai báo sau ánh xạ tiền tố "xhtml:" vào không gian tên XHTML:

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

Bất kỳ thành phần hoặc thuộc tính nào có tên bắt đầu bằng tiền tố "xhtml:" được coi là nằm trong không gian tên XHTML, nếu nó hoặc tổ tiên có khai báo không gian tên ở trên.

Cũng có thể khai báo một không gian tên mặc định. Ví dụ:

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

Trong trường hợp này, bất kỳ phần tử nào không có tiền tố không gian tên được coi là nằm trong không gian tên XHTML, nếu nó hoặc tổ tiên có khai báo không gian tên mặc định ở trên.

Nếu không có khai báo không gian tên mặc định trong phạm vi, tên không gian tên không có giá trị. [6] Trong trường hợp đó, một phần tử không có tiền tố không gian tên rõ ràng được coi là không có trong bất kỳ không gian tên nào.

Các thuộc tính không bao giờ chịu không gian tên mặc định. Một thuộc tính không có tiền tố không gian tên rõ ràng được coi là không có trong bất kỳ không gian tên nào.

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.