it-source

Android 그리기 가능 디렉토리에 하위 디렉토리를 포함할 수 있습니까?

criticalcode 2023. 6. 6. 00:00
반응형

Android 그리기 가능 디렉토리에 하위 디렉토리를 포함할 수 있습니까?

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

드로잉 가능한 디렉토리 내에 하위 디렉토리를 생성하는 것이 명시적으로 문제가 없는지 궁금합니다.

예를 들어, 다음과 같은 디렉토리 레이아웃이 있는 경우:

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

참치 샐러드 샌드위치의 이미지를 @drawable/sandwichs/tuna OnRye로 참조할 수 있습니까?

아니면 그리기 가능한 디렉토리에서 계층을 평평하게 유지해야 합니까?

아니요, 리소스 메커니즘은 그리기 가능한 디렉토리의 하위 폴더를 지원하지 않으므로, 예 - 계층 구조를 동일하게 유지해야 합니다.

표시한 디렉터리 레이아웃으로 인해 사용할 수 있는 이미지가 없습니다.

가 직접 해 본 자의실험따르면에다, 안항이폴있것같습니는더 안에 어떤 이든 있는 하위 것 .res/drawable는합니다. -- 이 를 방지합니다.R.java파일이 올바르게 생성되지 않았습니다.

제가 사용하고 있는 해결 방법은 (안드로이드 자체가 선호하는 것처럼 보이는) 기본적으로 슬래시 대신 밑줄을 사용하는 것입니다. 그래서 당신의 구조는 다음과 같습니다.

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

을 지정할 때 하는 것을 더 만들지 . ( 여러분이 로 모두" 접방식라이음지이하야정논자며쟁는하를것체을일않더근다경모니우결정한고두습씬쉽훨정로만지말게와료들가치위드샌해게중하은름을신파라음▁"▁the▁and이▁that▁youif▁really▁requires▁be▁drinks▁and▁approach▁all▁them▁decided경▁fileshes우▁the정한angle결▁doesn▁your▁sandwic▁it▁to고▁(t▁should▁make▁naming▁to"▁easier▁you모food단순히 디렉토리로 이동하는 것이 아니라 대량 이름 변경을 수행해야 합니다.) 그러나 프로그래밍 논리의 복잡성은 폴더 구조와 비교할 때 크게 문제가 되지 않습니다.

이 상황은 정말 최악입니다.Android는 멋진 디자인 결정과 끔찍한 디자인 결정이 뒤섞인 가방입니다.우리는 후반부가 충분히 서둘러 제거되기를 바랄 뿐입니다 :)

사실 안드로이드 스튜디오에서는 가능합니다.다음과 같이 리소스를 중첩할 수 있습니다.

여기에 이미지 설명 입력

여기에는 리소스를 그룹화하는 플러그인도 있습니다.

하지만 저는 이것을 피하는 것을 추천합니다.

예 - 정말 형편없네요 :) 하지만 자산 폴더를 사용하고 하위 디렉터리를 가지고 그런 식으로 이미지를 로드할 수 있습니다.

자산 폴더를 사용합니다.

샘플 코드:

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

image = BitmapFactory.decodeStream(is);

을 두 의 밑줄로 하여 가상 수 __단계에

자세한 내용은 여기에서 확인할 수 있습니다. 언제든지 포크를 사용하여 풀 요청을 전송하십시오.

https://github.com/kirill578/Android-Sorted-Res-Folder

여기에 이미지 설명 입력

저는 간단한 스크립트를 사용하여 디자이너가 제공하는 조직화된 디렉토리 구조를 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.sourceSets {
        main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
    }
    ....
}

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

이렇게 하면 리소스를 서로 다른 구조로 저장할 수 있습니다(작업 표시줄 생성기와 같은 자동 생성 콘텐츠에 유용).

이 문제를 부분적으로 해결하는 한 가지 방법은 API 수준 접미사를 사용하는 것입니다.여러 하위 프로젝트를 동일한 apk에 저장하기 위해 res/layout-v1, res/layout-v2 등을 사용합니다.이 메커니즘은 모든 리소스 유형에 사용할 수 있습니다.

사용 중인 res/layout-v? 이상의 API 수준을 대상으로 하는 경우에만 사용할 수 있습니다.

또한 Android 1.5 및 1.6의 버그를 주의하십시오.API 수준 접미사에 대한 안도로이드 설명서를 참조하십시오.

상황에 방법은 과 같습니다. " 이상에방있다니습이법결해대"를 만들 수 . 다음을 생성할 수 있습니다.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 Build 시스템을 사용하는 경우 플러그인 없이 약간의 빌드 파일 편집만 하면 됩니다.

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

Android Studio를 사용하는 Gradle은 이러한 방식으로 수행할 수 있습니다(링크).

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

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

기본 폴더를 만듭니다.like: 'res_notification_btn'

그리고 'drawable' 또는 'drawable'과 같은 트리 폴더를 만듭니다.

그런 다음 '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?("/")
}

폴더 계층을 단일 폴더로 변환하는 Bash 플랫 폴더 선택 스크립트

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

하위 디렉터리는 허용되지 않습니다. 리소스는 [a-z0-9_.]만 포함해야 합니다.

아니요, 대문자가 있고 슬래시가 없습니다.

하위 디렉터리 'drawable'이 있는 'res'와 평행한 추가 폴더를 가진 다음 그라들에 다음을 추가하면 여러 개의 그리기 가능 폴더를 가질 수 있습니다.

sourceSets {
    main {
        res.srcDirs 'src/main/<extra_res>'
    }
}

Gradle 6.5.1을 사용하여 테스트

Xamarin(Xamarin)을 사용하는 모든 사용자를 위한 것입니다.Android 또는 Xamarin.양식), 방법이 있습니다.

Android 프로젝트용 .csproj 파일에서 MonoAndroidResourcePrefix 행을 찾습니다(여기에 다소 서툴지만 문서화되어 있음).여기에 사용할 하위 디렉토리를 추가하고 각 항목을 세미콜론으로 구분합니다.Visual Studio는 빌드할 때 이러한 접두사를 제거하여 모든 리소스가 플랫 계층 구조로 끝나도록 합니다.변경한 후 솔루션을 다시 로드해야 할 수도 있습니다.

Xamarin에서의 설정 예

이러한 디렉터리는 프로젝트의 기본 리소스 디렉터리의 하위 디렉터리일 필요가 없습니다.

추가한 파일이 빌드 작업을 "AndroidResource"로 설정했는지 확인합니다.

사마린을 위해서.Android에서 시각적 편집기는 이미지를 인식하지 못하고 "이 리소스 URL은 해결할 수 없습니다."라는 오류를 표시하지만 프로젝트가 빌드되고 런타임에 이미지가 표시됩니다.

편집기 오류 에뮬레이터의 예

  1. 그리기 가능을 마우스 오른쪽 버튼으로 클릭합니다.
  2. 새 항목 선택 ---> 디렉터리
  3. 디렉토리 이름을 입력합니다.예: logo.png(기본적으로 그리기 가능한 폴더가 위치에 이미 표시됨)
  4. 이미지를 복사하여 그리기 가능한 폴더에 직접 붙여넣습니다.붙여넣는 동안 목록에서 각 영상에 대해 mdpi/xhdpi/xxhdpi 등을 선택할 수 있습니다.적절한 옵션을 선택하고 이미지의 이름을 입력합니다.디렉토리 이름과 동일한 이름(예: 로고)을 유지해야 합니다.png
  5. 나머지 영상에도 동일한 작업을 수행합니다.모두 logo.png 메인 폴더 아래에 배치됩니다.

언급URL : https://stackoverflow.com/questions/1077357/can-the-android-drawable-directory-contain-subdirectories

반응형