2012-10-18 32 views
6

Tôi có một thành phần tùy chỉnh với một RadioGroup có hai RadioButton, id @+id/radioButton1@+id/radioButton2. Mặt khác, có một TabActivity với năm tab. Trên mỗi tab, thành phần này được sử dụng nhiều lần.Lượt xem có cùng id nhận được cùng một attrs khi khôi phục

Đây là vấn đề, khi định hướng thay đổi và hoạt động được tạo lại, tất cả RadioButton được nạp cùng một attrs, bao gồm android:text, android:margin và thậm chí cả attrs theo kiểu mà tôi đã tạo. Nó cũng xảy ra với tất cả các CheckBox có cùng id.

Tôi đã dành một chút thời gian để tìm hiểu lý do tại sao điều này xảy ra và kết luận rằng android đang làm điều đó trong onRestoreInstanceState. Nếu tôi bình luận dòng gọi siêu phương pháp nó hoạt động tốt.

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    // super.onRestoreInstanceState(savedInstanceState); 

} 

Đây có phải là lý do không? Hoặc những gì có thể làm để gây ra điều này?

Tôi đoán rằng đó không phải là hành vi bình thường vì khi chế độ xem tùy chỉnh được tạo, chế độ xem đó sẽ tăng cùng một bố cục với cùng chế độ xem có cùng id. Vì vậy, không thể tạo nhanh chế độ xem tùy chỉnh mới tạo các id khác nhau cho con của nó mỗi lần. Sử dụng mã ở trên hoặc android:configChanges trên tệp kê khai có vẻ là một giải pháp không tốt đối với tôi. Vì vậy, bất kỳ trợ giúp được đánh giá cao.

+0

Tôi đã có kinh nghiệm này quá. Trong thực tế, tôi đã dành một vài ngày cố gắng theo dõi lỗi này xuống. Phần tồi tệ nhất là, trong trường hợp của tôi, những quan điểm nhận được một giá trị xấu và điều đó ngay lập tức kích hoạt sự thay đổi trong trạng thái của sự vật được đại diện bởi Chế độ xem, điều đó có nghĩa là tôi đang làm hư hỏng trạng thái của một số người khác. Tôi sử dụng lại chế độ xem tùy chỉnh của mình ở các vị trí khác nhau trong Hoạt động và tất nhiên là có thể sử dụng lại tệp XML được ưa thích. –

Trả lời

1

Sau một thời gian tìm kiếm lời giải thích, cuối cùng tôi đã tìm thấy lời giải thích tuyệt vời từ Romain Guy trong nhóm google android, mặc dù nó không đề cập đến chế độ xem tùy chỉnh.

"Bạn có thể sử dụng cùng một id trừ khi bạn cần chế độ xem để lưu trạng thái của chúng. Id là xác định chế độ xem khi trạng thái của chúng được lưu để bộ công cụ đơn giản là nghĩ rằng hai chế độ xem của bạn giống nhau. đúng trong vòng chỉ một hoạt động . "

" không có vấn đề bằng cách sử dụng id giống nhau trong hai hoạt động khác nhau. Và không có vấn đề bằng cách sử dụng id cùng bên trong hoạt động tương tự nếu bạn cẩn thận về những gì bạn' đang thực hiện lại (ví dụ: nếu lượt xem với các id được chia sẻ không cần phải lưu bất kỳ trạng thái nào.) Trong trường hợp của bạn, vì hoạt động s là một phần của một tập hợp các tab, chúng thực sự là gắn liền với một ngữ cảnh độc đáo có nghĩa là bạn sẽ gặp sự cố với các id được chia sẻ. "

Here's the link.

+1

Thay vì chỉ liên kết với một tài nguyên bên ngoài, bạn nên bao gồm một phần nhỏ (liên quan) của nó ở đây - một liên kết tự nó có thể bị thối và không phải là một câu trả lời hay. – slugster

1

Phương thức savedInstanceState của bạn trông như thế nào?

Tôi khuyên rằng các biến được gán cho văn bản vô tuyến không bền bỉ giữa các thay đổi định hướng. Hãy nhớ rằng, hoạt động này được xây dựng lại hoàn toàn/khởi động lại khi thay đổi định hướng.

+0

Tôi không ghi đè lên phương thức onSaveInstanceState. Tôi chỉ ghi đè lênRestoreInstanceState để ngăn các lượt xem tải lại với cùng id với t anh ấy cùng AttributeSet. –

+0

Các văn bản vô tuyến nhận giá trị của lần xuất hiện cuối cùng của chế độ xem tùy chỉnh của tôi, giống như android đang quét toàn bộ bố cục liên kết trạng thái chế độ xem với id của nó (Trong gói savedInstanceState, tôi đoán) và sau đó tải trạng thái này cho tất cả các chế độ xem id được liên kết. –

+1

Bạn đã thử tạo một tệp bố cục cảnh quan thay thế bằng cách tạo thư mục bố cục đất và sao chép cùng một tệp xml bố cục vào nó? Android tự động chuyển đổi giữa hai tùy thuộc vào hướng thiết bị. Điều này có thể buộc thiết bị phải xây dựng lại chế độ xem với thông tin "mới". –

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