Sự khác biệt giữa các tên miền @ id / tên lửa và tên @ + id / tên trong Android


456

Sự khác biệt giữa @id/và là @+id/gì?

Trong @+id/biểu tượng dấu cộng +hướng dẫn tạo tên tài nguyên mới và thêm vào R.javatệp nhưng còn gì @id/? Từ tài liệu về ID: khi tham chiếu tài nguyên Android ID, bạn không cần biểu tượng dấu cộng, mà phải thêm không gian tên gói Android, như vậy:

android:id="@android:id/list"

Nhưng trong hình ảnh bên dưới Eclipse không đề xuất bất kỳ loại nào @android:id/.

Hình ảnh hiển thị đề xuất cho @ / id và @ + / id

Được @id/@android:id/giống nhau?


Từ tài liệu Android: (mất mãi mãi để tìm thấy điều này và tôi đang tìm kiếm một vấn đề không liên quan) developer.android.com/guide/topics/resource/
Kẻ

Câu trả lời:


351

bạn tham khảo Android resources, đã được xác định trong hệ thống Android, @android:id/..trong khi để truy cập các tài nguyên mà bạn đã xác định / tạo trong dự án của mình, bạn sử dụng@id/..

Thêm thông tin

Theo sự làm rõ của bạn trong cuộc trò chuyện, bạn nói rằng bạn có một vấn đề như thế này:

Nếu chúng ta sử dụng android:id="@id/layout_item_id"nó không hoạt động. Thay vào đó @+id/hoạt động như vậy có gì khác biệt ở đây? Và đó là câu hỏi ban đầu của tôi.

Chà, tùy thuộc vào ngữ cảnh, khi bạn sử dụng thuộc tính XML android:id, khi đó bạn chỉ định một id mới và đang hướng dẫn trình phân tích cú pháp (hoặc gọi nó là trình xây dựng) để tạo một mục nhập mới R.java, do đó bạn phải bao gồm một +dấu hiệu.

Trong trường hợp khác, như android:layout_below="@id/myTextView", bạn đang đề cập đến một id đã được tạo, vì vậy trình phân tích cú pháp liên kết này với id đã được tạo trong R.java.

Thêm thông tin nữa

Như bạn đã nói trong cuộc trò chuyện của mình, lưu ý rằng android:layout_below="@id/myTextView"sẽ không nhận ra một phần tử có id myTextViewnếu nó được viết sau phần tử bạn đang sử dụng.


142
Về "Thông tin thêm một lần nữa": Bạn có thể xác định vị trí với android:layout_below="@+id/myTextView"và THEN xác định chính phần tử đó với android:id="@id/myTextView".
caw

1
@MarcoW Điều đó đã giúp tôi rất nhiều. Tôi đã gặp khó khăn khi tìm giải pháp cho vấn đề này (hay đúng hơn là xây dựng mục tìm kiếm phù hợp). Tôi đoán nó có thể xứng đáng với một câu hỏi + câu trả lời của riêng nó.
David Miler

Cảm ơn bạn! Tôi đã có cùng một vấn đề, và tài liệu không nói nhiều về chủ đề này. Nhưng điều đó là hiển nhiên: Vấn đề chúng tôi gặp ở đây không phải là vấn đề thường xuyên ...
caw

7
Tôi luôn sử dụng @ + id / at android: id và android: layout_below, đó có phải là vấn đề không?
melanke

4
@melanke: Đưa +vào layout_belowcũng như android:idthực sự tốt, vì The '+' means to create the symbol if it doesn't already existnhư Tanmay Mandal đã đề cập trong câu trả lời tốt đẹp (chưa được đánh giá cao) của mình. Do đó, cũng không có hiệu ứng thời gian chạy tiêu cực (có thể là sự gia tăng nhỏ không thể đo được trong thời gian biên dịch mặc dù vậy ^^).
Levite

86

dấu + là một cách rút gọn để thêm id vào danh sách id tài nguyên của bạn. Nếu không, bạn cần phải có chúng trong một tệp xml như thế này

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>

1
@schwiz: Và làm thế nào chúng ta có thể sử dụng nó trong bố trí của chúng tôi?
Vikas Patidar

7
hãy tưởng tượng bạn có tệp tài nguyên mà tôi đã xác định trong câu trả lời của tôi, sau đó trong bố cục của bạn, bạn có thể có <View android:id="@id/my_logo"/> Nếu bạn không có tệp tài nguyên tôi đã xác định ở trên thì bạn sẽ cần phải làm như <View android:id="@+id/my_logo"/> ghi chú: bạn chỉ cần thực hiện + id một lần do đó, nếu trong tệp bố cục khác, bạn đã thực hiện <Xem android: id = "+ id / my_logo" /> bạn sẽ không cần đưa ký tự '+' vào lần tiếp theo bạn sử dụng cùng một id trong bố cục.
Nathan Schwermann

@schwiz: Được rồi, điều đó hữu ích nhưng chúng ta phải đặt tập tin đó ở đâu res/drawable/hoặc res/layout/hoặc res/values/tên của tập tin đó sẽ ở đâu? Nếu bạn có bất kỳ liên kết hữu ích liên quan đến điều này thì xin vui lòng gửi ở đây.
Vikas Patidar

1
Dưới đây là tất cả mọi thứ bạn cần biết về quy ước đặt tên, vv cho tài nguyên của bạn. Bạn sẽ đặt tệp vào res / value / và quy ước là đặt tên cho id nhưng bạn có thể gọi nó là bất cứ thứ gì bạn muốn. developer.android.com/guide/topics/resource/ từ
Nathan Schwermann

46

Đôi khi bạn thấy các tài liệu tham khảo trong các tệp bố cục của mình như:

<listview id="@+id/android:list">

<listview id="@android:id/list">

Có gì khác biệt?

.. Tôi rất vui vì bạn đã hỏi

@+id/foocó nghĩa là bạn đang tạo một id có tên foo trong không gian tên của ứng dụng của bạn. Bạn có thể tham khảo nó bằng cách sử dụng @id/foo. @android:id/foocó nghĩa là bạn đang đề cập đến một id được xác định trong không gian tên android.

'+' Có nghĩa là tạo biểu tượng nếu nó không tồn tại. Bạn không cần nó (và không nên sử dụng nó) khi tham khảo android: các biểu tượng, bởi vì chúng đã được xác định cho bạn bởi nền tảng và dù sao bạn cũng không thể tạo riêng cho mình trong không gian tên đó.

Không gian tên này là không gian tên của khung. ví dụ: bạn cần sử dụng @android:id/listvì đây là id mà khung mong muốn tìm thấy .. (khung chỉ biết về các id trong không gian tên android.)

Hoàn toàn sao chép từ nguồn này


6
Ôi trời !! Hoàn thành CTRL + C rồi CTRL + V. rất vui vì bạn đã đặt một tài liệu tham khảo cho bài viết gốc quá. Có phải đó là blog của bạn?
Aman Alam

nếu tôi đã khai báo trong layout thứ 1 @ + id / mybutton của loại Nút, vì vậy không cần tạo phiên bản mới của if trong bố cục thứ 2 chỉ được sử dụng như @ id / mybutton. đúng không ?
Hiren Dabhi

39

Nói ngắn gọn

android:id="@+id/my_button"

Dấu + id Plus cho android thêm hoặc tạo id mới trong Tài nguyên.

trong khi

android:layout_below="@id/my_button"

nó chỉ giúp giới thiệu id đã được tạo ..


9

Dấu cộng ( +) trước loại tài nguyên chỉ cần thiết khi bạn xác định ID tài nguyên lần đầu tiên. Khi bạn biên dịch ứng dụng, các công cụ SDK sử dụng tên ID để tạo ID tài nguyên mới trong R.javatệp dự án của bạn đề cập đến EditTextphần tử. Với ID tài nguyên được khai báo một lần theo cách này, các tham chiếu khác đến ID không cần dấu cộng. Sử dụng dấu cộng chỉ cần thiết khi chỉ định ID tài nguyên mới và không cần thiết cho các tài nguyên cụ thể như chuỗi hoặc bố cục. Xem sidebox để biết thêm thông tin về các đối tượng tài nguyên.

Từ: https://developer.android.com/training/basics/firstapp/building-ui.html



6

Từ Hướng dẫn dành cho nhà phát triển :

android:id="@+id/my_button"

Ký hiệu at ( @ở đầu chuỗi cho biết trình phân tích cú pháp XML sẽ phân tích cú pháp và mở rộng phần còn lại của chuỗi ID và xác định nó là tài nguyên ID. Ký hiệu dấu cộng ( +) có nghĩa là đây là tên tài nguyên mới phải được tạo và thêm vào tài nguyên của chúng tôi (trong R.javatệp). Có một số tài nguyên ID khác được cung cấp bởi khung Android. Khi tham chiếu ID tài nguyên Android, bạn không cần biểu tượng dấu cộng mà phải thêm androidkhông gian tên gói, như vậy:

android:id="@android:id/empty"


4

Có một lỗi với Eclipse khi đôi khi bạn vừa tạo mới @+id/.., nó sẽ không được thêm ngay vào tệp R.java, ngay cả sau khi xây dựng sạch dự án. Giải pháp là khởi động lại Eclipse.

Điều này tôi nghĩ nên được giải quyết càng sớm càng tốt, bởi vì nó có thể (và từ kinh nghiệm, sẽ) khiến một số nhà phát triển nhầm lẫn rằng họ có lỗi với cú pháp của họ và cố gắng gỡ lỗi ngay cả khi thực sự không có gì để gỡ lỗi.


3
Một trong những lý do khiến tôi chuyển sang Android Studio và không bao giờ nhìn lại :) (Tôi biết nó vẫn chưa có tại thời điểm bạn viết câu trả lời của bạn)
Konrad Morawski

4

Android sử dụng một số tệp được gọi là tài nguyên nơi các giá trị được lưu trữ cho các tệp XML.

Bây giờ khi bạn sử dụng @ id / cho một đối tượng XML, nó đang cố gắng tham chiếu đến một id đã được đăng ký trong các tệp giá trị. Mặt khác, khi bạn sử dụng @ + id / nó đăng ký một id mới trong các tệp giá trị được ngụ ý bởi biểu tượng '+'.

Hi vọng điêu nay co ich :).


4

@id/@android:id/không giống nhau

@id/ID tham chiếu trong ứng dụng của bạn, @android:id/tham chiếu một mục trong nền tảng Android.

Nhật thực sai.


Yor đang nói rằng @id/ referencing ID in your applicationNhưng eclise đưa ra Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')khi chúng ta sử dụng nó để chỉ tài nguyên ứng dụng. Vì vậy, sự khác biệt giữa @id/@+id/? Làm thế nào bạn có thể nói nhật thực là sai?
Vikas Patidar

1
Eclipse là sai trong trường hợp không hiển thị cho bạn một đề xuất @android: id. Và bạn đã sai, nếu bạn đang sử dụng @ id / myId mà không khai báo nó với @ + id / myId ở đâu đó. Tất cả @ id / xxx phải được khai báo ở đâu đó trong ứng dụng của bạn bằng cách sử dụng @ + id / xxx.
Olegas

Cảm ơn bạn đã làm rõ. Tôi nghĩ ở đây nhật thực không sai thay vào đó nó hiển thị gợi ý dựa trên bối cảnh các yếu tố bố cục của chúng tôi. Như nó @id/chỉ hiển thị trong trường hợpRelativeLayout
Vikas Patidar

2

Sự khác biệt giữa @+id@idlà:

  • @+idđược sử dụng để tạo id cho chế độ xem trong R.javatệp.
  • @id được sử dụng để tham chiếu id được tạo cho chế độ xem trong tệp R.java.

Chúng tôi sử dụng @+idvới android:id="", nhưng nếu id không được tạo và chúng tôi sẽ tham chiếu nó trước khi được tạo (Chuyển tiếp tham chiếu).

Trong trường hợp đó, chúng tôi đã sử dụng @+idđể tạo id và trong khi xác định chế độ xem, chúng tôi phải tham chiếu nó.

Vui lòng tham khảo mã dưới đây:

<RelativeLayout>

     <TextView
        android:id="@+id/dates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/spinner" />

   <Spinner
     android:id="@id/spinner"
     android:layout_width="96dp"
     android:layout_height="wrap_content"
     android:layout_below="@id/dates"
     android:layout_alignParentRight="true" />

</RelativeLayout>

Trong đoạn mã trên, id cho Spinner @+id/spinnerđược tạo ở chế độ xem khác và trong khi xác định spinner chúng ta đang đề cập đến id được tạo ở trên.

Vì vậy, chúng ta phải tạo id nếu chúng ta đang sử dụng chế độ xem trước khi chế độ xem được tạo.


1

Sự khác biệt giữa “@+id/”“@id/”trong Android

Cái đầu tiên được sử dụng để tạo IDthành phần ui cụ thể và cái khác được sử dụng để chỉ thành phần cụ thể


1

Nếu mục xem thực hiện các hoạt động tương tự, bạn có thể sử dụng @+idcho mỗi mục trong bất kỳ cách bố trí bởi vì trong việc biên soạn nhiều @+id/foocác R.javatập tin chỉ tạo ra một kiểu liệt kê. Vì vậy, ví dụ, nếu tôi có một nút lưu trên mỗi trang thực hiện cùng một thao tác, tôi sử dụng android:id="@+id/button_save"trong mỗi bố cục. Tệp R.java chỉ có một mục nhập cho button_save.

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.