ایجاد صفحه splash screen (اسپلش اسکرین) در اندروید استودیو
با نام و یاد خدا
در جلسه ششم با نحوه ایجاد یک پروژه در اندروید استودیو آشنا شدیم. امروز می خواهیم به ایجاد صفحه splash screen (اسپلش اسکرین) در اندروید استودیو بپردازیم.و همچنین چگونگی تغییر اکیتویتی اصلی (اولین اکتیویتی) را آموزش می دهیم.
صفحه splash screen (اسپلش اسکرین) چیست؟
یک صفحه یا اکتیویتی است که در هنگام اجرای اپلیکیشن برای چند ثانیه نمایش داده می شود و سپس به صورت خودکار به اکتیویتی دیگری می رود. این صفحه معمولا در اپلیکیشن ها شامل لوگو شرکت سازنده می باشد . شما می توانید هر اجزایی که می خواهید درون این اکتیویتی قرار دهید.
تغییر اکتیویتی اصلی
ابتدا یک پروژه ایجاد کنیم. اپلیکیشن ما در حال حاضر یک اکتیویتی و یک layout دارد.
برای ایجاد صفحه splash screen (اسپلش اسکرین) نیاز به یک اکتیویتی دیگری داریم. برای ایجاد اکتیویتی روی پوشه java راست کلیک کرده و New Activity را انتخاب کرده و یک اکتیویتی خام ایجاد می کنیم.
یک پنجره باز می شود که باید نام اکتیویتی و نام layout را انتخاب کنیم.
نکته: یک گزینه ای داریم به نام Launcher Activity که اگر تیک بخورد یعنی این اکتیویتی، اولین اکتیویتی است که نمایش داده می شود.
در ابتدای ایجاد پروژه، اکتیویتی به نام MainActivity ایجاد کردیم و به صورت پیش فرض اندروید استودیو آنرا به عنوان اولین اکتیویتی در نظر گرفت. حالا با زدن تیک گزینه Launcher Activity در هنگام ساخت اکتیویتی اسپلش، splash هم به عنوان اولین اکتیویتی شناخته شد .
اگر به پوشه manifests برویم و AndroidManifest.xml را باز کنیم. می بینیم که دو اکتیویتی داریم و هر کدام دارای تگ <intent-filter></intent-filter> می باشد. تگ <intent-filter></intent-filter> نشان می دهد هر دو اکتیویتی ، اکتیویتی اصلی می باشند.
باید تگ <intent-filter>:
<intent-filter>
<action android: name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
را از اکتیویتی اول یعنی MainActivity حذف کنیم تا در هنگام اجرا به عنوان اکتیویتی اصلی اجرا نشود.
نکته: اگر در ابتدا ایجاد اکتیویتی گزینه Launcher Activity را تیک نزدیم ،فقط کافی است تگ <intent-filter></intent-filter> (و آنچه مابین آن است) را از اکتیویتی های دیگر بگیریم و در اکتیویتی که می خواهیم اول اجرا شود، قرار دهیم .
نکته: بنابراین هر گاه چند اکتیویتی داشتیم ، می توانیم خیلی راحت با حذف تگ <intent-filter></intent-filter> (و تگ های مابین آن) از یک اکتیویتی و اضافه کردن آن به اکتیویتی دیگر، تعیین کنیم که کدام اکتیویتی اول اجرا شود.
ایجاد صفحه splash screen (اسپلش اسکرین)
وارد پوشه java می شویم و اکتیویتی splash را باز می کنیم. در اینجا می خواهیم کدی بنویسیم که باعث شود اکتیویتی splash بعد از چند ثانیه وقفه به اکتیویتی دیگری برود.
در متد oncreate ، کلاس Handler را new می کنیم و سپس با متد postDelayed زمان توقف را تعیین می کنیم.
طبق پیشنهادی که اندروید استودیو می دهد باید پارامتر اول تابع postDelayed را Runnable و پارامتر دوم زمان باشد. وقتی پارامتر Runnable را new می کنیم، اندروید استودیو به صورت خودکار تابع run را ایجاد می کند. سپس باید پارامتر دوم یعنی زمان را وارد کنید و در آخر کاما فراموش نشود.این سه مرحله را در تصویر ببینید.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
}
},3000);
}
نکته: با حرف بزرگ تایپ کنید تا اندروید استودیو لیست پیشنهادات خود را نمایش دهد.
نکته: زمان برحسب میلی ثانیه وارد شود.
نکته: کلاس Handler که ایجاد می کنید کتابخانه آن هم به صورت پیش فرض ایمپورت می شود.
حالا باید داخل تابع run بنویسیم که اکتیویتی splash بعد از 3 ثانیه به صورت خودکار محو شود و اکتیویتی MainActivity ظاهر شود.
در اینجا ما از Intent استفاده می کنیم ولی توجه داشته باشید که درباره intent ها به صورت مفصل تر در جلسات بعد آموزش می دهیم.
Intent چیست؟
واسطی است ما بین کامپوننت ها که ساده ترین کاربرد آن انتقال بین اکتیویتی ها درون یک اپلیکیشن است.
حالا برای اینکه از اکتیویتی splash به اکتیویتی MainActivity برویم نیاز به Intent داریم. ابتدا یک شی از کلاس intent تعریف می کنیم و پارامتر اول متد سازنده را اکتیویتی splash و پارامتر دوم را اکتیویتی MainActivity تنظیم می کنیم.
Intent i=new Intent(splash.this,MainActivity.class);
حالا شی i را به متد startActivity می دهیم تا آن را اجرا کند یعنی از اکتیویتی اسپلش به اکتیویتی MainActivity برود.
startActivity(i);
از متد finish() هم استفاده می کنیم تا اکتیویتی اسپلش بسته شود و کاربر دیگر نتواند به این اکتیویتی یاصفحه برگردد.
finish();
اجرای اپلیکیشن
حالا برای اینکه در اجرا تفاوت بین اکتیویتی ها را بهتر متوجه شویم ظاهر اکتیویتی اسپلش را تغییر دهید. در Layout فایل splash.xml را باز کنید و تغییرات خود را اعمال کنید (مثلا لوگو خود را قرار دهیم فعلا ما فقط رنگ آن را تغییر می دهیم.)
برای تغییر رنگ بهتر است در تب text خط کد زیر را وارد کنید هر چند می توانید در Design هم اینکار را انجام دهید(عادت کنید به کد نویسی):
android:background=”@color/colorAccent”
همانطور که در جلسه ششم گفتیم برای استفاده از رشته و رنگ و … در برنامه باید ابتدا آن ها را در پوشه res تعریف کنیم و سپس هر جا نیاز داریم فراخوانی کنیم. در اینجا هم ما رنگ colorAccent (که از قبل تعریف شده) را از پوشه res زیر شاخه color صدا می زنیم.
حالا اپلیکیشن را اجرا می کنیم(ما برای اجرا از Genymotion استفاده کردیم که در جلسه هفتم طرز کار با آن را گفتیم)
همانطور که خواهید دید ابتدا برای سه ثانیه اکتیویتی splash ظاهر می شود و سپس اکتیویتی MainActivity ظاهر می شود.
افزودن تصویر به splash
هر موقع بخواهیم تصویری را به اپلیکیشن خود اضافه کنیم فقط کافی است آن تصویر(مثلا با نام background) را کپی کنیم و روی پوشه drawable کلیک راست کرده و past کنیم.
نکته: در انتخاب نام و سایز تصویر دقت کنید. مثلا اگر در نام تصویر از عدد استفاده کنیم تصویر نمایش داده نمی شود.
این تصویر به منابع ما (یعنی پوشه res) زیر شاخه drawable اضافه شده است و حالا آن را هر جا لازم داریم صدا می زنیم (آموزش جلسه ششم) .سپس layout مربوط به splash یعنی فایل splash.xml را باز می کنیم و کد زیر را در ادامه خصوصیات قبلی اضافه می کنیم:
android:background=”@drawable/background“
حذف نوار عنوان از splash
همانطور که در تصویر بالا دیدید، ما عنوان “داژیار پردازش ایساتیس” را در بالای اسپلش می بینیم که بهتر است حذف شود.
برای حذف آن ، پوشه manifests را باز کنید و خصوصیت زیر را به تگ مربوط به اکتیویتی اسپلش اضافه کنید:
android:theme=”@style/Theme.AppCompat.NoActionBar“
حالا دوباره برنامه را اجرا می کنیم تا نتیجه کار را ببینید.
امیدواریم از این آموزش جالب لذت برده باشید. در آموزش های بعد با ما همراه باشید.
خیلی خیلی ممنون، صفحه splash رو ساختم و به اپلیکیشنم اضافه کردم ، باز هم تشکر ، خیلی روان و خوب توضیح دادید، دست گلت درد نکنه
سلام خسته نباشید . من یه SPLASH SCREEN ساختم اجرا میشه همچیشم اوکی حتی عکسی ک وارد کردم نشون داد ولی من style تمام صفحه به این اکتیویتی دادم وقتی اجرا میگیرم ازش عکس کامل تمام صفحه رو پر نمیکنه .اگه ممکنه راهنمایی کنید
سلام و عرض ادب
لطفا در قسمت طراحی layout موقعیت x و y خود را به صورت صد در صد انتخاب کنید.
با تشکر از همراهی شما
سلام
ممنون از آموزشتون !
سلام خسته نباشید
ببخشید من وقتی بکگراند اسبلشو عکس میذارم برنامه باز نمیشه نمدونم چرا
سلام و عرض ادب
سایز و فرمت های دیگه ای از عکس رو امتحان کنید
ممنون ، خیلی خوب و شفاف توضیح دادین .. مرسی
سلام اقای نیکخواه ممنون از راهنماییتون خواهشا بیشتر از این تو مباحث اندروید وارد بشید حیفه که چنین استاد توانمند یک پکیج کامل اندروید نداشته باشه
سلام و عرض ادب
از ابراز محبت شما سپاسگزاریم. اما تولید محتوای با کیفیت کاری دشوار و هزینه بر است. با این وجود تلاش ما در همین راستا می باشد و امید است، در آینده ای نزدیک محتوایی شایسته کاربران سایت ارائه گردد.
با تشکر از همراهی شما
سلام
داشتن سواد بالا یه چیزه و داشتن قدرت انتقال اطلاعات به دیگران یه چیزه دیگه…
کیفیت آموزش بی نظیره…
ممنون
با سلام و عرض ادب
از محبت و انرژی مثبت شما سپاسگزاریم.
آرزوی موفقیت برای شما
سلام خسته نباشید
توی اسپلش جاوا این قسمت . new Handler که آخرش new Runnable هست کمرنگ میشه و خطا میده چند بار هم طبق راهنمایی شما انجام دادم ولی برطرف نشد . لطفا راهنمایی بفرمایید .
باسلام و عرض خسته نباشید. خطای زیر همچنان هست ولی برنامه اجرا میشه و سه ثانیه بعد هم عمل می کنه .
Anonymous new Runnable() can be replaced with lambda
سلام و عرض ادب. ورژن جاوا که شما نصب کردید چند هست؟ اگر ۸ نصب کردید باید آن را به ورژن بالاتر مثل ۱۷ ارتقاء دهید.
با تشکر از همراهی شما
مهندس ممنون که پاسخ دادید: بله شما درست فرمودید جاوا ۸ بود الان به ۱۷ ارتقا دادم ولی همون اخطار زرد رنگ new Runnable() هست . واون قسمت کمرنگ .
سلام ببخشید مهندس . مشکل برطرف شد . موس را روی گزینه خطا نگه داشتم بعد از چند لحظه پیشنهاد های نشان داد رفتم روی اونها و وارد قسمتی شدم که گزینه هایی زیادی بود بخشی هم جاوا ها بودند تیک جاواهای ورژن پایین را برداشتم و ok زدم برگشتم به برنامه خطا برطف شده بود .