loading...

طراحی اپلیکیشن در مشهد

بازدید : 55
چهارشنبه 11 تير 1404 زمان : 13:11


مشکلاتی که ممکن میباشد با آن ها مواجه گردید
ممکن میباشد با یک کتابخانه فرد ثالث مواجه گردید که مایحتاج میباشد به‌روزرسانی گردد. برای مثال بعضا اشخاص متوجه گردیده‌اند که ورژن کنونی SqlDelight به یک ورژن دیرین از کتابخانه Room persistence نیاز دارااست. به این ترتیب تقاضای یک به‌روزرسانی کرده‌اند و Square ورژن به‌روز گردیده کتابخانه را عرضه نموده است. در صورتی‌که با اینگونه ایراد‌هایی مواجه شدید، هر چه زودتر از بسط‌دهنده تقاضای به‌روزرسانی بکنید، عالی میباشد. جدیدترین ورژن از Room یعنی ورژن 2.1 هم در حال حاضر مستلزم AndroidX میباشد که احتمالاً سبب ساز شود اکثری از اشخاص این ارتقاء را جاری ساختن دهند. در حین کتابت این نوشته ی علمی Facebook SDK همچنان به‌روز نشده میباشد و این قضیه احتمالاً برای اشخاص متعددی طراحی اپلیکیشن در مشهد موجب بروز نقص‌ شود.
به‌روزرسانی پروژه به واپسین ورژن از AppCompat ممکن میباشد چندان معمولی نباشد. درین فرآیند ممکن میباشد مشکلاتی در کد شما وجود داشته باشد که از باگ‌های پیشین بر مکان باقی مانده‌اند و یا این که این ارتقاء مستلزم بعضی ویرایش‌های عمده در کد باشد. برای این مسائل می بایست از پیش اپلیکیشن‌ریزی کرده باشید.
پوشه‌های منبع از سوی Jetifier تغییر تحول نمی‌یابند و از این رو ممکن میباشد هنگام استعمال از مستندات مبتلا سردرگمی گردید.
نمی‌اقتدار مطابق ماژول Jetify کرد و از این رو این کار یک فعالیت «کلیه یا این که هیچ» روی کد شما به حساب می آید. این فرآیند احتمالاً موجب توقف فرآیند پیشرفت مداوم پروژه خواهد شد و یا مشکلاتی در طی مخلوط کدهای پیشرفت تولید نماید.
ابزار نگاشت قادر است تعلق‌های آلفا (alpha) برای مثال ConstraintLayout alpha را در کد شما درج نماید.
اندروید استودیو در ارتباط Jetifier اگاهی دارااست و خطاهایی را درین خصوص آرم میدهد. اجرای یک عملیات «Invalidate Cache and Restart» میتواند این اختلال را رفع نماید.
Jetifier کد ساخت‌و‌ساز گردیده را تغییر تحول نمی‌دهد و بدین ترتیب درین خصوص به عمل بیشتری نیاز میباشد.
بعضی از اسم‌های جایگزین به صحت نگاشت نمیشوند (که اکثر آنان به صورت عمده در کتابخانه design قرار دارا‌هستند). ابزار refactor درین مفاد شغل نخواهد کرد و کد شما کامپایل نمیشود. برای حل این اختلال می بایست به صورت دستی ایمپورت‌ها را رسیدگی نمائید. خوشبختانه این ایرادات در طول فرصت به کمترین مقدار رسیده‌اند، زیرا این ابزار به بلوغ رسیده و باگ‌ها در ابزار Reactor اصلاح میگردند.
نکته اثر گذار: قاعده اسم‌گذاری استاندارد در Jetpack به کار گیری از یک نسخه برداری از اسم بسته در خصوصیات Mavem میباشد. در جت‌پک، بسته همواره با groupid یکسان میباشد.

برای مثال چنانچه بدانید که اسم بسته «androidx.webkit» بوده میباشد، در این حالت این تعلق به «androidx.webkit:webkit:VERSION» نگاشت گردد.

حرف نهایی
از پیشین در زمینه ی تغییرات ما یحتاج ابزار مسافرت به Jetpack استحصال استحضار نمایید. سخت ترین قسمت این افزایش احتمالاً به‌روزرسانی پروژه برای به کار گیری از جدیدترین تعلق‌ها میباشد. ممکن میباشد برخی کتابخانه‌های فرد ثالث هنوز به‌روزرسانی نشده باشند. اساسی میباشد که‌این مورد ها را شناسایی کرده و از توسعه و گسترش‌دهنده تقاضا فرمایید که آنها را به‌روزرسانی نماید.

چه طور یک کتابخانه اندروید در React Native بسازیم؟ – راهنمای جامع توسعه یافته
در‌صورتی‌که یک گسترش‌دهنده جاوا اسکریپت باشید و از شما منظور گردد که در قسمت native در فریمورک React Native عمیق گردید، احتمالاً با مشکلاتی مواجه خواهید شد. ما درین نوشته با اکران یک نحوه سهل و آسان برای ساخت و استعمال از کدهای native که میتوانند یک SDK جاوا را به صورت یک کتابخانه کپسوله‌سازی نمایند، نشانه میدهیم که‌این شغل به هیچ عنوان مشقت بار وجود ندارد. مستندات فعال‌سازی و اجرای کدهای native در فریمورک React Native به طور کاملً اثرگذار میباشد. با این وجود گرد هم آوردن کلیه این نصیب‌های گوناگون به طور یک کتابخانه کارآمد، میتواند کاری بحران‌برانگیز و مجال‌بر باشد.
به همین استدلال این ریپازیتوری گیت‌هاب (+) برای یاری به فعال‌سازی و اجرای موردها ما یحتاج برای توسعه و گسترش کتابخانه فراهم گردیده‌است که مشمول موردها پایین میباشد:

اجرای یک Promise در جاوا از یک نرم افزار React Native و عوض کردن شرایط بر مبنای سود.
اجرای یک سیاق در جاوا و گوش دادن به یک callback برای جواب (DeviceEventEmitter). این حالت مشابه رفتاری میباشد که هنگام پوشش SDK-های فرد ثالث نیاز داریم.
آزمایش کردن با Jest.
فضا پیشرفت سریع با یک نرم افزار آزمایش.
شایسته ترین منش‌ها از react-native-create-bridge و react-native-create-library.
شایسته ترین شیوه برای ارتقا سرعت پیشرفت یک کتابخانه، این میباشد که آغاز بدین عمل بکنیم. براین اساس پیرو به توضیح نحوه ساخت boilerplate می پردازیم. کد انتهای هر مرحله را میتوانید در‌این ریپو (+) پایین «STEP_NUMBER» ببینید.

قدم اولیه – جاوا اسکریپت و ساختار کتابخانه
قبل از هر چیز خوب میباشد تحقیق کنیم که آیا حقیقتاً به یک کتابخانه نیاز داریم یا این که خیر. در شرایطی‌که می خواهید وسعت پایینی از کد native را که رابطه تنگاتنگی با نرم افزار شما دارااست تولید نمائید، سریع‌ترین و شایسته ترین طرز ساخت یک native درون نرم افزار میباشد. به این مراد react-native-create-bridge نقطه آغاز بسیار خیر و خوبی به حساب میآید. ما قصد داریم از کدی که پیرو معرفی خوا هیم کرد به کار گیری کنیم. در صورتی درین خصوص در گیر تردید می باشید، می توانید از همین مسیر فعالیت را استارت فرمایید و از قدم‌های آتی این نوشته الهام گرفته و به رفع خطاها بپردازید. زیرا تبدیل یک ماژول به کتابخانه شغل دشواری وجود ندارد.


کلیک فرمائید
ما قصد داریم یک کتابخانه جدا از هم تولید کنیم که بتوان در نرم افزار‌های گوناگون از آن به کار گرفت و به احتمال بالا مقادیر بالایی از یک SDK نیتیو را نیز مشتمل بر میگردد. برای مثال یک SDK از سوی مشقت بار‌افزار سفارشی اندروید ارائه میگردد.

فعالیت خویش را با ابزار سفارش گردیده از سوی مستندات ری‌اکت نیتیو (+) استارت میکنیم:

$ npm install -g react-native-create-library
$ react-native-create-library TestLib
بنابراین مبنا قابل قبولی برای کتابخانه به دست می آوریم، با این وجود، شاید همچنان شم فرمایید که درباره‌ی کیفیت گرد هم آوردن این قسمت‌ها سردرگم میباشید. برای این که‌این مورد پر‌نور گردد، در پی این مرحله قصد داریم روی ساختار کد کتابخانه خویش متمرکز گردیده و یک نرم افزار مثال برای آزمایش ساخت‌و‌ساز کنیم.

نرم افزار مثال
ابتدا می بایست یک سری عمل مدیریتی اعمال دهیم. یک فایل به اسم library تولید کرده و کلیه محتوای فایل TestLib را به آن جابجایی میدهیم. بعد از آن فرمان react-native init ExampleApp را برای آزمایش کردن نرم افزار خویش انجام میکنیم.

فعلا قادر خواهیم بود کیفیت استعمال از کتابخانه خویش را با کارایی برای تصاحب کردن پاره ای از آن تمجید کنیم. تغییراتی که بایستی در App.js ساخت‌و‌ساز خواهد شد را به دنبال مشاهده میکنید:

import RNTest from \'react-native-test-lib’  - کتابخانه ما
state – برای حفظ جواب خالص از کد نیتیو ما.
()getNativeResult که یک تابع ناهمگام میباشد و آغاز state.nativeResult را به طور loading… تهیه و تنظیم می‌نماید و درپی به طور یک اشتباه با پاسخی از Promise به اسم ()RNTest.getValaue انتخاب میشود.
ما در JSX خویش مقدار this.state.nativeResult اکران داده و یک دکمه برای فراخوانی ()getNativeResult اضافه می کنیم.
همینطور می بایست package.json خویش را بازنویسی کنیم تا دربرگیرنده کتابخانه ما که هم فعلا در App.js ایمپورت کردیم باشد و هم پا با آن یک شیوه برای به‌روزرسانی این کتابخانه در هنگام ساخت‌و‌ساز تغییرات داشته باشیم. در‌پی اسکریپت updateLib ماژول‌های گره را حذف کرده و کش را تمیز می‌نماید. آن‌گاه بسته‌های ما مجدداً نصب گردیده و React Native packager استارت میگردد.

DEPENDENCY: "react-native-test-lib": "../library"

SCRIPT: “updateLib”: “rm -rf node_modules/ && yarn --reset-cache && yarn start”
ولی می‌قدرت این شرایط را فارغ از نیاز به حذف همگی node_modules نیز باصرفه‌سازی کرد. همینطور قابل ذکر میباشد که شما بایستی چنانچه که کد نیتیو تغییر‌و تحول یابد، نرم افزار خویش را rebuild کرده و نصب نمایید.

ساخت چارچوب کتابخانه
غرض مهم ما این میباشد که لایه‌های به طور کاملً تعریف و تمجید گردیده‌ای از انتزاع را در تک تک مسیر از Native تا جاوا اسکریپت ساخت‌و‌ساز کنیم. این ساختار نیازمند تأیید این حیث میباشد که تایپ کردن جاوا اسکریپت به کدنویسی جاوا ترجیح دارااست.

با در حیث داشتن این قاعده یک فولدر testBridge ساخت و ساز میکنیم که مشمول کلیه کدهای جاوا اسکریپت میباشد.

> testBridge
> __tests__ -> Will contain our tests
> bridgeOperations -> Operations available in native
getValue.js -> Calls the getValue native code
index.js -> Defines the bridge and exports operations
> library -> Contains the features of our library
index.js -> Crafts the library API
index.js -> exports our library to the world ?
در صورتیکه توضیح کد فوق را از آخر شروع کنیم، testBridge/bridgeOperations/index یک بریج تمجید می‌نماید که گزینه به کار گیری قرار میدهیم. در این باره NativeModules.RNTestLib اسم بریج میباشد و آن را به تمامی bridgeOperation-ها (مانند getValue) ارسال میکنیم. این‌ها متدهای جاوا میباشند که هریک در فولدر خویش تعریف و تمجید گردیده‌اند. دو برهان برای این مورد وجود دارااست: ابتدا این که قصد داریم از بضاعت مشابه سای بریج برای آزمایش کردن استعمال کنیم و دوم این که نظارت می کنیم در حالتی‌که کد نیتیو متبوع غامض باشد و عملیات به تطهیر نیاز داشته باشد چه فیس می دهد. برای مثال فرض نمائید یک روال جاوا که سیاق callback مجزایی داراست را اعمال کنیم و از DeviceEventEmitter برای ارسال مقدار callback منفعت بگیریم. در‌این‌صورت مطمئناً بسیار خوب میباشد کد کتابخانه یک promise اخذ نماید و با مکانیسم درونی کد نیتیو و emmiter روی داد، رمز و فعالیت نداشته باشد.

در‌پی یک API که در testBridge/library/index ساخته شده است را اکسپورت می کنیم و این فولدر ممکن میباشد مشتمل بر تعدادی پوشه باشد که خصوصیت‌های کتابخانه ما مانند الحاق یک سری bridgeOperations به API منزه را ارائه می‌نمایند. از جمله فرض نمایید می خواهید کتابخانه شما یک تابع connect را اکسپورت نماید؛ ولی میخواهید این عمل در دو bridgeOperation به اسم‌های checkPermission و connect جاری ساختن گردد. این به عبارتی جایی میباشد که پوشه‌های اجرایی این عملیات در آن قرار دارا‌هستند. این شرایط در نمودار پایین عده‌بندی گردیده است:

آن چه دراین مکان ساخت کرده‌ایم، سطح های مشخصی از انتزاع از کد نیتیو میباشد. bridgeOperations/ بایستی کارکرد درونی کد نیتیو مارا شعور نماید تا بتواند رابط منزه جاوا اسکریپت را اکسپورت نماید؛ البته library/ جایی میباشد که خصوصیت‌هایی از bridgeOperations ساخت‌و‌ساز می شوند تا API نرم افزار ما آیتم به کار گیری قرار دهد.

فعلا شایسته ترین فرصت برای رسیدگی ساختار ماژول و شناخت بی نقص با آن میباشد. شما می توانید نرم افزار مثال را ایفا فرمایید، دکمه را فشار دهید و چشم به راه پاسخی از promise ما به اسم bridgeOperations/getValue.js باشید. همگی چیزهایی که تا این جا نظارت کردیم در شاخه STEP-ONE کد منبع ما قابل مشاهده میباشد.

بازدید : 56
سه شنبه 10 تير 1404 زمان : 17:46


کاغذ اسپلش
ورقه آغازین یا این که splash screen ابدا معنا جدیدی محسوب نمیشود، ولی تحت عنوان اولیه چیزی که یوزرها در نرم افزار ما می بینند، در صورتیکه به طراحی اپلیکیشن در مشهد صحت پیاده‌سازی نشده باشد، به طرزی واضح زشت خواهد بود.

برای مثالً ممکن میباشد از یک کارتن ورودی 5 ثانیه‌ای قشنگ به کار گیری کرده باشید که هر توشه مخاطب نرم افزار را گشوده می‌نماید به او اکران داده می شود. همینطور ممکن میباشد ما یحتاج باشد قبل از آن که بتوان چیز معناداری به استفاده کننده اکران اعطا کرد، برخی داده‌ها وجود داشته باشند که بایستی دانلود شوند. ولی در صورتیکه تا به امروز برگه‌ای به نرم افزار اضافه کرده باشید که صرفا وظیفه آن مسدودسازی استفاده کننده از حصول سریع به شیت اساسی نرم افزار بوده میباشد، عالی میباشد در شیوه‌های خویش تجدیدنظر نمائید، زیرا امروزه طرز‌های بهتری هم برای حل این مشکل ها وجود دارا‌هستند.

نرم افزار‌های اندرویدی قبل از آن که مشی ()onCreate اول اکتیویتی فراخوانی خواهد شد، به بازه زمانی هنگامی برای بار گذاری نیاز دارا‌هستند. در زمان این بازه زمانی پوسته windowBackground نرم افزار روی برگه ترسیم می‌گردد. شایسته ترین کاغذ اسپلش تنهاً یک پس‌مورد سفارشی drawable برای پوسته میباشد که در لحظه ساخت اول اکتیویتی override می‌گردد.

کلام آخری
با این که نرم افزار‌های غالب امروزی جنبه‌های مختلفی دارا هستند، البته درین نوشته‌علمی به رسیدگی چهار گزینه از مواقعی که احتمالاً می‌قدرت درباره‌ی هر نرم افزار اندرویدی جاری ساختن کرد پرداختیم. آن‌ها‌را می‌اقتدار به طور یک الزام مقدماتی برای یک دست‌سازی تجربیات کاربری نرم افزار در شم و حالا کلی اندروید در لحاظ گرفت. با این که پیاده‌سازی بعضی از این مفاد مستلزم نرم‌افزار‌ریزی و کارایی پیاده سازی بیشتری میباشد، ولی مطمئن باشید این موضوعی وجود ندارد که بتوان در زمینه ی آن محافظه‌کاری به خرج اعطا کرد. سود ساخت نرم افزار‌هایی که بخشی طبیعی از سیستم استدلال به حیث می‌رسند، پدید وارد شدن یک اکوسیستم بالغ‌خیس میباشد و همه ما می بایست به آن سمت تکان کنیم.

تأثیر Enum بر کارایی نرم افزار اندروید – راهنمای کاربردی
در طول عمل روی نرم افزار‌های اندرویدی در مورد ها گوناگون از اشکال Enums استعمال میکنیم، زیرا کارآمد می باشند، البته ممکن میباشد تأثیر بی نقص آن‌ها‌را روی نرم افزار اندرویدی ندانید. Enum-ها یک طرز سهل محسوب میشوند، ولی متأسفانه وقتی که به مصرف یاد آنها و سرعتشان نگاه می کنیم نتیجه ها خوشایندی نمی بینیم. درین نوشته‌ی‌علمی به تحقیق تأثیر Enums بر کوشش نرم افزار اندروید میپردازیم.
Enum چیست؟
Enum در جاوا یک نوع داده میباشد که دربرگیرنده دسته مشخصی از اثبات‌ها میباشد. این یک نوع داده خاص میباشد که به ما قابلیت و امکان میدهد یک متغیر را روی یک کدام از مقادیر اثبات از پیش انتخاب‌گردیده تهیه و تنظیم کنیم. متغیر آن بایستی موازی با یک کدام از مقادیری باشد که از گذشته برایش تعریف و تمجید گردیده‌است.

کلیک فرمایید
چرا بایستی از Enum استعمال کنیم؟
ما از Enum در مواقعی به کارگیری می کنیم که یک متغیر بتواند فقط یک مقدار را از دربین یک دسته از مقادیر ممکن بگیرد. به نمونه پایین دقت نمایید:

1public enum Fruits{ Apple, Bannana, Grape, Mango }

در حال حاضر enum به اسم Fruits صرفا یک مقدار می تواند بگیرد و هیچ مقدار دیگری به جز آن چه برایش تمجید گردیده است نیست. ولی درصورتی که از یکی درست یا این که اثبات فن‌ای به کارگیری کنیم، ممکن میباشد اثبات‌های غیرمجازی را به آن ارسال کنیم. براین اساس برای خودداری از این خطاهای اثبات غیرمجاز و برای ارتقا بررسی ها در طول کامپایل در کل از یک enum به کارگیری میکنیم.

هزینه Enum-ها
مقادیر Enum در مقایسه با یک اثبات int یاد بیشتری مصرف می‌نمایند. اضافه کردن یک Enum منفرد موجب ارتقاء اندازه فولدر DEX آخری به واحد سنجش 13 موازی در قیاس با استعمال از اثبات درست میشود. عامل این فرمان آن میباشد که هر مقدار در یک کلاس Enum تحت عنوان یک شیء تلقی میگردد و هر مقدار بخشی از خاطر هیپ را برای ارجاع به شیء اشغال می‌نماید. این موقعیت موجب مصرف شدن خاطر متعددی میگردد.

شاید حتی اگاهی نداشته باشید که به کارگیری از Enum موجب تأثیر روی سعی نرم افزار می شود. شاید تایپ کردن یک یا این که دو enum روی کوشش کلی نرم افزار تأثیر قابل توجهی نداشته باشد، ولی در‌صورتی‌که از برخی کلاس‌های Enum در نرم افزار خویش استعمال میکنید و بعضی کتابخانه‌ها وجود دارا‌هستند که از کلاس‌های Enum دیگری به کارگیری می‌نمایند، به طور کلی تأثیر عمده‌ای روی نرم افزار داشته باشند و اندازه پوشه را ارتقاء داده و روی کوشش نرم افزار نیز تأثیر سوئی بگذارند.

نکته: کلاً به کارگیری از Enum-ها در هیچ بخشی از کد نرم افزار پیشنهاد نمی شود.

راه حل
اندروید از طیف متنوعی از کناره‌نویسی‌ها از روش کتابخانه Annotations Support تامین می‌نماید. از روش پکیج android.support.annotation میتوانید به‌این کتابخانه دسترسی داشته باشید. این کتابخانه کناره‌نویسی از نوع TypeDef دارااست. این لبه‌نویسی وجود یک پارامتر خاصی، مقدار بازگشتی، یا این که فیلدی که به دسته خاصی از اثبات‌ها ارجاع میدهد را ضمانت می‌نماید. همینطور موجب می شود کامل شدن کد به طور خود کار، اثبات‌های مجاز را سفارش نماید.

IntDef@ و StringDef@ دو آیتم از لبه‌نویسی‌های اثبات می باشند که می توانند به مکان enums برای اثبات‌های int و حرفه‌ای به کارگیری شوند و موجب ایمنی فرصت build میگردند. این کناره‌نویسی‌ها به ما یاری می‌نمایند که آرگومان‌های متغیر را به روشی مانند enum-ها در طول کامپایل رسیدگی کنیم.

چه‌طور از Annotations به کار گیری کنیم؟
این زمینه را با طرح یک نمونه رسیدگی میکنیم. فرض فرمایید کلاس Fruit را با دسته‌ای از اثبات‌های int داریم. بدین ترتیب در حین ساخت شیء بایستی مقدار نوع int را از گروه جانور ارسال کنیم. البته در روال main یک مقدار ارسال میکنیم که در گروه اثبات‌ها نیست و باعث به وضعیت خلل سازی می گردد. در قطعه کد پایین هیچ نوع «امنیت نوع» (type safety) نیست:

1public class Fruit {
2 public static final int APPLE = 0;
3 public static final int BANNANA = 1;
4 public static final int GRAPE = 2;
5 public static final int MANGO = 3;
6public Fruit(int fruit) {
7 System.out.println("Fruit Selected:" + fruit);
8 }
9public static void main(String[] args) {
10 //Passing Invalid value
11 Fruit fruit = new Fruit(4);
12 }
13}

در‌پی پیاده‌سازی کد مشابهی وجود دارااست که از enums به طور تحت استعمال می‌نماید:

1public class EnumFruit {
2 public EnumFruit(Fruit fruit) { .
3 System.out.println("Fruit selected is:" + fruit);
4 }
5public enum Fruit {
6 APPLE, BANNANA, GRAPE, MANGO
7 }
8public static void main(String[] args) {
9 EnumFruit enumFruitInstance = new EnumFruit(Fruit.APPLE);
10 }
11}

تعلق کناره‌نویسی مدد را در build.gradle سطح نرم افزار اضافه می کنیم:

1dependencies {
2 implementation \'com.android.support:support-annotations:28.0.0\'
3}

اثبات‌ها و IntDef@ را برای این اثبات‌ها اعلان می کنیم:

1public class AnnotationFruit {
2 public static final int APPLE = 0;
3 public static final int BANNANA = 1;
4 public static final int GRAPE = 2;
5 public static final int MANGO = 3;
6
7 public AnnotationFruit(@Fruit int fruit) {
8 System.out.println("Fruit Selected is :" + fruit);
9 }
10@IntDef({APPLE, BANNANA, GRAPE, MANGO})
11 @Retention(RetentionPolicy.SOURCE)
12 public @interface Fruit {}
13public static void main(String[] args) {
14 AnnotationFruit annotationSeason = new AnnotationFruit(GRAPE);
15 }
16}
مشاهده بدون نقص کدها
در نمونه فوق کناره‌نویسی Typedef از موردها ذیل به کار گیری می‌نماید:

از interface@ برای اعلان نوع لبه‌نویسی شمارشی تازه به کارگیری می‌نماید.
از لبه‌نویسی‌های IntDef@ و StringDef@ یار با Retentio@ به کار گیری می‌نماید که برای تعریف و تمجید نوع شمارشی ضروری می‌باشند.
کناره‌نویسی Retention(RetentionPolicy.SOURCE)@ به کامپایلر اعلام می‌نماید که داده‌های لبه‌نویسی شمارشی را در پوشه ‎.class ذخیره نکند.

Setter-ها و getter-ها را می‌اقتدار به طور ذیل تعریف‌و‌تمجید کرد:

1// Decorate the target methods with the annotation
2 @Fruit
3 public abstract int getFruitName();
4// Attach the annotation
5 public abstract void setFruitName(@Fruit int fuitValue);

درصورتی که Proguard به صدق تنظیمات گردیده باشد، قادر است enum-ها را به نیابت از ما در پاره‌ای یا این که اکثری از وضعیت‌ها به طور مقادیر int با صرفه‌سازی نماید. براین اساس مکان نگرانی نیست.

صحبت نهایی
Enum-ها در مقایسه با اثبات‌های بی آلایش دست‌کم دو موازی به بایت‌های اندازه کلی APK اضافه می‌نمایند و در مقایسه با اثبات‌های مساوی حدود 5 تا 10 موازی RAM بیشتری اشغال می‌نمایند. از این رو در حالتی‌که می خواهید نرم افزار شما از حیث مصرف یاد و همت باصرفه باشد، بایستی از به کار گیری از enum-ها در کد خویش اجتناب فرمائید.

بازدید : 36
دوشنبه 9 تير 1404 زمان : 16:09


پلتفرم نرم افزار‌های ذیل اینترنت
این پلتفرم راه‌حل بسیار قابل قبولی برای فراروگریز از نقطه ضعف‌های پلتفرم‌های رایانه‌های فردی و لپتاپ و موبایل‌های موبایل میباشد. مهمترین نمونه برای این مسئله قابلیت و امکان اجرای نرم افزار‌های مرتبط با IOS در بستر اینترنت میباشد که امکان دانلود و نصب آنان به جهت تحریم‌ها جانور طراحی اپلیکیشن در مشهد وجود ندارد.

از سایر مزایای این پلتفرم آپ تو دیت سهل و آسان با قرار دادن ورژن‌ی تازه نرم‌افزار بر روی اینترنت سرور میباشد.

در نقطه ی مقابل محدودیت هایی مانند قابلیت و امکان جواب دیر و یا این که نا مطلوب به جهت توکل داشتن بر روی سرور و تعلق به وب و یا این که ضعف امنیتی در شکل نفوذ هکرها به سرور اپلیکیشن وجود داراست.

این نرم افزار ها عموما بر روی مرورگر های اینترنت ایفا گردیده و کد نویسی آنان در دو سمت استفاده کننده و سمت سرور بوسیله متخصصان هر قسمت اعمال می شود.برای نرم‌افزار نویسی سمت استفاده کننده اکثرا از گویش های HTML , جاوا اسکریپت و CSS و برای تشکیل داد سمت سرور از گویش های AJAX , PHP و ASP.NET به کار گیری میگردد.

ضمنا برای تشکیل داد اپلیکیشن ها در بستر اینترنت یک راه و روش دیگر به اسم وردپرس وجود داراست.وردپرس به طور کلی یک کدام از بی آلایش ترین شیوه ها برای تشکیل داد اپلیکیشن های ذیل اینترنت میباشد ( سوای کمترین نیاز به کد نویسی ).ولی در طرف مقابل در کاربرد ها دارنده محدودیت های متعددی میباشد ( گرچه خویش نرم افزار های پلتفرم اینترنت نیز نسبت به بقیه پلتفرم ها در کاربرد محدودتر می‌باشند ).

نرم افزار های کراس پلتفرم
در مجموع ایجاد کرد یک نرم افزار برای یک پلتفرم خاص (اصطلاحا پیاده سازی NATIVE) هم زمانبر خیس و هم هزینه بلندتر میباشد.پس ایده ی قابلیت و امکان اجرای یک اپلیکیشن بر روی کل پلتفرم ها با یک توشه کد نویسی برای یک پلتفرم خاص , ایده ای جالب و دیدنی به حیث می‌آید.

جهت مشاهده “مثال فعالیت پیاده سازی نرم افزار” کلیک فرمایید.

ابزار تشکیل داد نرم افزار های کراس پلتفرم
تا ایجا با 4 مثال از اشکال آشنا شدیم. حال به سراغ معرفی 13 پلتفرم از نوع کراس خوا‌هیم رفت.

زوجو
با این برنامه می‌توانید برای پلت هیبت های رایانه های فردی و لپ تاپ ( ویندوز , مک وی اس و لینوکس ) , تلفن های یار ( IOS ) و حتی رایانه های تک بردی ( مانند رزبری پای ) ساخت اپلیکیشن فرمایید.

پلتفرم APPMAKR
این پلتفرم مطلوب برای ایجاد کرد نرم افزار های اندروید , IOS و HTML5 است.

مزایای این پلتفرم عباتند از:

🔹 برخورداری از آلبوم تصاویر

🔹 آپ دیت رسانی های بی آلایش

🔹 پخش موسیقی و ویدئو

🔹 فضا های چت و بحث

🔹 به کارگیری از لوکیشن های گوگل مپ

🔹 داشتن روزنگار و مغازه های نرم افزار

🔹 هواخواهی از پنل رئیس

🔹 قابلیت تغییر‌و تحول ظواهر و نمای نرم‌افزار

برای پیشنهاد “پیاده سازی نرم افزار پیشنهاد خوراک” کلیک فرمایید.

پلتفرم GAMESALAD
قابل انعطاف افزاری مجانی برای تشکیل داد بازی های مک وی اس , اندروید , IOS و HTML5 از روش تکنیک درگ اند دراپ و سوای نیاز به داشتن داده ها نرم افزار نویسی. از سایر مزیت های این اپلیکیشن میتوان به حمایت از پرداخت های باطن طرحی اشاره کرد.

پلتفرم APPY PIE
محیطی برای ایجاد کرد اپلیکیشن برای دور و بر های اندروید , IOS , ویندوز , HTML5 و بلک بری با به کارگیری از طریق درگ اند دراپ و سوای احتیاج به پی بردن علم کد نویسی.

مزایا و خصوصیت های این نرم‌افزار :

🔹 قابلیت و امکان نشر نرم افزار ها بر روی آی تونز و گوگل پلی

🔹 مشاهده ی استدلال‌ها به طور REAL TIME

🔹 قابلیت و امکان قرار دادن تبلیغات داخل نرم‌افزار ها

🔹 دفاع از استعمال از وضعیت مکانی دستگاه

🔹 امکان برقراری رابطه با رسانه های ثانوی مانند یک وبسایت

🔹 قابلیت و امکان تغییر تحول ظواهر و نمای نرم افزار

بازدید : 36
يکشنبه 8 تير 1404 زمان : 16:14


یادگرفتن seo وب سایت به یادگیری الگوریتم های موتور کاوش امداد می نماید.
با یادگرفتن بهینه سازی وب سایت، طرز شغل موتورهای کاوش و سکو بندی وبسایت های خویش برای مثال اینکه برای این شغل به چه مواقعی نیاز دارید فرا خواهید گرفت. ولی مورد نیاز میباشد بدانید که‌این شغل علاوه براینکه یک مهارت میباشد، راهی برای شعور موتورهای طراحی اپلیکیشن در مشهد کاوش میباشد.

سپرده گذاری بلندمدت.
seo وبسایت یک مراحل زمانبر زمان میباشد و فیض دادن به شما فرصت میبرد. این دستور یک فرایند مداوم و وقتگیر برهه زمانی میباشد و برای رجوع و برگشت سریع سرمایه، می بایست مایل باشید که برای دوران زمان بر آن را نگه دارید تا بهره نیکی حصول نمائید.

صرفه جویی در طول با فراگیری آنلاین بهینه سازی تارنما.
یک مزیتی که یادگرفتن های آنلاین دارا هستند، این میباشد که شما دیگر نیاز به صرف زمان فرصت برای رفتن و برگشتن از موسسه ندارید و فقط کاری که نیاز میباشد، این میباشد که پشت سیستم خویش بنشینید و به برگزیدگان فراگیری seo وبسایت دسترسی پیدا فرمایید.

دسترسی به شایسته ترین فراگیری های بهینه سازی وبسایت در سطح میهن.
چنانچه بومی یک شهر به دور افتاده باشید و از پایتخت مرزوبوم مسافت داشته باشید، به به عبارتی اندازه از یادگرفتن های حضوری بهتر هم دور خواهید بود. با وجود فراگیری های آنلاین شما دیگر محدودیتی در گزینش شایسته ترین دانش سرا ندارید و می‌توانید به شایسته ترین سطح از یادگرفتن seo وبسایت دسترسی پیدا نمائید.

ترافیک بیشتر اخذ نمایید.
با فراگیری seo وبسایت میتوانید ترافیک بیشتری را فارغ از هیچ هزینه ای از روش گوگل اخذ نمایید. این دستور به استحصال درجه برای لغات کلیدی بسیار رقابتی یاری می نماید. ترافیک ارگانیک بسیار عالی از ترافیک رسانه های اجتماعی میباشد.

فراگیری seo سایت.
با آموزش فراگیری بهینه سازی وب سایت، شما خواهید آموخت که چه گونه سایت خویش را با صرفه نمائید. این فعالیت به شما امداد می نماید تجربیات کاربری وب لاگ خویش را بهبود اعطا کرد تا بتوانید ترافیک ارگانیک بیشتری اخذ نمایید.

درآمدزایی بیشتر با فراگیری seo وبسایت.
ارتقاء seo تارنما منجر آوازه تجارت آنلاین شما میگردد و به شما امداد می نماید تا درآمد بیشتری استحصال فرمایید. در‌حالتی که در وب لاگ خویش تبلیغاتی را اکران می دهید، درآمدزایی بیشتر با بازدیدکنندگان بیشتر سهل وآسان میباشد.

ارتقای توان های شما با زمان های آنلاین یادگرفتن seo وبسایت
عصر های یادگرفتن بهینه سازی وبسایت به تقویت مهارت های بازاریابی اینترنتی

شما امداد می نماید. یک تکنیک اثر گذار سبب ساز به جذب ترافیک بیشتر به وبسایت شما و ارتقای تجارت شما می گردد که بازدید وبسایت متبوع را در نتیجه ها متعدد موتورهای کاوش بهبود میبخشد.
محافظت مرتبه بالا با یادگرفتن seo وبسایت.
این عصر ها به صورت بی واسطه به محافظت سکو های بالا در موتورهای کاوش امداد می نماید. در‌حالتی که میخواهید جايگاه سایت خویش را افزایش دهید، می بایست در تکنیک های بهینه سازی تخصص داشته باشید.

بازدید : 52
شنبه 7 تير 1404 زمان : 12:45


Dagger 2 در اندروید (قسمت دوم) – راهنمای توسعه یافته
در‌حالتی که از موضوعات منفی که پیرامون Dagger همواره مطرح بوده‌اند، تأثیر نپذیرفته‌اید و میخواهید از آن به کار گیری فرمائید؛ احتمالاً به سعی آن عنایت می‌دهید و می خواهید بیشترین بازدهی را از آن بگیرید. دراین‌صورت سفارش می کنیم این نوشته‌علمی را تا به طراحی اپلیکیشن در مشهد آخر پژوهش نمائید.
این نوشته‌ی‌علمی در واقع نصیب دوم «Dagger 2 در اندروید (نصیب اولیه) — راهنمای توسعه یافته» میباشد. مقصود ما در‌این نوشته‌ی علمی دیگر این وجود ندارد که دگر را بی آلایش‌خیس کنیم. در‌این نوشته می خواهیم مطمئن شویم که از دگر به به عبارتی ترتیبی که انتظار می‌رود به کارگیری میکنیم. برای مثال این حالت در اکثر اوقات مفاد منتهی به افزایش عملکرد می گردد. نکته بهتر این میباشد که مواقعی که در‌این راهنما ارائه می شوند به طور کاملً معمولی می باشند و مکان هیچ نگرانی وجود ندارد.

مواقعی که درین نوشته‌علمی ارائه خواهند شد را می‌اقتدار در فهرست پایین گردآوری‌بندی کرد:

از منطقه‌بندی غیرضروری اجتناب کرده و به دفعه‌های Reusable@ مداقه بدهید.
همواره کوشش نمائید از متدهای استاتیک استعمال نمائید.
چارچوب نرم افزار را به مکان ماژولی با «آرگومان تولیدکننده» (constructor argument)‌؛ از روش «کامپوننت ساز» (‌component builder) ‌عرضه نمایید.
در آزمایش‌ها ‌تعلق‌ها را به مکان اُورراید کردن (Overriding) ماژول‌ها؛ ‌از روش کامپوننت آزمایش سوئیچ فرمائید.
از دگر در آزمایش‌های واحد کلاس مفرد استعمال نکنید، زیرا به آن نیازی ندارید.
حوزه‌‌بندی (Scoping)


منطقه‌بندی متغیرها امری پرهزینه میباشد و می بایست در شکل قابلیت از آن اجتناب کرد. به این خواسته نوبت‌های سینگلتون می بایست به‌تدریج و صرفا در مواقعی به کار گیری شوند که حقیقتاً ما یحتاج میباشند. این مفاد محصور به وضعیت‌هایی می باشند که ساخت‌و‌ساز یک شیء، بسیار پرهزینه میباشد یا این که یک شیء را می‌اقتدار به صورت مکرر تولید و حذف کرد.


کلیک فرمائید
ولی یک نوع لبه گذاری منطقه خاص به اسم Reusable@ وجود داراست که بایستی با آن آشنا باشید. این نوع منطقه‌بندی اصولاً به دگر اعلام می‌نماید که در صورتیکه از تعلق مجدداً به کارگیری یا این که آن را مجدداً تولید نماید، مشکلی نخواهد بود و براین اساس دگر امور را در پشت صحنه به نحو احسن اجرا میدهد.

به صورت خلاصه می‌قدرت بیان کرد که تمجید کلاس‌های کاربردی بی‌وضعیت به طور Reusable@ ایده قابل قبولی به حساب میآید. ولی در حالتی‌که تولید کردن آن ها پرهزینه باشد و بخواهید از تکرار این پروسه در مفاد دیگر اجتناب فرمائید، احتمالاً نمی خواهید که به عبارتی دفعه از آن تعلق را به اشتراک بگذارید و از این رو Reusable@ مورد قابل قبولی محسوب نمی شود. در‌این مورد ها تعلق سوای حوزه‌‌بندی شایسته ترین مورد ممکن میباشد.

استاتیک
این یکی بی آلایش‌ترین و دیدنی‌ترین ارشاد‌ها به حساب می‌آید. شما بایستی اعتقاد و باور نتیجه ها فرمائید، متدهایی که ارائه میکنید استاتیک می باشند. تک تک ایده به همین آسانی میباشد.

هر ماژولی که متدهای Provides@ آن کلیه استاتیک باشند، در طی پیاده‌سازی به هیچ نوع نوبت‌ای نیاز نخواهد داشت.

در صورتی ماژول شما تنهاً متدهای provide استاتیک داشته باشد، دگر هیچ وقت نیازی به دفعه‌سازی از آن نخواهد داشت و در صورتی‌که نتوانید به جهت شرایط دار بودن ماژول این شغل را بکنید، می بایست این آیتم را یک توشه دیگر نظارت فرمائید.

پیشنهاد می گردد که ماژول‌ها فاقد شرایط باشند، زیرا در غیر این شکل خوی آن ها غیر قابل پیش‌بینی خواهد بود. به علاوه، نوبت‌های ماژول مجموعاَ به‌تدریج اثر گذار می باشند.

این راهنما احتمالاً یکی هویدا‌ترین مواقعی میباشد که در‌این نوشته مطرح کرده‌ایم؛ ولی این قضیه در دنیای کاتلین پاره ای بغرنج‌خیس گردد، زیرا در آنجا نمی‌توانید به آسانی مانند جاوا، یک روال استاتیک در یک کلاس داشته باشید. شما در کاتلین اصولاً دو آیتم در چنگ دارید، میتوانید از یک شیء companion به کار گیری نمائید و یا ماژول خویش را به یک object تبدیل کرده و متدهای provide را با JvmStatic@ لبه‌نویسی (annotate) فرمایید.

1@Module
2object YourModule {
3
4 @Provides @JvmStatic
5 fun provideThatDependency() = ThatDependency()
6}

خبر عالی این میباشد که در شکل استعمال از R8 میتوانید عملاً JvmStatic@ را کنار بگذارید، زیرا با استعمال از استاتیک سازی خویش این وظیفه را از ذمه شما بر می دارد.

چارچوب نرم افزار
یکی اولیه روند در هر نوع فعال سازی دگر، عرضه چارچوب نرم افزار تحت عنوان یک تعلق میباشد. این موقعیت احتمالاً مصادف با وقتی میباشد که اشخاص استارت به رسیدگی دگر تحت عنوان یک چیز تعجب آور و غامض می‌نمایند. حقیقت این میباشد که‌این یک موقعیت به طور کاملً خاص میباشد، زیرا ما میخواهیم بتوانیم یک نوبت از یک شیء را که بر ساخت و ساز آن کنترلی نداریم و با این حالا ارجاعی به آن در چنگ داریم را تزریق کنیم.


کلیک نمائید
برای حل این نقص‌، معمولاً این کد استعمال می گردد:

1@Singleton
2@Component(modules = [ApplicationModule::class, YourModule::class, ThatOtherModule::class])
3interface ApplicationComponent
4
5@Module
6class ApplicationModule(private val applicationContext: Context) {
7
8 @Provides fun provideApplicationContext(): Context = applicationContext
9}
10
11class YourApplication : Application() {
12
13 val component: ApplicationComponent by lazy {
14 DaggerApplicationComponent.builder()
15 .applicationModule(ApplicationModule(applicationContext))
16 .build()
17 }
18}
مشاهده بدون نقص کدها
در کد فوق یک ماژول ساخت و ساز می‌گردد که چارچوب نرم افزار را تحت عنوان یک آرگومان خالق اخذ می‌نماید و یک اسلوب provide ساخت و ساز میکنیم که آن را عرضه نماید. این موقعیت به نیکی شغل می‌نماید؛ البته به دنبال دیگر نمی‌توانیم ماژول را تحت عنوان یک object در دست داشته باشیم، زیرا یک object نمی‌تواند پارامترهای تولیدکننده داشته باشد. بدین ترتیب در شرایطی‌که بخواهیم متدهای provide را به طور استاتیک داشته باشیم، می بایست شیء companion را به طور annotated اضافه کنیم که وضعیت پلیدی داراست. ولی افزون بر آن، این دستور کار عملاً مغایر مستندات میباشد که درین مفاد به صراحت اعلام نموده است:

متدهای BindsInstance@ برای تایپ کردن یک Module@ بایستی بر آرگومان‌های تولیدکننده ترجیح داده شوند و فورا آن مقادیر ارائه خواهد شد. در واقع شما می بایست موقعیت ذیل را داشته باشید:

1@Singleton
2@Component(modules = [YourModule::class, ThatOtherModule::class])
3interface ApplicationComponent {
4
5 @Component.Builder
6 interface Builder {
7 @BindsInstance fun applicationContext(applicationContext: Context): Builder
8 fun build(): ApplicationComponent
9 }
10}
11
12class YourApplication : Application() {
13
14 val component: ApplicationComponent by lazy {
15 DaggerApplicationComponent.builder()
16 .applicationContext(applicationContext)
17 .build()
18 }
19}
مشاهده بدون نقص کدها
ApplicationComponent فعلا اندکی بغرنج‌خیس گردیده است؛ ولی ما دیگر به یک ماژول با شرایط نیازی نداریم. اکثر اوقات اشخاص عملاً این کد را ترجیح می دهند، گرچه چندان خوب وجود ندارد. این زنجیره مقداردهی نخستین اینک مفهوم بیشتری یافته میباشد و کد تولید گردیده به خصوص در‌این حالت بی آلایش‌خیس خواهد بود، چون با یک ماژول کمتر از دگر راز و عمل خواهد داشت.

بازدید : 58
پنجشنبه 5 تير 1404 زمان : 11:26


کد بدون نقص نرم افزار ضبط صدا در کاتلین: MainActivity.kt
در پی کد منبع بدون نقص نرم افزار ابتدایی ضبط صدا طراحی اپلیکیشن در مشهد را مشاهده میکنید:

1package com.example.android.soundrecorder
2
3import android.Manifest
4import android.annotation.SuppressLint
5import android.annotation.TargetApi
6import android.content.pm.PackageManager
7import android.media.MediaRecorder
8import android.Operating System.Build
9import android.support.v7.app.AppCompatActivity
10import android.Operating System.Bundle
11import android.Operating System.Environment
12import android.support.v4.app.ActivityCompat
13import android.support.v4.content.ContextCompat
14import android.widget.Toast
15import kotlinx.android.synthetic.main.activity_main.*
16import java.io.IOException
17
18class MainActivity : AppCompatActivity() {
19
20 private var output: String? = null
21 private var mediaRecorder: MediaRecorder? = null
22 private var state: Boolean = false
23 private var recordingStopped: Boolean = false
24
25 override fun onCreate(savedInstanceState: Bundle?) {
26 super.onCreate(savedInstanceState)
27 setContentView(R.layout.activity_main)
28
29 mediaRecorder = MediaRecorder()
30 output = Environment.getExternalStorageDirectory().absolutePath + "/recording.mp3"
31
32 mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
33 mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
34 mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
35 mediaRecorder?.setOutputFile(output)
36
37 button_start_recording.setOnClickListener {
38 if (ContextCompat.checkSelfPermission(this,
39 Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
40 Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
41 val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)
42 ActivityCompat.requestPermissions(this, permissions,0)
43 } else {
44 startRecording()
45 }
46 }
47
48 button_stop_recording.setOnClickListener{
49 stopRecording()
50 }
51
52 button_pause_recording.setOnClickListener {
53 pauseRecording()
54 }
55 }
56
57 private fun startRecording() {
58 try {
59 mediaRecorder?.prepare()
60 mediaRecorder?.start()
61 state = true
62 Toast.makeText(this, "Recording started!", Toast.LENGTH_SHORT).show()
63 } catch (e: IllegalStateException) {
64 e.printStackTrace()
65 } catch (e: IOException) {
66 e.printStackTrace()
67 }
68 }
69
70 @SuppressLint("RestrictedApi", "SetTextI18n")
71 @TargetApi(Build.VERSION_CODES.N)
72 private fun pauseRecording() {
73 if(state) {
74 if(!recordingStopped){
75 Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show()
76 mediaRecorder?.pause()
77 recordingStopped = true
78 button_pause_recording.text = "Resume"
79 }else{
80 resumeRecording()
81 }
82 }
83 }
84
85 @SuppressLint("RestrictedApi", "SetTextI18n")
86 @TargetApi(Build.VERSION_CODES.N)
87 private fun resumeRecording() {
88 Toast.makeText(this,"Resume!", Toast.LENGTH_SHORT).show()
89 mediaRecorder?.resume()
90 button_pause_recording.text = "Pause"
91 recordingStopped = false
92 }
93
94 private fun stopRecording(){
95 if(state){
96 mediaRecorder?.stop()
97 mediaRecorder?.release()
98 state = false
99 }else{
100 Toast.makeText(this, "You are not recording right now!", Toast.LENGTH_SHORT).show()
101 }
102 }
103}
مشاهده بی نقص کدها
نظارت فولدر صدا
بعد از ضبط کردن صدا بایستی به یاد داخلی دستگاه اندرویدی خویش بروید تا بتوانید به فولدر ضبط گردیده گوش بدهید. در صورتیکه درباره ی مسیر این شغل مطمئن نیستید، روند شغل را درپی توضیح داده‌ایم:

نرم افزار file را روی دستگاه اندرویدی خویش گشوده فرمائید.
به قسمت local بروید.
به‌دنبال فایلی با اسم recording.mp3 بگردید.


حرف نهایی
به این ترتیب به نقطه پايان این راهنما با قضیه نرم افزار مقدماتی ضبط صدا در کاتلین رسیدیم. اکنون شما با نحوه فعالیت MediaRecorder آشنا گردیده‌اید و می دانید که چه طور می توانید به طور هم‌زمان تقاضای دسترسی بکنید و چرا این فعالیت اساسی میباشد. همینطور نکاتی را راجع‌به خاطر داخلی دستگاه اندرویدی و طرز ذخیره‌سازی داده‌ها در آن آموختید. ورژن توسعه یافته‌تری از این نرم افزار که مجهز به تجهیزات بیشتری مانند پخش صدای ضبط گردیده با به کارگیری از MediaPlayer میباشد را میتوانید درین ریپوی گیت‌هاب (+) ببینید.


دیباگ کرش نیتیو (Native Crash) در اندروید – راهنمای توسعه یافته
100 نرم افزار بلندتر در لیست دوست داستنی‌ترین نرم افزار‌های اندرویدی تا مجال کتابت این نوشته‌علمی بیش تر از 54 میلیارد توشه نصب گردیده‌اند. 85 درصد از این نرم افزار‌ها دارنده کد «نیتیو» (native) با به کارگیری از بیش تر از 1000 کتابخانه نیتیو می باشند. در حالتی که تجربیات فعالیت روی اینگونه نرم افزار‌ها یا این که هر نرم افزار بلندمرتبه دیگری را داشته باشید، میدانید که احتمال بروز کرش نیتیو بسیار بالا میباشد.
توسعه و گسترش‌دهندگان اندروید می‌بایست در قضیه دیباگ کردن «رد پشته» (Stack Trace) کرش نیتیو که در لهجه اندرویدی «سنگ قبر» (Tombstone) نامیده میگردد، تجربیات قابل قبولی داشته باشند. ولی کرش نرم افزار در قسمت نیتیو (یعنی در کدهای سطح تحت C یا این که ++C) در اکثر وقت ها مورد ها بغرنج و ادراک آن مشقت بار میباشد. افزون بر آن قابلیت و امکان از شغل افتادن JVM (ماشین مجازی جاوا) قبل از رجوع در اختیار گرفتن به کد جاوا/کاتلین نیز وجود دارااست. این بدان معنا میباشد که شما قابلیت فراهم نمودن «استثنا» (Exception) را در سطح نرم افزار نخواهید داشت و تجربیات کاربری ناخوشایندی رقم میخورد.

قبل از شروع
مستندات پیشرفت‌دهندگان اندروید داده ها اثرگذار متعددی در زمینه ی عیب‌یابی کرش نیتیو (+) ارائه نموده است، ولی مکان نمونه‌های جامع و مفیدی که به تفهیم عالی مسئله یاری دهد، خالی میباشد.


کلیک نمائید
نکته: در حالتی‌که با کد نیتیو روی پلتفرم اندروید شناخت ندارید، خوب میباشد آغاز راهنمای NDK اندروید (+) را پژوهش نمایید.

کتابخانه‌های نیتیو در اکثری از نرم افزار‌ها موثر میباشند؛ البته بعضا از کاربردهای آن ها به تفصیل تحت میباشد:

فایده‌گیری از سطح ها بالاتری از همت دستگاه چهت نیل به تأخیر تحت یا این که اجرای نرم افزار‌های هنگفت از نگاه محاسبات مانند بازی یا این که مشابه‌سازی‌های فیزیکی.
به کار گیری دوباره از کتابخانه‌های C یا این که ++C که از سوی شما یا این که بسط‌دهندگان دیگر پیشرفته‌اند.
به علاوه کتابخانه‌های نیتیو قادرند امنیت نرم افزار را ارتقاء دهند و میتوانند در نرم افزار‌هایی که برای پلتفرم‌های متعدد نوشته میگردند، آیتم استعمال قرار گیرند.
نمونه‌هایی از دنیای حقیقی و واقعی
فکر کنید در یک گروه Android SDK سرگرم به شغل می باشید که در پروژه خویش با کتابخانه فرد ثالثی راز و شغل دارید که دربرگیرنده کدهای نیتیو میباشد. اشیای مشترک (پوشه‌های so.) نیز به طور pre-obfuscated میباشند که موجب میشود دیباگ کردن هر سیرتکامل کرش مشقت بار باشد.

شاید کتابخانه مشترکی که در نرم افزار شما گنجانده گردیده، از قبلی obfuscated باشد و می‌بایست از obfuscation دوباره دوری نمائید. در‌صورتی‌که از obfuscation دوباره پرهیز نکنید، احتمال بالایی وجود دارااست که با ایراد مواجه گردید.

در طول یکدست‌سازی این کتابخانه با نرم افزار، در حالتی که با یک کرش در runtime در build-های release مواجه گردید که obfuscation شد‌ه‌است، عملاً با شرایط بسیار دشواری روبرو گردیده‌اید. Obfuscation کد برای محافظت امنیت نرم افزار ضروری میباشد و از این رو بایستی کرش را تخت گاز قبل از تکثیر آتی رفع فرمایید.

در‌این مورد ها می بایست یک چاره برای دیباگ کردن نرم افزار بیابید. به نرم افزار مثال بی آلایش ذیل دقت نمایید. فرآیند آنالیز و دیباگ کردن برای رفع کرش نیتیو درین نرم افزار مصرف شده‌اند.

بازدید : 41
چهارشنبه 4 تير 1404 زمان : 16:58


tools:menu
این ویژگی برای گزینش لی‌آوت منویی استعمال می‌گردد که بایستی در «نوار نرم افزار» (App Bar) چشم خواهد شد. لی‌آوت های منو بایستی فارغ از /menu@ با هر سیرتکامل طراحی اپلیکیشن در مشهد پیشوند ID و فارغ از پسوند xml. اضافه شوند.

بعد از اضافه کردن به تگ ریشه activity_main.xml می توانیم آیکون منو را در نوار نرم افزار ببینیم:

مطابق مستندات قانونی قابلیت و امکان ارسال چندین ID منو که با کاما از هم غیروابسته گردیده‌اند نیز به آن وجود دارااست. با این هم اکنون ارسال مورد‌های چندگانه منو هیچ تأثیری در پیش‌اکران لی‌آوت ندارد.

tools:openDrawer
این ویژگی منحصراً با فعالیت می‌نماید و قابلیت و امکان در دست گرفتن شرایط (گشوده، بسته) و یا این که شرایط (چپ، راست) آن را در پنل پیش‌اکران ادیتور لی‌آوت مهیا می‌سازد. در جدول ذیل اسم‌ها و توضیحات اثبات‌هایی را میبینید که‌این ویژگی را تحت عنوان پارامتر می‌پذیرد:

برای مثال کد تحت به ما قابلیت می دهد که را در پنل پیش‌اکران به طور گشوده ببینیم:

1 2 xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools"
4 android:id="@+id/drawer_layout"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:openDrawer="start" />

tools:minValue | tools:maxValue
این ویژگی مقادیر کمینه و بیشینه را برای در پنل پیش‌اکران ادیتور لی‌آوت تهیه و تنظیم می‌نماید. به عنوان مثال:

1 2 xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools"
4 android:id="@+id/numberPicker"
5 android:layout_width="match_parent"
6 android:layout_height="wrap_content"
7 tools:minValue="0"
8 tools:maxValue="10" />

منابع "*/tools:sample@"
این یک کدام از مفیدترین ویژگی‌هایی میباشد که به ما قابلیت و امکان می دهد داده‌های placeholder یا این که تصاویر را به view-ها تزریق کنیم. اینک اندروید استودیو گونه های داده‌های از پیش تمجید گردیده پایین را توصیه می‌نماید که میتوانند در موادسازنده View تزریق شوند:


درباره‌ی نرم افزار ما یعنی +Contacts این داده‌های از پیش تمجید گردیده به ما قابلیت میدهند که اسم، اسم خانوادگی، شماره تلفن و آدرس و حتی آواتار مخاطبان را سوای به کارگیری از منابع متن و تصویر هاردکد گردیده بصری‌سازی کنیم.

اکنون لی‌آوت ما واقع‌گرایانه‌خیس به لحاظ میرسد. با این حالا ازآنجاکه هیچ داده از پیش تعریف‌و‌تمجید‌گردیده‌ای برای آدرس‌های پست الکترونیک نیست، همچنان از متن هاردکد گردیده برای اکران آن به کار گیری میکنیم. درضمنً به مکان آدرس بی نقص تنهاً از "tools:sample/cities@" به کارگیری میکنیم که صرفا اسم شهرها را اکران می دهد. خبر عالی این میباشد که در حال حاضر اندروید استودیو 3 قابلیت و امکان ساخت داده‌های مثال از پیش تعریف و تمجید گردیده را برای ما مهیا می‌سازد.

داده‌های مثال
برای اعلان و استعمال از داده‌های مثال پیش از هر چیز می بایست یک فولدر داده‌های مثال تولید کنیم. بدین خواسته می بایست روی فولدر app راست-کلیک کرده و آن گاه مورد New -> Sample Data directory را کلیک نمائید.


بعد از آن متوجه میشوید که فایل جدیدی به اسم sampledata پایین دایرکتوری app ساخته شده است. اینک میتوانید داده‌ها را باطن این فایل قرار دهید. درین فرصت دو مورد در چنگ ما جای‌دارد:

اضافه کردن پوشه متنی معمولی، درج داده‌های بیرون به طور خط به خط و بعد ارجاع دادن به آن با به کارگیری از "sample/fileName@". راجع به نرم افزار خودمان دو فولدر به اسم‌های emails و addresses ساخت‌و‌ساز می کنیم و داده‌های نشانی اینترنتی و آدرس را باطن این پوشه‌ها قرار می دهیم. بعد از فولدر contact_item.xml با به کارگیری از "tools:text=”@sample/emails و "tools:text=”@sample/addresses به‌این داده‌ها ارجاع می دهیم.


مورد دوم که در پیش روی ما جای دارد این میباشد که یک فولدر ساخت‌و‌ساز کنیم و همگی داده‌هایی را که نیاز داریم در پوسته JSON در آن در اختیار بگذاریم و با به کارگیری از “sample/fileName.json/arrayName/fieldName@” بدین داده‌ها ارجاع دهیم. این مورد در خصوص وجود داده‌های بغرنج نسبت به آیتم نخستین ترجیح دارااست. در امر نرم افزار خودمان یک فولدر به اسم sample.json با محتوای پایین ساخت‌و‌ساز کردیم و با به کار گیری از "tools:text=”@sample/sample.json/data/email و "tools:text=”@sample/sample.json/data/address به فیلدها ارجاع دادیم.


صحبت نهایی
در‌این نوشته‌علمی از روش ایجاد کرد یک نرم افزار مثال، به معرفی مورد‌های tools در اندروید استودیو پرداختیم. نرم افزار ما بعداز کلیه تغییرات، ظاهری بسیار خوشگل و واقع‌گرایانه یافته میباشد:

امید‌داریم این نوشته‌ی علمی برای شما موءثر و جالب بوده باشد.

در صورتی‌که این مقاله برای شما اثر گذار بوده میباشد، یادگرفتن‌های تحت نیز به شما توصیه می گردند:

بازدید : 45
سه شنبه 3 تير 1404 زمان : 11:56


Listener-های Callback
چهار Listener برای Callback عرضه طراحی اپلیکیشن در مشهد گردیده‌اند:

1void onMenuSelected(int oldIndex, int newIndex, MenuItem menuItem);
2void onAnimationStart(int index, MenuItem menuItem);
3void onAnimationEnd(int index, MenuItem menuItem);
4void onAnimationCancel(int index, MenuItem menuItem);

Lottie کتابخانه بسیار مفیدی میباشد و با به کار گیری از کارتن‌ها میتوانیم کاربردپذیری نرم افزار را سوای استعمال زیاد از متن و تصویر بهبود بخشیم.


نکات کلیدی اندروید ۱۰ برای پیشرفت دهندگان – راهنمای کاربردی
اندروید 10 به تارگی عرضه همگانی گردیده است. گوگل در حال حاضر برای اولیه توشه از گزینش اسم‌های دسر برای ورژن‌های اندروید دوری نموده است. البته این فقط نکته تازه درخصوص اندروید 10 وجود ندارد. درین نوشته‌علمی فهرستی از نکات کلیدی اندروید ۱۰ برای پیشرفت دهندگان ارائه می کنیم که شمارا تخت‌گاز با جدیدترین تجهیزات عرضه گردیده از سوی گوگل برای این سیستم دلیل آشنا می‌سازد. درین راهنما بعضا مفاد فنی گزینه گفت و گو قرار میگیرند، البته برای تلاوت آنان مایحتاج وجود ندارد علم عمیقی از این اکوسیستم داشته باشید. همینطور، در مقاله «مقایسه زامارین و اندروید استودیو» به مقایسه این دو ابزار بسط ساکن اندروید پرداخته گردیده‌است.
ناوبری با ژست‌های نو


گوگل تصمیم گرفته میباشد از ورژن 10 اندروید بعضا ژست‌های ناوبری جدیدی را معرفی نماید. آیتم‌هایی برای تکان به عقب به مدل اندروید P یا این که ناوبری سه دکمه‌ای کلاسیک نیز وجود دارااست.


کلیک نمائید
گسترش‌دهندگان درخصوص ژست‌های تازه می بایست به موارد ذیل دقت نمایند:

محتوای نرم افزار را از یک کناره شیت تا کناره دیگر توسعه دهید تا مطمئن گردید که به لطف به کار گیری از دکمه‌های نوار ناوبری روشن، قابلیت و امکان سود‌مندی از فضای بسط یافته را پیدا میکنید.
تعارض‌ها در بین ژست‌ها با دقت به ژست‌های پیشین (در شکل وجود) می بایست با تمرکز بالایی مدیر شوند. ژست System Back تازه در واقع یک سوایپ از سمت راست یا این که چپ برگه به سمت درون کاغذ میباشد. پیشرفت‌دهندگان میتوانند ژست‌های «back» را از بخشها خاصی با اشاره به‌این که مستلزم ورودی لمسی می‌باشند حذف کنند.
اکران UI ذیل نوار ناوبری و نوار حالت در اندروید 10 بسیار سفارش شد‌ه‌است، البته در ورژن‌های قبل ازروی میل میباشد.
ژست‌های سوئیچ home و quick را نمی‌اقتدار از انتهای ورقه حذف کرد.
میانبرهای اشتراک گذاری سریع


Direct Share API (+) اول توشه در اندروید مارشملو معرفی شد. ولی همواره با نوعی تأخیر در لود مواجه بوده میباشد. این تأخیر در Shortcuts API (+) دیگر صورت نمی‌دهد، زیرا از میانبرهای استاتیک استعمال می‌نماید و براین اساس تأخیرهای مجال جاری ساختن را برطرف می‌سازد. توسعه و گسترش‌دهندگان میتوانند از هدف ها مشترک درین Shortcuts API به کار گیری نمایند، چون از پیشین کامپایل گردیده‌اند.

Sharing Shortcuts API مشمول مشخصه category جدیدی میباشد. میانبرهای اشتراک‌گذاری اندروید از این پس حق تقدم بالاتری نسبت به Direct Share API دارا هستند. مبتنی بر اعلان گوگل یک مثال با ادغام مطلوب از Person تأثیر متعددی روی درجه‌بندی نرم افزار شما خواهد داشت.

یوزرها در اختیار گرفتن بیشتری روی داده‌های مکانی خویش دارا‌هستند


در اندروید ورژن 10 سبک مجوزهای مکانی تغییر‌و تحول یافته میباشد. قاب جواز در حال حاضر سه نوع دسترسی را اکران میدهد که دربرگیرنده مورد‌های All The Time ،While Using the App و Never میباشد. یوزرها اینک می توانند از دسترسی نرم افزار به داده‌های مکانی در پس‌قضیه خودداری نمایند. از این رو پیشرفت‌دهندگان بایستی دسترسی مکانی در پس‌مسئله را با جواز تازه ذیل در چنگ بگیرند:

android.permission.ACCESS_BACKGROUND_LOCATION
افزون بر آن در صورتیکه که یوزرها اذن دسترسی به داده‌های مکانی در پس‌قضیه را داده باشند و نرم افزار از این داده‌های مکانی در پس‌مورد باشد، نوتیفیکیشنی اخذ خواهند کرد.

نصب به روز‌های امنیتی از پلی‌استور
در اندروید 10 یوزرها میتوانند به‌روزرسانی‌های اساسی سیستمی را مستقیماً از پلی‌استور نصب نمایند. این قابلیت که به Project Mainline پر اسم و رسم گردیده‌است، قدم مهمی به سوی محافظت یکپارچگی روی دستگاه‌های متعدد مجهز به اندروید 10 محسوب میشود.

بنابراین یوزرها دیگر نیازی به ریبوت کردن دستگاه‌های خویش در طی نصب به‌روزرسانی‌های امنیتی اندروید ندارند. همینطور دیگر مایحتاج وجود ندارد در انتظار بمانند که سازندگان دستگاه این به‌روزرسانی‌ها را منتشر کنند.

جواب‌های زیرکانه و اقدامات پیشنهادی


اندروید 10 مجهز به یادگیری ماشینی داخلی روی دستگاه میباشد که جواب‌های زیرکانه‌ای یاور با اقدامات پیشنهادی در نوتیفیکیشن‌ها اکران میدهد. به این ترتیب در حالتی که کسی از شما بخواهد که با او در کافه مشخصی قهوه بنوشید، یک لینک و پیوند مسیریابی گوگل مپ به نشانی مشخص و معلوم گردیده به طور خود کار تحت عنوان یک اکشن در نوتیفیکیشن ظواهر می شود. این قابلیت و امکان در نرم افزار‌های پیام‌رسانی فرد ثالث نیز مهیا شد‌ه‌است.

بازدید : 37
دوشنبه 2 تير 1404 زمان : 10:34


جایگزینی برای NetworkInfo
شغل خویش را با ساخت‌و‌ساز یک جایگزین NetworkInfo استارت می کنیم که یک شیوه ناهمگام برای اخذ موقعیت اتصال کانال ساخت‌و‌ساز می‌نماید. به‌دنبال طراحی اپلیکیشن در مشهد مثالی از اینترفیس آن را می بینید:

1interface NetworkState {
2 val isConnected: Boolean
3 val network: Network?
4 val networkCapabilities: NetworkCapabilities?
5 val linkProperties: LinkProperties?
6}

اینک بایستی این اینترفیس را پیاده‌سازی کنیم و مطمئن شویم که مقادیر آن اتصال‌پذیری دستگاه را رفلکس میدهند:

1internal class NetworkStateImp : NetworkState {
2 override var isConnected: Boolean = false
3 override var network: Network? = null
4 override var linkProperties: LinkProperties? = null
5 override var networkCapabilities: NetworkCapabilities? = null
6}

در حال حاضر میتوانیم از این پیاده‌سازی باطن NetworkCallback به کار گیری کنیم و وضعیت کانال را داخل آن ذخیره کرده و هر توشه که موقعیت تغییر تحول مییابد به‌روزرسانی کنیم:

1internal class NetworkCallbackImp(private val holder: NetworkStateImp) : ConnectivityManager.NetworkCallback() {

2 override fun onAvailable(network: Network) {
3 holder.network = true
4 holder.isConnected = isAvailable
5 }
6 override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
7 holder.networkCapabilities = networkCapabilities
8 }
9 override fun onLost(network: Network) {
10 holder.network = network
11 holder.isConnected = false
12 }
13 override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
14 holder.linkProperties = linkProperties
15 }
16 }
مشاهده بدون نقص کدها
براین اساس برنده شدیم خلل را حل کنیم، البته هنوز مواقعی میباشند که می بایست تغییر تحول دهیم:

اولیه آیتم این میباشد که می بایست یک نوبت از NetworkState ساخت کنیم که از هر جایی در نرم افزار و خیر صرفا NetworkStateImp قابل دسترسی باشد. بدین مراد یک شیء صرفا-خواندنی نیاز داریم.
گزینه دوم نحوه استحضار‌رسانی به هر مورد از طرفین ذینفع درخصوص تغییر‌و تحول موقعیت اتصال‌پذیری کانال میباشد.
در غایت گزینه سوم اتصال کلیه این مفاد به NetworkStateImp میباشد.
نکته دوم و سوم چند چاره دارا‌هستند. بعضا ممکن میباشد از یک کانتینر DI استعمال نمایند که از قبلی برای نرم افزار تهیه و تنظیم کرده‌اند، البته چنانچه بخواهیم تمامی چیز معمولی باشد، قادر خواهیم بود از کد کاتلین ذیل به کارگیری کنیم:

1object NetworkStateHolder : NetworkState {
2
3 private lateinit var holder: NetworkStateImp
4
5 override val isConnected: Boolean
6 get() = holder.isConnected
7 override val network: Network?
8 get() = holder.network
9 override val networkCapabilities: NetworkCapabilities?
10 get() = holder.networkCapabilities
11 override val linkProperties: LinkProperties?
12 get() = holder.linkProperties
13
14 fun Application.registerConnectivityMonitor() {
15 holder = NetworkStateImp()
16 val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
17 connectivityManager.registerNetworkCallback(NetworkRequest.Builder().build(), NetworkCallbackImp(holder))
18 }
19
20}
مشاهده بی نقص کدها
در کد فوق شغل های ذیل را ایفا میدهیم:

Object یک syntactic sugar کاتلین برای تهیه الگوی سینگلتون به حساب می آید.
NetworkStateHolder یک دفعه از NetworkState میباشد، البته مقادیر در مشخصه holder ذخیره گردیده‌اند. Holder یک NetworkStateImp و قابل دستکاری، البته سری میباشد و نکته نخستین فوق را برآورده می‌سازد.
registerConnectivityBroadcaster یک اکستنشن Application میباشد که holder را به callback اتصال میدهد و نکته سوم فوق را برآورده می‌سازد.
برای فعال سازی تمامی معماری نظارتی کافی میباشد registerConnectivityBroadcaster را به طور تحت فراخوانی کنیم:

1class MainApplication : Application() {
2 override fun onCreate() {
3 super.onCreate()
4 registerConnectivityBroadcaster()
5 }
6}

در حال حاضر صرفا نکته دوم فوق ما‌نده میباشد یعنی تغییرات کانال را منتشر کنیم. یک شیوه دیرین در این زمینه میتواند به کارگیری از نوعی الگوی Broadcaster -> Intent -> Receiver -> Function برای اخذ حادثه ها در اکتیویتی‌ها باشد.

البته قرار وجود ندارد مدام در قبل بمانیم و می بایست استارت به استعمال از راهکارهای جت پک اندروید بکنیم. به‌این مراد میخواهیم از کامپوننت‌های معماری سود بگیریم.

به کارگیری از نوعی LiveData
ما با استعمال از LiveData نکته فوق فهرست اشتباهات فوق را که پیش‌خیس ارائه کردیم حل می کنیم، یعنی رویدادهای اتصال‌پذیری را به سایر قسمت‌های نرم افزار استحضار‌رسانی می کنیم. آغاز بایستی بعضا حادثه ها را تعریف و تمجید کنیم. در این باره نیز از کد کاتلین به کار گیری میکنیم:

1sealed class Event {
2
3 val networkState: NetworkState = NetworkStateHolder
4
5 object ConnectivityLost : Event()
6 object ConnectivityAvailable : Event()
7 data class NetworkCapabilityChanged(val old: NetworkCapabilities?) : Event()
8 data class LinkPropertyChanged(val old: LinkProperties?) : Event()
9}

در کد معمولی فوق تعدادی سرمشق تعریف‌و‌تمجید گردیده‌اند:

کلیک فرمایید
Enumeration – کلاس sealed قابلیت گروه محدودی از گونه های بر پایه ی Event را مهیا می‌سازد که همگی آن ها باطن event قرار دارا‌هستند و خواندشان راحت میباشد.
Polymorphism – هر دفعه از Event یک شرایط کانال را محافظت می‌نماید، البته بعضا داده‌های خاص مربوط به تغییر تحول صورت داده نیز ذخیره نموده است.
Abstraction – در شرایطی‌که هیچ داده‌های مایحتاج نباشد، میتوانیم تنهاً از نوع برای مدیر روی داد استعمال کنیم که دقیقاً شبیه مدیر likeException میباشد. این شرایط در خصوص ConnectivityLost و ConnectivityAvailable مصداق دارااست. همینطور برای آسانی بیشتر به کارگیری از object/singletons مصرف شده میباشد.
به فولدر‌های تحت دقت فرمائید:

فولدر NetworkEvents.kt
1object NetworkEvents : LiveData() {
2 internal fun notify(event: Event) {
3 postValue(event)
4 }
5}

فولدر NetworkStateImp.kt
1internal class NetworkStateImp : NetworkState {
2 override var network: Network? = null
3
4 override var isConnected: Boolean = false
5 set(value) {
6 field = value
7 NetworkEvents.notify(if (value) Event.ConnectivityAvailable else Event.ConnectivityLost)
8 }
9 override var linkProperties: LinkProperties? = null
10 set(value) {
11 val event = Event.LinkPropertyChanged(field)
12 field = value
13 NetworkEvents.notify(event)
14 }
15
16 override var networkCapabilities: NetworkCapabilities? = null
17 set(value) {
18 val event = Event.NetworkCapabilityChanged(field)
19 field = value
20 NetworkEvents.notify(event)
21 }
22}
مشاهده بدون نقص کدها
در حال حاضر مفاد ذیل را داریم:

NetworkEvents یک LiveData میباشد و با به کار گیری از NetworkEvents.observe(lifecycleowner, observer) می‌قدرت آن را از هر LifeCycleOwner روءیت کرد. همینطور می‌قدرت از هر مکانی که دارنده NetworkEvents.observeForever(observer) باشد آن را روءیت کرد.

Notify تابعی میباشد که برای ارسال رویدادهای تازه به کار گیری می گردد. در NetworkHolderImp که پیش از اینً ارائه کردیم با اضافه کردن یک setter که NetworkEvents.notify را فراخوانی می‌نماید، میتوانیم هر چیزی که تغییر تحول یافته را به اگاهی کلیه observer-ها برسانیم.

صحبت آخری
احتمالاً درین نوشته ی علمی برخی کلیدواژه‌های internal را در اولِ کلاس‌ها و مشخصه‌ها دیدید. خواسته از آن این میباشد که صرفا از باطن ماژول قابل مشاهده می باشند. به ذکر خلاصه کد را در ماژول خاص خویش قرار میدهیم و نمایانی آن را به کلاس‌های خودمان محصور میکنیم. برای مشاهده کد بی نقص این پروژه می توانید به‌این رپیوی گیت‌هاب (+) بروید.

بازدید : 25
شنبه 31 خرداد 1404 زمان : 10:54


معضل
در‌این نصیب سعی میکنیم یک دکمه خاصی هم به دیالوگ خویش اضافه کنیم. اندروید همچون دکمه‌های مثبت و منفی، یک دکمه خنثی نیز دارااست:

1builder.setNeutralButton("Maybe") { dialog, which ->
2 Toast.makeText(applicationContext, "Maybe",Toast.LENGTH_SHORT).show()
3}

همچون دکمه‌های پیشین برای دکمه خنثی نیز یک متن و اکشن تمجید میکنیم. در تصویر تحت خلق و خوی نرم افزار را بعداز ایفا میبینید.

گزینه‌های Toast
مورد‌های Toast عناصری می باشند که در اندروید برای اکران لحظه‌ای چیزی استعمال می گردند و آن گاه به طور اتوماتیک ناپدید میشوند. تا یک‌سری سال پیش آن ها یک استاندارد برای پیام محسوب می‌شدند، البته فعلا به صورت عمده از سوی گسترش‌دهندگان برای اکران خطاهایی که اصلی نیستند یا این که فقطً در حین پیشرفت نرم افزار آیتم استعمال قرار میگیرند.

به این ترتیب به نقطه نهایی قسمت پیاده سازی دکمه‌ها برای تعامل با مخاطب می‌رسیم.

نصیب 3: دیالوگ‌های دارنده لیست


چیزهای متعددی وجود دارا‌هستند که ممکن میباشد بخواهید به دیالوگ اضافه فرمایید. در‌این قسمت پایان با طریق اضافه کردن لیستی از مورد‌ها به دیالوگ آشنا می‌شویم. این شغل در سه بخش اعمال می شود:

لیست‌های متنی بی آلایش که می‌قدرت یک مورد را گزینش کرد.
لیست‌های به طور دکمه‌های رادیویی که گشوده می‌قدرت یک مورد را گزینش کرد.
لیست‌های تیک‌زدنی که می‌اقتدار یک سری مورد را تعیین نمائید.
اضافه کردن دکمه‌های بیشتر برای اکران دیالوگ
قبل از فعالیت کردن روی نرم افزار، 4 دکمه دیگر به UI برای چهار اخطار تازه اضافه میکنیم. براین اساس در تمامی نمونه‌های پایین از آنها استعمال خوا‌هیم کرد.

کلیک نمائید
تهیه و تنظیم دکمه‌ها
کد تحت را به پوشه activity_main.xml و ذیل دکمه گذشته اضافه نمایید:

12 android:id="@+id/button_traditional_list"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:onClick="showBasicDialog"
6 android:text="Show single-choice list!"
7 app:layout_constraintBottom_toBottomOf="parent"
8 app:layout_constraintLeft_toLeftOf="parent"
9 app:layout_constraintRight_toRightOf="parent"
10 app:layout_constraintTop_toTopOf="parent" />

این کد به طور کاملً شبیه کد دکمه قبل میباشد، ولی 3 نکته قابل توجه وجود داراست:

خط ابتدا یک id دارااست. ID-ها برای دست‌کاری نماها در کد مداقه متعددی دارا هستند و قابلیت و امکان ارجاع به آنان را آماده میسازند. به دنبال برهان این عمل را خواهید فهمید.
اسلوب onClick همچنان به showBasicDialog اشاره می‌نماید ولی بعد از تولید روال اکران لیست آن را تغییر و تحول خوا‌هیم بخشید. موقتاً آن را همین طور باقی میگذاریم تا اندروید استودیو غلط نشانه ندهد.
متن دکمه را عوض کرده‌ایم.
نرم افزار را بیلد و ایفا فرمایید تا سود پایین نتایج خواهد شد:

در‌صورتی‌که به آن نگاه نمائید، می بینید که دکمه جدیدی روی دکمه قبل اضافه گردیده‌است. عامل این شرایط آن میباشد که ID را اضافه کرده‌ایم. به دکمه گذشته هم یک ID می دهیم:

1

عالی میباشد ID را تحت عنوان گزینه نخستین در XML اضافه کنیم تا شناسایی آن ها سهل وآسان‌خیس باشد، البته می‌اقتدار هر کشور دیگری هم اضافه کرد. فعلا دقت فرمایید که هر دو دکمه خطوط مشابهی دارا هستند که سبب به حالت قیود layout_constraintX_toYOf می گردد. در دنیای بسط تلفن همراه، یعنی اندروید و iOS رایج میباشد که برای مدیر نماها از «قیود» (constraints) به کار گیری میگردد. این قیود شالوده به دکمه‌ها اعلام می‌نمایند که خویش را در کجای ورقه قرار دهند. در صورتی‌که به هر دو دکمه نگاه نمائید دارنده قید parent می باشند یعنی بایستی مسافت یکسانی از بالا، زیر، راست و چپ برگه داشته باشند. برای اکران دو دکمه می بایست آنها‌را در قید تحت دکمه در آغاز در اختیار بگذاریم که نسبت به قید top دکمه دوم باشد. به همین جهت میباشد که به کار گیری از ID در اینجا لزوم داراست.

قیود
قید layout_constraintBottom_toBottomOf دکمه ابتدا را به طور ذیل تغییر‌و تحول دهید:

1app:layout_constraintBottom_toTopOf="@id/button_traditional_list"

دقت فرمایید که دکمه فعلا مقید به toTopOf شد‌ه‌است، در حالی که تا قبل از اینً مقید به layout_constraintTop_toTopOf بود:

1app:layout_constraintTop_toBottomOf="@id/button_basic_dialog"

نکته: ضروری وجود ندارد که هر دو قید layout_constraintBottom_toTopOf و layout_constraintTop_toBottomOf اضافه شوند، ولی در صورتی‌که آنها را اضافه نمایید، تمرین بیشتری کرده‌اید و معنای آنها را عالی شعور می کنید.

فعلا نرم افزار را توشه دیگر جاری ساختن نمایید تا بتوانید هر دو دکمه‌ را مشاهده کنید. در‌این فرصت، هر دوی آنان در دیالوگ ظواهر می شوند، زیرا هر دو به اکشن showBasicDialog ارجاع دارا‌هستند.

اضافه کردن باقی دکمه‌ها
در‌این قسمت دو دکمه دیگر اضافه میکنیم که به ترتیب دارنده متن‌های Show radio button list!” و “Show checkboxes list! می‌باشند:

1 2 android:id="@+id/button_radio_list"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:onClick="showBasicDialog"
6 android:text="Show radio button list!"
7 app:layout_constraintBottom_toTopOf="@id/button_checkbox_list"
8 app:layout_constraintLeft_toLeftOf="parent"
9 app:layout_constraintRight_toRightOf="parent"
10 app:layout_constraintTop_toBottomOf="@id/button_traditional_list" />
11
12 13 android:id="@+id/button_checkbox_list"
14 android:layout_width="wrap_content"
15 android:layout_height="wrap_content"
16 android:onClick="showBasicDialog"
17 android:text="Show checkbox list!"
18 app:layout_constraintBottom_toBottomOf="parent"
19 app:layout_constraintLeft_toLeftOf="parent"
20 app:layout_constraintRight_toRightOf="parent"
21 app:layout_constraintTop_toBottomOf="@id/button_radio_list" />
مشاهده بی نقص کدها
اکنون با چهار دکمه‌ای که به نرم افزار اضافه کرده‌ایم، بایستی به طور پایین درآمده باشد:

بدین ترتیب فعالیت فراهم‌سازی به نقطه نهایی رسیده میباشد و می توانیم استارت به کدنویسی دیالوگ‌ها بکنیم.

دیالوگ اندروید با لیست
همان گونه که پیش‌خیس در اولِ این نصیب از نوشته ی علمی اشاره کردیم، اندروید سه مورد اساسی برای اضافه کردن لیست به دیالوگ در چنگ ما قرار میدهد که مشمول متن‌های معمولی سوای نشانگر، با دکمه‌های رادیویی و با قاب تعیین میباشد.

اضافه کردن لیست قابل گزینش متنی
اول مورد لیستی میباشد که بر پایه ی مستندات اندروید، یک لیست «لیست تک‌آیتم‌ای سنتی» (traditional single-choice list)‌ خوانده می گردد. به پوشه MainActivity.kt طراحی اپلیکیشن در مشهد بروید و تابع جدیدی ساخت فرمائید:

1fun showTraditionalListDialog(view: View?) { ... }

در امر هر لیست می بایست یک آرایه نو به یاروهمدم مورد‌هایی که اکران خواهند یافت ساخت‌و‌ساز نمایید. فکر کنید میخواهید از استفاده کننده بپرسید سرگرمی دوست داستنی او چیست. آرایه‌ای داخل تابع اضافه نمائید و مورد‌ها را به طور تحت اضافه فرمایید:

1val hobbies = arrayOf("VideoGames", "Reading", "Sports", "Movies")


آنگاه کد ساخت دیالوگ را اضافه می کنیم:

1//1
2val builder = AlertDialog.Builder(this)
3builder.setTitle("Traditonal List")
4//2
5builder.setItems(hobbies, DialogInterface.OnClickListener {
6 dialog, which ->
7 //3
8 // \'which\' item of the \'dialog\' was selected
9 Toast.makeText(applicationContext, hobbies[which], Toast.LENGTH_SHORT).show()
10})
11//4
12builder.show()

در کد فوق شغل های ذیل را اعمال می دهیم:

در نصیب 1، یک builder می سازیم. کلمه و واژه this به چارچوب نرم افزار اشاره دارااست. همینطور تیتر را اضافه ‌میکنیم، البته ضرورتی ندارد.
در نصیب 2، گزینه‌هایی که در آرایه hobbies می‌باشند را به بیلدر اضافه می کنیم، براین اساس متوجه میگردد که بایستی یک لیست عرضه نماید. روال hobbies را اضافه میکنیم تا بداند در طی کلیک شدن یک گزینه می بایست چه کاری جاری ساختن دهد.
در نصیب 3، همچون نمونه نخستین، وقتی که مخاطب یک مورد را تعیین می‌نماید یک Toast اکران می دهیم. دقت فرمائید که پارامتر دوم در حال حاضر به آیتمی از آرایه اشاره داراست که کلیک شد‌ه‌است. این مشی یک اندیس ارائه می‌نماید، بدین ترتیب به hobbies[1] ارجاع میدهیم و فن‌ای در Toast اکران می یابد.
در قسمت 4، به builder اعلام می کنیم که بایستی اکران یابد. به خیال داشته باشید که نباید این قسمت را فراموش نمائید، زیرا در غیر این شکل تمامی زحمات به هدر می‌رود.
فعلا به فولدر activity_main.xml بروید و با عوض کردن محتوای مشی onClick دکمه متناظر به تابع اشاره نمایید:

1android:onClick="showTraditionalListDialog"

نرم افزار را ایفا فرمایید و روی دکمه Show single-choice List کلیک کنید. براین اساس بایستی چیزی مانند تصویر تحت مشاهده کنید:

اضافه کردن یک لیست با دکمه‌های رادیویی
در‌صورتی‌که نصیب پیشین را به نیکی متوجه گردیده باشید، می بایست این نوید را بدهیم که ساخت و ساز لیست با دکمه‌های رادیویی یا این که کادرهای تعیین نیز پروسه به طور کاملً مشابهی دارااست. در‌پی این مفاد را نیز نظارت میکنیم:

دراین باره بایستی سابقه گزینه‌های تعیین ‌گردیده را محافظت کنیم، بدین ترتیب فارغ تابع یک متغیر ساخت و ساز می کنیم:

1private var selectedRadioItem = -1

ادله این که عدد 1- را اضافه کرده‌ایم این میباشد که در بالا هیچ مورد‌ای تعیین نشده میباشد. البته شاید بخواهید دیالوگ با بعضا مورد‌های از پیش تعیین‌گردیده شروع خواهد شد.

بعد از آن همچون نصیب پیشین یک تابع ساخت میکنیم که دراین مورد showRadioButtonListDialog اسم دارااست:

1fun showRadioButtonListDialog(view: View?) { ... }

کد تحت را به تابع اضافه نمایید:

1// 1
2val cities = arrayOf("New York", "London", "Hong Kong", "Río")
3// 2
4val builder = AlertDialog.Builder(this)
5builder.setTitle("Radio Button List")
6// 3
7builder.setSingleChoiceItems(cities, selectedRadioItem, DialogInterface.OnClickListener {
8 dialog, which ->
9 //4
10 selectedRadioItem = which
11 Toast.makeText(applicationContext, cities[which], Toast.LENGTH_SHORT).show()
12})
13// 5
14builder.setPositiveButton("OK") {
15 dialog, which ->
16 dialog.dismiss()
17}
18// 6
19builder.show()
مشاهده بی نقص کدها
توضیح کد فوق به طور پایین میباشد:

در قدم 1، یک آرایه از اسم شهرها ساخت‌و‌ساز کرده‌ایم. فرض فرمایید استفاده کننده میخواهد شهری که در آن معاش می‌نماید را گزینش نماید، 4 آیتم در چنگ او قرار می دهیم.
در قدم 2، چنان که پیش‌خیس اشاره کردیم، هر دیالوگ بایستی یک بیلدر به یار و همدم تیتر داشته باشد.
در قدم 3، می بینید که گزینه‌ها از روش اسلوب ()setSingleChoiceItems اضافه گردیده‌اند. براین اساس به بیلدر اعلام می کنیم که یک لیست با دکمه‌های رادیویی می خواهیم. تفاوت این وضعیت با اسلوب ()setItems قبل در‌این میباشد که در حال حاضر گزینه پیش‌فرض هم گرفته می گردد. این متغیری میباشد که پیش از اینً با اسم selectedRadioItem ساخت کرده‌ایم.
در قدم 4، selectRadioItem را روی گزینه تازه تعیین گردیده گزینش میکنیم. عامل ساخت و ساز این متغیر در فارغ تابع آن میباشد که بایستی گزینه را ذخیره کنیم، زیرا در غیر این شکل هر توشه که تابع فراخوانی میشود مورد ذخیره گردیده دستکاری شود. همچون گذشته، یک Tosat برای دیدن مورد درست اکران می دهیم.
در قدم 5، یک دکمه تأیید هم اضافه میکنیم، چون مخاطب ممکن میباشد هنوز مطمئن نباشد که می خواهد مورد را تغییر تحول دهد یا این که خیر.
در قدم 6، دیالوگ را اکران میدهیم.
در غایت می بایست این سیاق را به onClick مرتبط با دکمه در پوشه activity_main.xml اضافه نمایید:

1android:onClick="showRadioButtonListDialog"

نرم افزار را توشه دیگر جاری ساختن نمایید تا سود کلیک کردن روی گزینه show radio button list را به طور ذیل ملاحظه کنید:

تعداد صفحات : 0

درباره ما
موضوعات
آمار سایت
  • کل مطالب : 394
  • کل نظرات : 0
  • افراد آنلاین : 1
  • تعداد اعضا : 0
  • بازدید امروز : 51
  • بازدید کننده امروز : 1
  • باردید دیروز : 243
  • بازدید کننده دیروز : 0
  • گوگل امروز : 0
  • گوگل دیروز : 0
  • بازدید هفته : 451
  • بازدید ماه : 666
  • بازدید سال : 3020
  • بازدید کلی : 20336
  • <
    پیوندهای روزانه
    اطلاعات کاربری
    نام کاربری :
    رمز عبور :
  • فراموشی رمز عبور؟
  • خبر نامه


    معرفی وبلاگ به یک دوست


    ایمیل شما :

    ایمیل دوست شما :



    کدهای اختصاصی