Android의 클래스 R은 무엇입니까?


89

AndroidStudio에서 빈 활동을 사용하여 프로젝트를 만들 때 MainActivity.java파일 에 다음 코드가 표시 됩니다.

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);
    }
}

명명 된 비밀 클래스 R가 사용되는 곳. 이 수업의 목적은 무엇입니까 R?

답변:


117

R특정 응용 프로그램 패키지의 모든 리소스에 대한 정의를 포함하는 클래스 입니다. 응용 프로그램 패키지네임 스페이스에 있습니다.

당신이 당신의 매니페스트 패키지 이름을 말한다면, 예를 들면 com.foo.bar, R클래스는 모든 자원의 상징으로 생성됩니다 com.foo.bar.R.

일반적으로 다루게 될 두 가지 R 클래스가 있습니다.

  1. android.R및 의 프레임 워크 리소스
  2. 자신의 네임 스페이스에서

그것은 R esources R를 의미하기 때문에 이름이 붙여 졌고, 사람들이 무언가를 더 길게 타자 하는 것은 의미 가 없습니다.


10
모든 문제를 해결하고 책을 진행 한 후 다음을 추가 할 수 있습니다 (책에서). 이것은 프로젝트의 리소스에 대한 참조를 제공 하는 자동 생성 유틸리티 클래스 입니다. 이름이 R.java 이므로 "R 클래스"라고합니다 . res 폴더에 정의 된 리소스에서 AAPT에 의해 생성됩니다 .
Android Eve

1
무엇입니까 android.R?
Malwinder Singh

13
사람들이 무언가를 더 길게 입력하게 만드는 요점이 있습니다. 이것은 깨끗한 코드라고하며 아직 모든 사람에게 도달하지 않았을 수 있습니다. 하나의 문자 클래스, 확장, 변수는 로컬 컨텍스트에서는 괜찮지 만 전역 적으로는 아닙니다. 이와 같은 추악한 이름은 이와 같은 중복 질문으로 이어집니다.
brainray

23

R이란 무엇입니까 : R에 대해 매우 신비한 것은 없습니다. 정적 하위 클래스가 많고 이클립스에서 열어서 살펴 보는 클래스입니다 (gen / 아래에 있음).

이 클래스의 모든 멤버는 1) 정적 최종 클래스 또는 2) 해당 클래스의 다른 멤버와 관련하여 고유 한 정적 최종 정수 중 하나입니다.

왜 그렇게 비밀 스럽습니까? R은 개미에 의해 자동으로 생성되기 때문에 혼동되기 쉽습니다. 수동으로 "접촉"해서는 안되기 때문에 그 비밀이 있습니다 (물론 할 수 있지만 변경 사항은 재생성시 자동으로 지워집니다). 때로는 eclipse가 Android 표준 R 파일을 자동으로 가져 오기 때문에 (위의 답변에서 논의한 바와 같이) 추가적으로 암호화되어 있습니다.

왜 항상 해결할 수없는 첫 번째 문제입니까? R은 Java 클래스 및 패키지의 규칙을 정확히 따르고, R이 가져 오기와 관련하여 작동하는 방식 에는 특별한 것이 없습니다 . R은 매니페스트 파일의 패키지 항목에 지정된 패키지에 자동으로 배치됩니다.

<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" />

R 파일이 속한 패키지를 보려면 eclipse (패키지보기)에서 gen / 폴더를여십시오. 여기에 하나의 패키지가 나열되고 매니페스트에 지정한 이름이 표시됩니다. 삭제를 시도하면 모든 리소스가 올바른 이름 지정 규칙을 따르고 모든 xml 파일이 올바른 xml 규칙을 따르고 Eclipse에서 빌드가 자동 으로 활성화되면 다시 나타납니다.

R 파일을 이해하는 데있어 핵심은 "main"패키지에 속한 다른 파일과는 다른 디렉토리에 있더라도 다른 클래스와 동일한 패키지에 있다는 것을 인식하는 것입니다. 이것을 이해하고 리소스 파일의 구문과 이름을 이해하면 R 문제를 해결하는 것은 쉽습니다.


3

R은 리소스의 이름입니다. 액세스하는 모든 리소스 R.$FOLDER.$RESOURCE또는 매우 유사한 것.

확인할 수없는 경우 경로가 올 바르고 참조 된 리소스가 있는지 확인합니다 (대소 문자 구분, 확장자 포함).

또한 혼란스러운 부분은 (어쨌든 나에게) 두 개의 다른R 것이 있다는 것 입니다. "해결할 수 없음"오류가 많이 발생하는 경우 가져 오는 항목을 확인하십시오. 변경하거나 제거하십시오. 또는 프로젝트를 정리해 볼 수 있습니다 (경고 : 때로는 상황이 이미있는 것보다 더 나빠질 수 있습니다).


예, 내 프로젝트를 청소하는 것은 일상적인 일인 것 같습니다. 일식은 항상 혼란스럽고 일을 잊는 것 같지만 좋은 청소는 문제를 해결하는 것 같습니다 (존이 언급했듯이 이미 상황이 더 나빠지는 것을 경험 한 적은 없지만) .
Brian D

@Brian : 프로젝트를 정리하면 Eclipse가 내 R파일을 파괴하고 재생성 합니다. 한 동안, 그것은 (또는 빈과)없이 저를 떠나는 "중생"단계를 벗어났습니다 일단 RR자동 손으로 만든 변경 취소에 프로그램된다.
John

@John : 호기심 때문에 어떤 OS를 사용하고 있습니까?
Brian D

@John, 청소는 내 경우에 도움이되지 않습니다. 이 스레드에서 실제 오류 목록을 볼 수 있습니다 (아직 답변되지 않음) : stackoverflow.com/questions/4928784/…
Android Eve

1

Android R.java는 res / directory의 모든 리소스에 대한 리소스 ID를 포함하는 AAPT (Android Asset Packaging Tool)에서 자동 생성 한 파일입니다. activity_main.xml 파일에 컴포넌트를 생성하면 해당 컴포넌트의 id가 자동으로 생성됩니다. 이 ID는 활동 소스 파일에서 구성 요소에 대한 조치를 수행하는 데 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.