idTổng quan về Android
Android idlà một số nguyên thường được sử dụng để xác định chế độ xem; điều này idcó thể được chỉ định thông qua XML (khi có thể) và thông qua mã (theo chương trình.) Điều idnày hữu ích nhất để có được các tham chiếu cho các định nghĩa XML được Viewtạo bởi một Inflater(chẳng hạn như bằng cách sử dụng setContentView.)
Chỉ định idquaXML
- 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:idsẽ đượ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 intgiá 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
intcó 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
idgán cho một Preferencetrong XML không được sử dụng khi Preferencetạo nó View.)
Gán idqua mã (lập trình)
- Đặt thủ công
ids bằng cách sử dụng someView.setId(int);
- Điều này
intphả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 ids
XMLids được gán sẽ là duy nhất.
- Mã giao
ids làm không phải là duy nhất
- Mã giao
ids lon (theo lý thuyết) mâu thuẫn với XML-assigned ids.
- Những mâu thuẫn
idnà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 idkhô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 Viewtì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
idgán trước một định nghĩa XML idtrong 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 IDs
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 ViewGroupkhô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);
idVí 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ó idxung độ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 intgiá 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 TextViewhai người mới của chúng tôi có id12 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