Lớp R trong Android là gì?


89

Trong AndroidStudio, khi tôi tạo một dự án bằng hoạt động trống, tôi nhận được đoạn mã sau trong MainActivity.javatệp:

package my.company.my_proj;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

nơi một lớp khó hiểu có tên Rđược sử dụng. Mục đích của lớp học này là Rgì?

Câu trả lời:


117

Rlà một lớp chứa các định nghĩa cho tất cả các tài nguyên của một 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 của mình, tên gói của bạn là com.foo.bar, một Rlớp sẽ được tạo với các ký hiệu của tất cả các tài nguyên của bạn com.foo.bar.R.

Nói chung có hai R lớp bạn sẽ đối phó

  1. Các tài nguyên khung trong android.R
  2. Của riêng bạn, trong không gian tên của bạn

Nó được đặt tên Rbởi vì nó là viết tắt của R esources, và không có ích gì khi khiến mọi người phải nhập một thứ gì đó lâu hơn, đặc biệt là vì nó thường có các tên ký hiệu khá dài sau nó, điều này có thể gây ra một lượng lớn trình bao bọc dòng.


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

1
android.Rgì?
Malwinder Singh

13
Có một điểm khiến mọi người phải gõ nội dung 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. Các lớp một ký tự, phần mở rộng, các 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 như thế này dẫn đến những câu hỏi thừa như thế này.
brainray

23

R là gì: Không có gì bí ẩn về R. Nó chỉ là một lớp có nhiều lớp con tĩnh, hãy mở nó ra trong eclipse và xem (thuộc gen / của nó).

Mọi thành viên của lớp này là một trong hai thứ: 1) các lớp cuối cùng tĩnh hoặc 2) các 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 của chúng.

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

Tại sao nó luôn là lỗi đầu tiên không thể giải quyết được: R tuân theo chính xác các quy tắc của các lớp và gói Java, không có gì đặc biệt về cách R hoạt động liên quan đến việc nhập. R sẽ tự động được đặt trong gói được chỉ định bởi mục nhập gói trong tệp kê khai 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 tệp R của bạn thuộc về gói nào, chỉ cần mở thư mục gen / trong eclipse (dạng xem gói). 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 mình. Hãy thử xóa nó đi, nó sẽ quay trở lại nếu tất cả các tài nguyên của bạn tuân theo các quy tắc đặt tên chính xác 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ính năng xây dựng tự động được bật trong eclipse.

Chìa khóa để hiểu tệp R là nhận ra rằng nó nằm trong cùng một gói với các lớp khác mặc dù nó nằm trong một thư mục khác sau đó là 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à cách đặt tên của tệp tài nguyên, việc khắc phục sự cố với R rất dễ dàng.


3

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ằng R.$FOLDER.$RESOURCEhoặc một thứ gì đó tương tự.

Nếu không thể giải quyết được, hãy đảm bảo rằng đường dẫn chính xác và tồn tại tài nguyên được tham chiếu (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 (với tôi, dù sao) là có hai R' khác nhau . Nếu bạn gặp nhiều lỗi "Không thể giải quyết", hãy thử xem những gì 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 mình (CẢNH BÁO: Đôi khi điều đó khiến mọi thứ trở nên tồi tệ hơn hiện tại).


Đúng vậy, việ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 trôi đi và quên đi mọi thứ, nhưng việc dọn dẹp tốt dường như sẽ sửa chữa mọi thứ (mặc dù tôi chưa bao giờ trải nghiệm mọi thứ tồi tệ hơn hiện tại, như John đã đề cập) .
Brian D

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

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

@John, Làm sạch không giúp được gì trong trường hợp của tôi. Bạn có thể xem danh sách thực tế các lỗi trong chuỗi này (chưa được trả lời): stackoverflow.com/questions/4928784/…
Android Eve

1

Android R.java là một tệp được tạo tự động bởi AAPT (Công cụ đóng gói tài sản Android) chứa ID tài nguyên cho tất cả các tài nguyên của thư mục res /. Nếu bạn tạo bất kỳ thành phần nào trong tệp activity_main.xml, id cho thành phần tương ứng sẽ tự động được tạo trong tệp này. Id này có thể được sử dụng trong tệp nguồn hoạt động để thực hiện bất kỳ hành động nào trên thành phần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.