هل يمكن أن يحتوي دليل Android القابل للرسم على أدلة فرعية؟

StackOverflow https://stackoverflow.com/questions/1077357

سؤال

في وثائق Android SDK، تتناول جميع الأمثلة المستخدمة مع بناء جملة @drawable/my_image xml مباشرة الصور المخزنة في الدليل res/drawable في مشروعي.

أتساءل عما إذا كان من غير المقبول بشكل صريح إنشاء دليل فرعي داخل الدليل القابل للرسم.

على سبيل المثال، إذا كان لدي تخطيط الدليل التالي:

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

هل يمكنني الإشارة إلى صورة شطيرة سلطة التونة باسم @drawable/sandwiches/tunaOnRye

أو هل يجب أن أبقي التسلسل الهرمي ثابتًا في الدليل القابل للرسم.

هل كانت مفيدة؟

المحلول

لا، وآلية موارد لا يدعم المجلدات الفرعية في دليل drawable، لذلك نعم - تحتاج إلى الحفاظ على هذا التسلسل الهرمي شقة

وقال إن تخطيط الدليل الذي أظهر يؤدي في أي من الصور يتم المتوفرة.

ومن التجارب بلدي يبدو أن وجود فرعي مع أي من البنود في ذلك، ضمن المجلد res/drawable، وسوف يسبب المترجم المورد إلى فشل - منع الملف R.java من التي يتم توليدها بشكل صحيح

نصائح أخرى

والحل أنا باستخدام (واحد الروبوت نفسه يبدو لصالح) هو استبدال أساسا تسطير لمائل، لذلك الهيكل الخاص سوف ننظر بشيء من هذا القبيل:

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

وهذا النهج يتطلب منك أن تكون دقيقا في تسمية ولا يجعل من الاسهل بكثير لانتزاع الملفات نفسها (إذا كنت قررت أن المشروبات والسندويشات يجب حقا كل أن يكون "food"، وكنت ما عليك القيام به كتلة إعادة تسمية بدلا من مجرد نقلها إلى الدليل)؛ ولكن تعقيد منطق برمجة الخاص بك لا تعاني <م> من سيئة مقارنة مع ما يعادل بنية المجلد.

وهذا الوضع تمتص حقا. الروبوت هو خليط من قرارات التصميم رائع ورهيب. يمكننا أن نأمل فقط للجزء الأخير للحصول على اجتثاث مع جميع بالسرعة الواجبة:)

ونعم - أنها لا تمتص :) ولكن يمكنك استخدام مجلد الأصول ولها الدلائل الفرعية في هناك، وتحميل الصور بهذه الطريقة

في الواقع، هذا ممكن على 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 يسمح بإنشاء مجلد فرعي افتراضي عن طريق فصل اسم الملف بشرطتين سفليتين __.المشروع في مراحله الأولى، لكن لا تقلق لأنه لن يؤدي إلى تعطل IDE الخاص بك

يمكن العثور على مزيد من التفاصيل هنا، فلا تتردد في إرسال طلبات السحب:

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.sourceSets {
        main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
    }
    ....
}

ولكن يجب أن الأسماء لا تتصادم مما يعني أنك سوف لا تزال بحاجة الى أسماء مثل sandwiches_tunaOnRye ولكنك لن تكون قادرة على قسم منفصل لجميع السندويشات الخاص بك.

وهذا يسمح لك لتخزين الموارد الخاصة بك في هياكل مختلفة (مفيدة لصناعة السيارات ولدت محتوى مثل actionbargenerator)

واحد طريقة للحصول على جزئيا للتغلب على المشكلة هو استخدام لاحقة مستوى API. يمكنني استخدام الدقة / تخطيط-V1، RES / تخطيط V2 وغيرها لعقد مشاريع فرعية متعددة في نفس إيه بي كيه. ويمكن استخدام هذه الآلية لجميع أنواع الموارد.

ومن الواضح أن هذا لا يمكن استخدامه إلا إذا كنت تستهدف مستويات API فوق RES / تخطيط الخامس؟ الذي تستخدمه.

وأيضا، احترس من الأخطاء في الروبوت 1.5 و 1.6. راجع وثائق Andoroid حول لاحقة مستوى API .

ومع ظهور نظام المكتبة، إنشاء مكتبة في مجموعة كبيرة من الأصول يمكن أن يكون حلا.

وانها لا تزال مشكلة واحدة يجب تجنب استخدام نفس الأسماء في جميع الأصول ولكن باستخدام نظام البادئة في مكتبة ينبغي أن تساعد في ذلك.

وانها ليست بسيطة مثل القدرة على إنشاء مجلدات ولكن أن يساعد الامور حفظ عاقل ...

وهناك حلا لهذا الوضع: يمكنك إنشاء resVector (على سبيل المثال) المجلد على نفس مستوى مجلد res الافتراضية. هناك يمكنك إضافة أية مجلدات الموارد drawable-xxx هناك:

resVector
-drawable
-layout
-color

وبعد ذلك كل ما عليك هو إضافة

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

وفي ملف build.gradle الخاص بك (داخل android { }).

وهذه ليست الطرق المثالية. لديك لتنفيذ نفس الطريق الذي هو عرض <لأ href = "http://vogella.blogspot.in/2014/01/how-to-add-or-import-image-in-drawable.html" يختلط = "نوفولو "> هنا .

ويمكنك أيضا استدعاء الصورة ضمن المجلد من خلال رمز يمكنك استخدام

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

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

وليس الألغام ولكنني وجدت هذا الموضوع عندما تبحث عن هذه المسألة، إذا كان استخدام الروبوت الخاص بك ستوديو وGradle نظام بناء السهل جدا أي ملحقات ضرورية مجرد تحرير القليل ملف محاولاتها

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

وGradle مع الروبوت ستوديو يمكن أن تفعل ذلك بهذه الطريقة (<لأ href = "http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Project-Structure" يختلط = "نوفولو"> رابط ).

وانها في الفقرة "تكوين هيكل"

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

وإنشاء مجلد في main.  مثل: "res_notification_btn '

ووإنشاء مجلد شجرة في. مثل '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?("/")
}

باش تسطيح مجلد النصي الذي يحول التسلسل الهرمي للمجلد إلى مجلد واحد

والأصول /     يمكنك استخدامها لتخزين الملفات الأصول الخام. يتم تجميع الملفات التي تقوم بحفظها هنا في ملف apk. لكما هو، والحفاظ على اسم الملف الأصلي. يمكنك التنقل في هذا الدليل بنفس الطريقة كنظام ملف نموذجي باستخدام محددات وقراءة الملفات ك دفق بايت باستخدام AssetManager. على سبيل المثال، وهذا هو موقع جيد للمواد وبيانات اللعبة. http://developer.android.com/tools/projects/index.html

لا يسمح الدلائل الفرعية، يجب أن يحتوي على مورد فقط [A-Z0-9 _.].

ولا يكون لديك الأحرف الكبيرة، ومائلة لا إلى الأمام.

  1. انقر بزر الماوس الأيمن على Drawable
  2. حدد جديد ---> الدليل
  3. أدخل اسم الدليل.على سبيل المثال:logo.png(سيظهر الموقع بالفعل المجلد القابل للرسم بشكل افتراضي)
  4. انسخ الصور والصقها مباشرة في المجلد القابل للرسم.أثناء اللصق، يمكنك الحصول على خيار اختيار mdpi/xhdpi/xxhdpi وما إلى ذلك لكل صورة من القائمة.حدد الخيار المناسب وأدخل اسم الصورة.تأكد من الاحتفاظ بنفس اسم اسم الدليل، أي logo.png
  5. افعل نفس الشيء مع الصور المتبقية.سيتم وضعها جميعًا ضمن المجلد الرئيسي logo.png.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top