هل يمكن أن يحتوي دليل Android القابل للرسم على أدلة فرعية؟
-
21-08-2019 - |
سؤال
في وثائق 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
"، وكنت ما عليك القيام به كتلة إعادة تسمية بدلا من مجرد نقلها إلى الدليل)؛ ولكن تعقيد منطق برمجة الخاص بك لا تعاني <م> من م> سيئة مقارنة مع ما يعادل بنية المجلد.
وهذا الوضع تمتص حقا. الروبوت هو خليط من قرارات التصميم رائع ورهيب. يمكننا أن نأمل فقط للجزء الأخير للحصول على اجتثاث مع جميع بالسرعة الواجبة:)
ونعم - أنها لا تمتص :) ولكن يمكنك استخدام مجلد الأصول ولها الدلائل الفرعية في هناك، وتحميل الصور بهذه الطريقة
ومجلد استخدام الأصول.
ونموذج التعليمات البرمجية:
InputStream is = null;
try {
is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
;
}
image = BitmapFactory.decodeStream(is);
لقد كتبت مكونًا إضافيًا لـ Eclipse يسمح بإنشاء مجلد فرعي افتراضي عن طريق فصل اسم الملف بشرطتين سفليتين __
.المشروع في مراحله الأولى، لكن لا تقلق لأنه لن يؤدي إلى تعطل IDE الخاص بك
يمكن العثور على مزيد من التفاصيل هنا، فلا تتردد في إرسال طلبات السحب:
وأود أن استخدام سيناريو بسيط لشد بنية الدليل نظمت المقدمة من قبل المصممين لشيء والتي يمكن استخدامها لإنشاء ملف 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 نظام بناء السهل جدا أي ملحقات ضرورية مجرد تحرير القليل ملف محاولاتها
و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 _.].
ولا يكون لديك الأحرف الكبيرة، ومائلة لا إلى الأمام.
- انقر بزر الماوس الأيمن على Drawable
- حدد جديد ---> الدليل
- أدخل اسم الدليل.على سبيل المثال:logo.png(سيظهر الموقع بالفعل المجلد القابل للرسم بشكل افتراضي)
- انسخ الصور والصقها مباشرة في المجلد القابل للرسم.أثناء اللصق، يمكنك الحصول على خيار اختيار mdpi/xhdpi/xxhdpi وما إلى ذلك لكل صورة من القائمة.حدد الخيار المناسب وأدخل اسم الصورة.تأكد من الاحتفاظ بنفس اسم اسم الدليل، أي logo.png
- افعل نفس الشيء مع الصور المتبقية.سيتم وضعها جميعًا ضمن المجلد الرئيسي logo.png.