id
Tổng quan về Android
Android id
là một số nguyên thường được sử dụng để xác định chế độ xem; điều này id
có thể được chỉ định thông qua XML (khi có thể) và thông qua mã (theo chương trình.) Điều id
này hữu ích nhất để có được các tham chiếu cho các định nghĩa XML được View
tạo bởi một Inflater
(chẳng hạn như bằng cách sử dụng setContentView
.)
Chỉ định id
quaXML
- Thêm một thuộc tính của
android:id="@+id/
somename "
vào quan điểm của bạn.
- Khi ứng dụng của bạn được xây dựng,
android:id
sẽ được chỉ định một mã duy nhất int
để sử dụng trong mã.
- Tham khảo của bạn
android:id
's int
giá trị trong mã sử dụng ' R.id.
somename'(một cách hiệu quả là một hằng số.)
- điều này
int
có thể thay đổi từ bản dựng sang bản dựng để không bao giờ sao chép id từ gen/
gói.name / R.java
, chỉ cần sử dụng " R.id.
somename".
- (Ngoài ra, một
id
gán cho một Preference
trong XML không được sử dụng khi Preference
tạo nó View
.)
Gán id
qua mã (lập trình)
- Đặt thủ công
id
s bằng cách sử dụng someView.setId(
int);
- Điều này
int
phải là tích cực, nhưng nếu không thì tùy ý - nó có thể là bất cứ điều gì bạn muốn (tiếp tục đọc nếu điều này là đáng sợ.)
- Ví dụ: nếu tạo và đánh số một số lượt xem đại diện cho các mục, bạn có thể sử dụng số mục của chúng.
Tính độc đáo của id
s
XML
id
s được gán sẽ là duy nhất.
- Mã giao
id
s làm không phải là duy nhất
- Mã giao
id
s lon (theo lý thuyết) mâu thuẫn với XML
-assigned id
s.
- Những mâu thuẫn
id
này sẽ không thành vấn đề nếu được truy vấn chính xác (tiếp tục đọc) .
Khi nào (và tại sao) xung đột id
không quan trọng
findViewById(int)
sẽ lặp lại theo chiều sâu đệ quy đầu tiên thông qua hệ thống phân cấp chế độ xem từ Chế độ xem bạn chỉ định và trả về kết quả đầu tiên View
tìm thấy với kết quả khớp id
.
- Miễn là không có mã được gán mã nào được
id
gán trước một định nghĩa XML id
trong cấu trúc phân cấp, findViewById(R.id.somename)
sẽ luôn trả về Chế độ xem do XML xác định id
.
Tự động tạo chế độ xem và chỉ định ID
s
Nếu bạn chọn giữ các tham chiếu cho các quan điểm của mình xung quanh , hãy chắc chắn khởi tạo chúng với getApplicationContext()
và đảm bảo đặt từng tham chiếu thành null onDestroy
. Rõ ràng rò rỉ các Activity
(treo vào nó sau khi được bị phá hủy) là lãng phí .. :)
Dự trữ một XML android:id
để sử dụng trong mã
API 17 được giới thiệu View.generateViewId()
tạo ra một ID duy nhất. (Cảm ơn các cơ hội thay đổi đã chỉ ra điều này.) *
Nếu bạn ViewGroup
không thể xác định thông qua XML (hoặc bạn không muốn nó), bạn có thể bảo lưu id qua XML để đảm bảo nó vẫn duy nhất:
Ở đây, giá trị / ids.xml định nghĩa một tùy chỉnh id
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Sau đó, khi Viewgroup hoặc View đã được tạo, bạn có thể đính kèm id tùy chỉnh
myViewGroup.setId(R.id.reservedNamedId);
id
Ví dụ mâu thuẫn
Để rõ ràng bằng cách ví dụ che giấu, hãy xem xét điều gì xảy ra khi có id
xung đột đằng sau hậu trường.
layout / mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
Để mô phỏng một cuộc xung đột, giả sử bản dựng mới nhất của chúng ta được gán R.id.placeholder
( @+id/placeholder
) một int
giá trị là 12
..
Tiếp theo, MyActivity.java xác định một số lượt xem theo chương trình (thông qua mã):
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
Vì vậy placeholder
, một trong TextView
hai người mới của chúng tôi có id
12 người! Nhưng đây không thực sự là vấn đề nếu chúng tôi truy vấn các quan điểm con của trình giữ chỗ:
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*Không tệ lắm