2012-04-04 47 views
32

Trong Android R.java được sử dụng để cung cấp quyền truy cập vào các tài nguyên được xác định trong các tệp XML. Để truy cập tài nguyên, chúng ta cần gọi phương thức findViewById() truyền vào id của tài nguyên cần tìm nạp.Khái niệm đằng sau R.java là gì?

Điều này tương tự như Spring nơi đậu được xác định trong ngữ cảnh XML và được tìm nạp bằng cách sử dụng ngữ cảnh ứng dụng. context.getBean("beanId")

Điều này cung cấp khớp nối lỏng lẻo vì các hạt được xác định bên ngoài và có thể được thay đổi mà không cần sửa đổi mã.

Điều này khiến tôi bối rối. Mặc dù những gì Android trông giống như mùa xuân, nó mang lại lợi ích gì?

  1. Điểm của R.java trung gian là gì? Chúng ta không thể chỉ lấy tài nguyên trực tiếp từ XML bằng cách sử dụng ngữ cảnh của trình đọc/ứng dụng tài nguyên . ví dụ. findViewById("resourceId")
  2. Không có bất kỳ khớp nối rời nào. Vì các tham chiếu trong R.java được tạo tự động như thế nào có thể xóa một tài nguyên và đặt một tài nguyên mới?
  3. Làm theo mẫu thiết kế nào (nếu có)?
  4. Sẽ không tốt hơn nếu bạn có tài nguyên được tiêm bằng IOC (như Roboguice)? Tại sao Google sau đó quyết định cung cấp cho chúng tôi cách làm việc với tài nguyên?

Xin lỗi vô minh của tôi. Tôi là một nhà phát triển Java newbie đang cố gắng quá nhiều thứ cùng một lúc. :-) Cảm ơn tất cả các phản hồi.

+0

Tôi muốn chỉ cập nhật câu hỏi của bạn hai lần, đây là một câu hỏi rất thú vị – fatiDev

Trả lời

18

android.R.java không chỉ là nơi các mã XML được lưu trữ. Nó cũng chứa quyền truy cập vào các tài nguyên - chẳng hạn như drawables, layouts, strings, arrays và về cơ bản bất cứ điều gì bạn có thể khai báo trong tài nguyên.

Cá nhân tôi thấy rằng nó rất hữu ích khi sử dụng Eclipse. Tôi có thể chỉ cần gõ findViewById(R.id. và Eclipse sẽ hiển thị chú giải công cụ có danh sách các tùy chọn để chọn. Tuy nhiên, ở cấp độ nền tảng, tôi sẽ nói rằng các biến id được mã hóa cứng giúp ngăn ngừa lỗi khi sử dụng Strings để xác định tài nguyên - một thứ có thể gỡ lỗi trong khi lập trình (hoặc trong quá trình biên dịch chứ không phải thời gian chạy).

+5

Không thể đồng ý hơn. Tôi nghĩ việc kiểm tra thời gian biên dịch làm cho nó đáng giá. Biên dịch an toàn thời gian là một trong những lý do tại sao tôi yêu Java hơn các ngôn ngữ động khác. :-) –

1

Việc so sánh cảm thấy hơimột chút (trên thực tế) lạ, bởi vì bạn so sánh hai cơ chế dựa trên thực tế rằng họ sử dụng điều tên để làm công cụ. Để tải tài nguyên, ví dụ: hãy xem cách xử lý tài nguyên được thực hiện trong thế giới .Net.


Nó cung cấp cho thời gian biên dịch kiểm tra nếu tài nguyên có sẵn. Bởi vì nếu không, sẽ không có tĩnh bên trong R.java trỏ đến nó. Trong ví dụ mùa xuân, làm thế nào bạn có thể chắc chắn có một hạt được gọi là beanId? Tuy nhiên, nó không cung cấp để kiểm tra xem nó có đúng là loại tài nguyên hay không.

Tại sao điều này không bị mất? Miễn là tài nguyên mới có cùng tên, nó sẽ tạo ra cùng một hằng số tĩnh. Trong Spring, bạn sẽ phải sử dụng cùng một tên bean.

Mẫu thiết kế? Không ai. Nó chỉ thêm một mức độ vô hướng bằng cách đặt tên cho các tài nguyên và sau đó tham chiếu đến chúng chỉ theo tên, không phải bằng cách tải trực tiếp chúng từ vị trí thực của chúng.

Thực ra, các tài nguyên được được tiêm, vì tải tài nguyên phải đối phó với bản địa hóa. Xem here để biết cách thức hoạt động của Android; trong thế giới .Net, các nền văn hóa bổ sung được đóng gói thành các cụm satelite; các resource manager sẽ tải một trong những quyền dựa trên văn hóa hiện tại.

21

Lợi thế lớn nhất là bản địa hóa và cung cấp tài nguyên thay thế cho các kích thước màn hình khác nhau.

ví dụ như bạn có thể có một String nguồn R.string.myname này có thể được một định nghĩa bằng tiếng Anh trong /values-en/strings.xml và ở Tây Ban Nha trong /values-es/strings.xml

Hệ thống sẽ chăm sóc hoặc chọn lên các tập tin phải phụ thuộc vào miền địa phương bạn chỉ cần sử dụng @string/myname trong tệp bố cục hoặc R.string.myname trong mã của bạn.

Tương tự như vậy bạn có thể có hai tập tin bố trí cho bức chân dung và phong cảnh quy định tại

res/layout/mylayout.xml 
res/layout-land/mylayout.xml 

Trong mã của bạn, bạn sẽ chỉ cần chỉ định R.layout.mylayout để thổi phồng cách bố trí. Trình quản lý tài nguyên chọn tệp trong vùng bố cục nếu thiết bị ở chế độ nằm ngang.

Làm điều này bằng tay sẽ là một cơn ác mộng - vì vậy cần phải tập R

0

Nó cũng chứa các truy cập đến tài nguyên - như id, drawables, bố trí, chuỗi, mảng, và về cơ bản bất cứ điều gì bạn có thể khai báo tài nguyên .

+1

Cảm ơn bạn đã đóng góp cho StackOverflow. Cân nhắc đọc mục nhập [Help Center] (http://stackoverflow.com/help/how-to-answer) về cách trả lời câu hỏi. Như được viết, câu trả lời của bạn không phải là một câu trả lời hoàn chỉnh cho chính nó. Nó đề cập đến ngữ cảnh từ các câu hỏi khác. Xem xét việc tạo một danh sách đầy đủ về những gì có trong R.java, không chỉ những thứ mà các áp phích khác còn lại. –

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