2011-02-10 55 views
62

Tôi đã cố gắng sao chép dự án mẫu NotePad sao cho nếu tôi sửa đổi các tệp nguồn để tìm hiểu thông qua thử nghiệm, các tệp mẫu ban đầu sẽ không bị ảnh hưởng.Android: R là gì? Tại sao nó rất khó hiểu?

Than ôi, mặc dù sau very clean steps trong một môi trường hoang sơ, R quay lưng lại với tôi, again!

Tôi có khoảng 20 "R không thể giải quyết cho một biến" lỗi ...

Bây giờ, điều này cũng giống như bắt 22: Tôi cố gắng để nghiên cứu các mẫu NotePad, vì vậy mà tôi có cơ hội để hiểu R là gì. Nhưng R không thích tôi rất nhiều, vì vậy nó không cho tôi một cơ hội để nghiên cứu mẫu NotePad.

Để thêm xúc phạm đến thương tích, khi tôi Google cho R, tôi nhận được kết quả hoàn toàn không liên quan.

  1. R là gì?
  2. Tại sao quá khó hiểu?
  3. Tại sao nó luôn là người đầu tiên không thể giải quyết ?

Cập nhật: Tôi nhận thấy rằng trong dự án HelloAndroid (phiên bản layout XML), có một tập tin Java tạo, tên R.java. Đây có phải là số R nổi tiếng về việc người xây dựng dự án đang khiếu nại không?

+1

@ John, tôi nghĩ đây là những gì các thẻ cho. :) Tuy nhiên, tôi sẽ sớm thêm tiền tố. –

Trả lời

93

R là lớp có chứa các định nghĩa cho tất cả các tài nguyên của gói ứng dụng cụ thể. Nó nằm trong không gian tên của gói ứng dụng.

Ví dụ: nếu bạn nói trong tệp kê khai, tên gói của bạn là com.foo.bar, một lớp R được tạo bằng các ký hiệu của tất cả các tài nguyên của bạn trong com.foo.bar.R.

Có thường haiR lớp bạn sẽ đối phó với

  1. Nguồn khuôn khổ trong android.R
  2. riêng của bạn trong không gian tên của bạn

Nó được đặt tên R vì đó là viết tắt của R esources và không có bất kỳ điểm nào trong việc khiến mọi người nhập nội dung nào đó dài hơn, đặc biệt ecially vì nó là phổ biến để kết thúc với tên biểu tượng khá dài sau đó, có thể gây ra một số tiền hợp lý của wrapper dòng.

+9

Sau khi giải quyết tất cả các vấn đề và tiến hành với cuốn sách, tôi có thể thêm (từ sách): Đây là lớp tiện ích ** được tạo tự động ** cung cấp tham chiếu đến các tài nguyên trong dự án. Nó được gọi là "R class" vì tên của nó là ** R.java **. Nó được tạo bởi AAPT từ nguồn được xác định trong thư mục ** res **. –

+0

'android.R' là gì? –

+5

Có một điểm khiến mọi người gõ một cái gì đó lâu hơn: nó được gọi là mã sạch và có thể chưa đến được với mọi người. Một lớp thư, tiện ích mở rộng, biến có thể tốt trong ngữ cảnh cục bộ nhưng không bao giờ trên toàn cầu. Những cái tên xấu xí như thế này dẫn đến những câu hỏi dư thừa như thế này. – brainray

2

R là tên cho tài nguyên của bạn. Bất kỳ tài nguyên nào bạn truy cập bạn truy cập theo số R.$FOLDER.$RESOURCE hoặc nội dung nào đó rất giống nhau. Nếu nó không thể được giải quyết, hãy đảm bảo đường dẫn là chính xác và tài nguyên được tham chiếu tồn tại (phân biệt chữ hoa chữ thường, bao gồm phần mở rộng). Ngoài ra, phần khó hiểu (cho tôi anyway) là có hai khác nhau R của. Nếu bạn gặp phải nhiều lỗi "Không thể giải quyết", hãy thử xem nội dung bạn đang nhập. Hãy thử thay đổi hoặc xóa nó. Hoặc bạn có thể thử làm sạch dự án của bạn (CẢNH BÁO: Đôi khi điều đó làm cho mọi việc tồi tệ hơn chúng đã có).

+0

Có, dọn dẹp dự án của tôi dường như là một thói quen hàng ngày - nhật thực luôn luôn có dây và quên đi mọi thứ, nhưng việc dọn dẹp tốt có vẻ sẽ khắc phục mọi thứ (mặc dù tôi chưa bao giờ gặp phải những điều tồi tệ hơn chúng)). –

+0

@Brian: Khi tôi dọn dẹp dự án của mình, Eclipse phá hủy và tạo lại tệp 'R' của tôi. Đôi khi, nó bỏ lỡ bước "tái tạo" để lại cho tôi mà không có (hoặc có sản phẩm nào) 'R' và' R' được lập trình để tự động hoàn tác mọi thay đổi được thực hiện bằng tay. – John

+0

@ John: bạn đang sử dụng hệ điều hành nào, chỉ vì tò mò? –

16

R: Không có gì là rất bí ẩn về R. Nó chỉ là một lớp có nhiều lớp con tĩnh, mở nó trong nhật thực và xem (theo gen /).

Mỗi thành viên của lớp này là một trong hai điều sau: 1) lớp cuối cùng tĩnh hoặc 2) số nguyên cuối cùng tĩnh là duy nhất đối với các thành viên khác trong lớp.

Tại sao quá khó hiểu: Dễ bị nhầm lẫn vì R được tạo tự động bởi kiến. Khó hiểu của nó bởi vì bạn không phải "chạm" nó theo cách thủ công (tất nhiên bạn có thể nhưng những thay đổi của bạn sẽ tự động bị xóa khi tái tạo). Ngoài ra nó còn khó hiểu bởi vì đôi khi nhật thực tự động nhập các tệp R chuẩn của Android (như được thảo luận trong các câu trả lời ở trên)

Tại sao nó luôn là thứ đầu tiên không thể giải quyết được: R tuân theo quy tắc của các lớp và gói Java là không có gì đặc biệt về cách R hoạt động liên quan đến nhập khẩu. R sẽ được tự động đặt trong gói theo quy định của các mục nhập gói trong file manifest của bạn

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="package.which.will.contain.R.and.probably.the.main.package.in.the.application" android:versionName="8.6.2011" android:versionCode="1"> 
    <uses-sdk android:minSdkVersion="13" /> 

Để xem những gì gói tập tin R của bạn thuộc về chỉ mở ra gen/thư mục trong nhật thực (gói xem). Bạn sẽ thấy một gói được liệt kê ở đó, nó sẽ có tên bạn chỉ định trong tệp kê khai của bạn. Hãy thử xóa nó, nó sẽ quay trở lại nếu tất cả các tài nguyên của bạn tuân thủ đúng quy tắc đặt tên và tất cả các tệp xml của bạn tuân theo các quy tắc xml chính xác và nếu tự động xây dựng.

Chìa khóa để hiểu tệp R là nhận ra rằng nó nằm trong cùng gói với các lớp khác mặc dù nó nằm trong một thư mục khác thì các tệp khác thuộc gói "chính" của bạn. Sau khi bạn hiểu điều này và hiểu cú pháp và đặt tên các tệp tài nguyên, các sự cố khắc phục sự cố với R rất dễ dàng.

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