130

Dưới đây là một ví dụ về app namespace mà tôi đã nhìn thấy từ một tập tin res/menu/main.xmlKhông gian tên Android XML 'ứng dụng' là gì?

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

mục đích gì không gian tên app phục vụ? Đó có phải là một 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ừ docs: android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

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

android:showAsAction="never" 

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

Trả lời

164

Không gian tên app không dành riêng cho thư viện, nhưng đượ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ù mã của bạn hoặc thư viện bạn nhập, tạo hiệu quả một không gian tên chung cho thuộc tính tùy chỉnh. được xác định bởi hệ thống android.

Trong trường hợp này, các thư viện appcompat-v7 sử dụng các thuộc tính tùy chỉnh phản ánh android: những namespace để hỗ trợ các phiên bản trước của Android (ví dụ: android:showAsAction chỉ được thêm vào trong 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ấp API mà ứng dụng của bạn thực hiện) - rõ ràng việc sử dụng android:showAsAction sẽ không hoạt động trên các cấp API mà thuộc tính đó không được xác định.

+1

Cảm ơn bạn! Tôi vui mừng cuối cùng đã tìm thấy một đề cập đến điều này trong tài liệu. Tuy nhiên, một câu hỏi tiếp theo. Các tài liệu của thanh tác vụ 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 một không gian tên tùy chỉnh được xác định trong thẻ

. Đ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 công tác Android trên các thiết bị cũ. Vì vậy, bạn phải sử dụng không gian tên của chính bạn làm tiền tố cho tất cả các thuộc tính được định nghĩa bởi thư viện hỗ trợ. " – coder123

+1

Vậy điều gì sẽ xảy ra trên các thiết bị cũ hơn mà các thuộc tính không tồn tại trong khung công tác? Nó chưa rõ ràng với tôi như thế nào xác định một không gian tên tùy chỉnh hoạt động xung quanh thiếu hỗ trợ cho một thuộc tính. Việc khai báo 'showAsAction' trong 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

+3

Thuộc tính không tồn tại được bỏ qua âm thầm. Khi bạn tạo 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 chúng cho các menu xây dựng 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ế bất kỳ nhu cầu nào sử dụng phiên bản 'android:'. – ianhanniballake

Các vấn đề liên quan