문제

Android SDK 문서에서 @drawable/my_image xml 구문과 함께 사용된 모든 예제는 내 프로젝트의 res/drawable 디렉터리에 저장된 이미지를 직접 지정합니다.

Drawable 디렉터리 내에 하위 디렉터리를 만드는 것이 명시적으로 허용되지 않는지 궁금합니다.

예를 들어, 다음과 같은 디렉터리 레이아웃이 있다고 가정해 보겠습니다.

res/drawable
-- sandwiches
  -- tunaOnRye.png
  -- hamAndSwiss.png
-- drinks
  -- coldOne.png
  -- hotTea.png

참치 샐러드 샌드위치 이미지를 @drawable/sandwiches/tunaOnRye로 참조할 수 있나요?

아니면 drawable 디렉터리에 계층 구조를 플랫하게 유지해야 합니까?

도움이 되었습니까?

해결책

아니요, 리소스 메커니즘은 Drawable Directory의 서브 폴더를 지원하지 않으므로 예 - 해당 계층 구조를 평평하게 유지해야합니다.

보여준 디렉토리 레이아웃은 이미지를 사용할 수 없습니다.

내 자신의 실험에서 res/drawable 폴더, 리소스 컴파일러가 실패하게됩니다. R.java 파일이 올바르게 생성되지 않도록합니다.

다른 팁

내가 사용하고 있는 해결 방법(및 Android 자체가 선호하는 것 같음)은 기본적으로 슬래시를 밑줄로 대체하는 것이므로 구조는 다음과 같습니다.

sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png

이 접근 방식을 사용하려면 이름을 세심하게 지정해야 하며 파일 자체를 다루기가 훨씬 쉬워지지 않습니다(음료와 샌드위치가 실제로 모두 "food", 단순히 디렉토리로 이동하는 대신 대량 이름 변경을 수행해야 합니다.)하지만 프로그래밍 논리의 복잡성은 문제가 되지 않습니다. ~도 폴더 구조에 비해 나쁘다.

이 상황은 정말 짜증나네요.Android는 훌륭하고 끔찍한 디자인 결정이 혼합된 가방입니다.우리는 후자 부분이 서둘러 제거되기를 바랄 뿐입니다 :)

예 - 빨라집니다 :) 그러나 자산 폴더를 사용하고 서브 디렉토리를 사용하고 이미지를 그런 식으로로드 할 수 있습니다.

실제로 Android Studio에서는 가능합니다. 그림과 같이 중첩 된 자원을 가질 수 있습니다 여기 :

enter image description here

그룹 리소스를위한 플러그인도 있습니다 여기.

자산 폴더를 사용하십시오.

샘플 코드 :

InputStream is = null;
try {
    is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
    ;
}

image = BitmapFactory.decodeStream(is);

두 개의 밑줄로 파일 이름을 분리하여 가상 하위 폴더를 만들 수있는 Eclipse 플러그인을 작성했습니다. __. 프로젝트는 초기 단계이지만 걱정하지 마십시오.

자세한 내용은 여기에서 찾을 수 있으며, 자유롭게 포크하고 풀 요청을 보내십시오.

https://github.com/kirill578/android-sorted-res-folder

enter image description here

나는 간단한 스크립트를 사용하여 디자이너가 제공 한 조직화 된 디렉토리 구조를 R 파일을 생성하는 데 사용할 수있는 것으로 평평하게 만들고 싶습니다.

Drawable-HDPI에서 현재 경로로 실행하십시오.

#! /bin/bash
DIRS=`find * -type d`
for dir in ${DIRS} ; do 
  for file in `ls ${dir}` ; do
    mv ${dir}/${file}  ${dir}_${file};
  done 
  rmdir ${dir};
done

Gradle이 있는 Android 스튜디오에서는 리소스를 분리할 수 있는 여러 소스 디렉터를 가질 수 있습니다.예를 들어:

android {
    ....
    android.sourceSets {
        main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
    }
    ....
}

그러나 이름이 충돌해서는 안 됩니다. 즉, sandes_tunaOnRye와 같은 이름이 여전히 필요하지만 모든 샌드위치에 대해 별도의 섹션을 가질 수 있다는 의미입니다.

이를 통해 리소스를 다양한 구조로 저장할 수 있습니다(actionbargenerator와 같이 자동 생성된 콘텐츠에 유용함).

문제를 부분적으로 주변에 얻는 한 가지 방법은 API 레벨 접미사를 사용하는 것입니다. RES/LAYOUT-V1, RES/LAYOUT-V2 등을 사용하여 동일한 APK에서 여러 하위 프로젝트를 보유합니다. 이 메커니즘은 모든 리소스 유형에 사용될 수 있습니다.

분명히, 이것은 RES/Layout-V 이상의 API 레벨을 목표로하는 경우에만 사용할 수 있습니까? 당신은 사용 중입니다.

또한 Android 1.5 및 1.6의 버그를 조심하십시오.API 레벨 접미사에 대한 Andoroid 문서를 참조하십시오.

도서관 시스템의 출현으로 큰 자산 세트 당 라이브러리를 만드는 것이 솔루션이 될 수 있습니다.

모든 자산 내에서 동일한 이름을 사용하지 않아야하지만 라이브러리 당 접두사 체계를 사용하는 것이 도움이 될 것입니다.

폴더를 만들 수있는 것만 큼 간단하지는 않지만 사물을 제정신으로 유지하는 데 도움이됩니다 ...

이 상황에 대한 해결 방법이 있습니다. resVector (예를 들어) 기본값과 동일한 레벨의 폴더 res 폴더. 거기에 추가 할 수 있습니다 drawable-xxx 거기에 자원 폴더 :

resVector
-drawable
-layout
-color

그 후에 필요한 것은 추가하는 것입니다

sourceSets {
        main.res.srcDirs += 'src/main/resVector'
    }

당신의 build.gradle 파일 (내부 android { }).

이것은 완벽한 방법이 아닙니다. 디스플레이와 같은 방식으로 구현해야합니다 여기.

사용할 수있는 코드를 통해 폴더 아래 이미지를 호출 할 수도 있습니다.

Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);

TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);

내 것이 아니지만이 문제를 찾을 때이 스레드를 찾았습니다. Android Studio와 Gradle 빌드 시스템을 사용하는 경우 작은 플러그인이 필요하지 않습니다. 작은 빌드 파일 편집 만 필요합니다.

https://stackoverflow.com/a/22426467/618419

Android Studio와 함께 Gradle이 이런 식으로 할 수 있습니다 (링크).

"구조 구성"단락에 있습니다.

sourceSets {
 main {
    java {
        srcDir 'src/java'
    }
    resources {
        srcDir 'src/resources'
    }
 }
}

기본에서 폴더를 만듭니다. 좋아요 : 'res_notification_btn'

'Drawable'또는 'Layout'과 같이 트리 폴더를 만듭니다.

그런 다음 'build.gradle'에서 이것을 추가하십시오

sourceSets
            {
                main
                {
                    res
                    {
                        srcDirs = ['src/main/res_notification_btn', 'src/main/res']
                      or
                        srcDir 'src/main/res_notification_btn'
                    }
                }
            }
#!/usr/bin/env ruby

# current dir should be drawable-hdpi/ etc

# nuke all symlinks
Dir.foreach('.') {|f|
    File.delete(f) if File.symlink?(f)
}

# symlink all resources renaming with underscores
Dir.glob("**/*.png") {|f|
    system "ln -s #{f} #{f.gsub('/', '_')}" if f.include?("/")
}

확인하다 평평한 폴더 스크립트를 강타하십시오 이는 폴더 계층을 단일 폴더로 변환합니다

자산/ 원시 자산 파일을 저장하는 데 사용할 수 있습니다. 여기에 저장 한 파일은 .apk 파일로 컴파일되어 원래 파일 이름이 보존됩니다. URI를 사용하여 일반적인 파일 시스템과 동일한 방식 으로이 디렉토리를 탐색하고 AssetManager를 사용하여 바이트 스트림으로 파일을 읽을 수 있습니다. 예를 들어, 이것은 텍스처 및 게임 데이터에 좋은 위치입니다.http://developer.android.com/tools/projects/index.html

하위 디렉터는 허용되지 않으며 리소스에는 [A-Z0-9_] 만 포함해야합니다.

아니요 대문자가없고 앞으로 슬래시가 없습니다.

  1. 드로우 가능을 마우스 오른쪽 버튼으로 클릭하십시오
  2. 새 ---> 디렉토리를 선택하십시오
  3. 디렉토리 이름을 입력하십시오. EG : Logo.png (위치는 이미 기본적으로 Drawable 폴더를 표시합니다)
  4. 이미지를 뽑을 수있는 폴더에 직접 복사하여 붙여 넣습니다. 붙여 넣기 동안 목록의 각 이미지에 대해 MDPI/XHDPI/XXHDPI 등을 선택할 수있는 옵션이 나타납니다. 적절한 옵션을 선택하고 이미지 이름을 입력하십시오. 디렉토리 이름과 동일한 이름을 유지하십시오. IE logo.png
  5. 나머지 이미지에 대해서도 동일하게 수행하십시오. 그들 모두는 로고에 배치됩니다 .png 기본 폴더.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top