<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/posts/rss.xsl"?>
<rss version="2.0">
<channel>

<title>https://maisamk.loxblog.com</title>
<link>https://maisamk.loxblog.com</link>
<description></description>
<language>fa-ir</language>
<generator>loxblog.com</generator>
<copyright>loxblog.com</copyright>


<item>
<title>قالب (Theme)</title>
<link>https://maisamk.loxblog.com/قالب-theme-1</link>
<guid>https://maisamk.loxblog.com/قالب-theme-1</guid>

<description><![CDATA[

قالب (Theme)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;قالب&raquo; ( لینک دانلود در ادامه مطلب )
زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادامه مطلب )
دریافت نسخه&zwnj;ی pdf این آموزش [1.61 مگابایت] ( لینک دانلود در ادامه مطلب )
تو آموزش قبل با سبک&zwnj;های نمایش آشنا شدیم، قالب هم یه چیزی تو همون مایه&zwnj;هاست، تفاوتش اینه که قالب به کل یه فعالیت (activity) یا کل یه پروژه اعمال می&zwnj;شه ولی سبک&zwnj;نمایش فقط به یه شی اعمال می&zwnj;شه.
۱. یه پروژه جدید بسازید و فایل activity_main.xml (در زیرشاخه res-&gt;layout) رو باز کنید، (اگر همین الان پروژه رو ساختید خودش این فایل رو براتون باز می کنه). از ستون سمت چپ چند تا شی بندازید تو صفحه (تا وقتی قالب رو عوض می&zwnj;کنید متوجه تغییرات بشید). اندروید خودش به صورت پیش&zwnj;فرض، یک عالمه قالب مختلف برای صفحات فعالیت و پروژه داره، از منوی بالا اونجا که نوشته app theme کلیک کنید، یه فهرست براتون باز می&zwnj;شه که قالب&zwnj;ها رو دسته&zwnj;بندی کرده، می&zwnj;تونید هر کدوم از قالب&zwnj;ها رو امتحان کنید و تاثیرش رو روی صفحه&zwnj;تون ببینید.
مثلا از گزینه Theme، قالب Theme.Translucent رو انتخاب کنید، در این حالت شما هیچ پس&zwnj;زمینه&zwnj;ای ندارید و همه اشیائی که در صفحه می&zwnj;گذارید روی پس&zwnj;زمینه خود گوشی نمایش داده می&zwnj;شه (یا هرچیزی که قبلش اجرا شده باشه)
حالا Theme.Dialog رو انتخاب کنید. این قالب همون&zwnj;طور که از اسمش پیداست، مربوط به محاوره است، مثلا دیدید تو بعضی برنامه&zwnj;ها وقتی می&zwnj;خواید از برنامه خارج بشید یه صفحه کوچکتر یهو وا می&zwnj;شه می&zwnj;پرسه &laquo;آیا واقعا می&zwnj;خواید خارج بشید؟&raquo;، در اون مواقع از این قالب استفاده شده.

۲. اگر قالبی رو همون&zwnj;طور که تو مرحله&zwnj;ی قبل گفته شد انتخاب کنید، در واقع به برنامه&zwnj;ی شما اعمال نمی&zwnj;شه، برای اینکه قالب برنامه&zwnj;تون رو تغییر بدید باید AndroidManifest.xml رو باز کنید و به زبانه Application برید. جایی که نوشته Theme جلوش دکمه Browse رو بزنید و بعد هم از بالاش دکمه System Resources و قالب مورد نظرتونو انتخاب کنید.

می&zwnj;تونید همین کارو از قسمت ویرایش متنی انجام بدید، اونجایی که برچسب application وجود داره، یه خط هست که نوشته android:Theme که مساوی قالبی که مدنظرتون هست قرار بدید.
توجه دارید که می&zwnj;شه فقط قالب یه فعالیت (activity) رو تغییر بدید که مشابه همین کارو (در قسمت ویرایش متنی) برای داخل برچسب اون فعالیت انجام می&zwnj;دید.
حالا برنامه رو تو شبیه ..............................................



قالب (Theme)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;قالب&raquo;
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه&zwnj;ی pdf این آموزش [1.61 مگابایت]&nbsp;
تو آموزش قبل با سبک&zwnj;های نمایش آشنا شدیم، قالب هم یه چیزی تو همون مایه&zwnj;هاست، تفاوتش اینه که قالب به کل یه فعالیت (activity) یا کل یه پروژه اعمال می&zwnj;شه ولی سبک&zwnj;نمایش فقط به یه شی اعمال می&zwnj;شه.
۱. یه پروژه جدید بسازید و فایل activity_main.xml (در زیرشاخه res-&gt;layout) رو باز کنید، (اگر همین الان پروژه رو ساختید خودش این فایل رو براتون باز می کنه). از ستون سمت چپ چند تا شی بندازید تو صفحه (تا وقتی قالب رو عوض می&zwnj;کنید متوجه تغییرات بشید). اندروید خودش به صورت پیش&zwnj;فرض، یک عالمه قالب مختلف برای صفحات فعالیت و پروژه داره، از منوی بالا اونجا که نوشته app theme کلیک کنید، یه فهرست براتون باز می&zwnj;شه که قالب&zwnj;ها رو دسته&zwnj;بندی کرده، می&zwnj;تونید هر کدوم از قالب&zwnj;ها رو امتحان کنید و تاثیرش رو روی صفحه&zwnj;تون ببینید.
مثلا از گزینه Theme، قالب Theme.Translucent رو انتخاب کنید، در این حالت شما هیچ پس&zwnj;زمینه&zwnj;ای ندارید و همه اشیائی که در صفحه می&zwnj;گذارید روی پس&zwnj;زمینه خود گوشی نمایش داده می&zwnj;شه (یا هرچیزی که قبلش اجرا شده باشه)
حالا Theme.Dialog رو انتخاب کنید. این قالب همون&zwnj;طور که از اسمش پیداست، مربوط به محاوره است، مثلا دیدید تو بعضی برنامه&zwnj;ها وقتی می&zwnj;خواید از برنامه خارج بشید یه صفحه کوچکتر یهو وا می&zwnj;شه می&zwnj;پرسه &laquo;آیا واقعا می&zwnj;خواید خارج بشید؟&raquo;، در اون مواقع از این قالب استفاده شده.

۲. اگر قالبی رو همون&zwnj;طور که تو مرحله&zwnj;ی قبل گفته شد انتخاب کنید، در واقع به برنامه&zwnj;ی شما اعمال نمی&zwnj;شه، برای اینکه قالب برنامه&zwnj;تون رو تغییر بدید باید AndroidManifest.xml رو باز کنید و به زبانه Application برید. جایی که نوشته Theme جلوش دکمه Browse رو بزنید و بعد هم از بالاش دکمه System Resources و قالب مورد نظرتونو انتخاب کنید.

می&zwnj;تونید همین کارو از قسمت ویرایش متنی انجام بدید، اونجایی که برچسب application وجود داره، یه خط هست که نوشته android:Theme که مساوی قالبی که مدنظرتون هست قرار بدید.
توجه دارید که می&zwnj;شه فقط قالب یه فعالیت (activity) رو تغییر بدید که مشابه همین کارو (در قسمت ویرایش متنی) برای داخل برچسب اون فعالیت انجام می&zwnj;دید.
حالا برنامه رو تو شبیه ساز اجرا کنید تا ببینید چطور شده.

۳.خوب تا الان ما از قالب پیش&zwnj;ساخته گوگل استفاده کردیم، درست مثل سبک&zwnj;نمایش می&zwnj;تونیم خودمون قالب بسازیم، منتها باید یکی از قالب&zwnj;های پیش&zwnj;ساخته رو به عنوان پایه در نظر بگیریم و روش تغییرات بدیم. بیاید یه قالب بر پایه&zwnj;ی همین قالب Theme.Dialog بسازیم، مثلا می&zwnj;خوایم توش متن&zwnj;هامون قرمز رنگ باشن. برای این&zwnj;کار styles.xml رو باز کنید (res -&gt; Values) مثل آموزش قبل یه برچسب style ایجاد کنید، این قالب باید یه اسم داشته باشه من اسمشو می&zwnj;ذارم ghalebeMan (اسمی که می&zwnj;خواید بذارید نباید فاصله space داشته باشه) و باید والدش android:style/Theme.Dialog@ باشه.
&lt;stylename="ghalebeMan"parent="@android:style/Theme.Dialog"&gt;&lt;/style&gt;
۴.و درون این قالب جدیدی که ساختیم رنگ متن&zwnj;ها رو قرمز کنیم. با ساختن یک item مشابه آموزش قبل.
&lt;stylename="ghalebeMan"parent="@android:style/Theme.Dialog"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;itemname="@android:textColor"&gt;#f00&lt;/item&gt;&lt;/style&gt;
پس این قالب جدیدمون همون Theme.Dialog هست فقط رنگ متناش قرمزه، حالا بیاید قالب برنامه&zwnj;مون رو به ghalebeMan تغییر بدیم. مراحل رو تو شکل دنبال کنید.

۵. وقتی برنامه رو اجرا کنیم، می&zwnj;بینیم که تغییرات اعمال شده و متن&zwnj;ها قرمز شده.

و مثل آموزش قبل می&zwnj;تونید به این صفحه برید و قالب&zwnj;های پیش&zwnj;ساخته&zwnj;ی اندروید رو ببینید و هر کدوم رو که خواستید گسترش بدید :)

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


<item>
<title>سبک‌های نمایش (styles)</title>
<link>https://maisamk.loxblog.com/سبکهای-نمایش-styles-1</link>
<guid>https://maisamk.loxblog.com/سبکهای-نمایش-styles-1</guid>

<description><![CDATA[

سبک&zwnj;های نمایش (styles)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;سبک&zwnj;های نمایش&raquo; ( لینک دانلود در ادامه مطلب )
زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادامه مطلب )
دریافت نسخه&zwnj;ی pdf این آموزش [1.15 مگابایت] ( لینک دانلود در ادامه مطلب )
سبک نمایش پیش&zwnj;فرض اندروید، ممکنه قشنگ به نظر برسه اما خیلی ها دوست دارن که خودشون تعیین کنن که هر چیزی چطور نمایش داده بشه، منظورم ابعاد و رنگ و خیلی ویژگی&zwnj;های ظاهری دیگه است. می&zwnj;خوایم تو این آموزش یاد بگیریم چطور یه سبک نمایش بسازیم و در قسمت&zwnj;های مختلف ازش استفاده کنیم.
۱.برای شروع یه پروژه جدید بسازید و فایل activity_main.xml (در زیرشاخه res-&gt;layout) رو باز کنید، (اگر همین الان پروژه رو ساختید خودش این فایل رو براتون باز می کنه) روی متن Hello world کلیک کنید، حالا می&zwnj;خوایم یه سری از ویژگی&zwnj;هاشو تغییر بدیم، مثلا اندازه&zwnj;اش، فونت&zwnj;اش و رنگش. من این تغییرات رو دادم: رنگ f00 اندازه 25sp فونت serif و text style: bold

۲.حالا می&zwnj;خوایم یاد بگیریم که چطور همین ویژگی&zwnj;ها رو دوباره روی یه متن دیگه اعمال کنیم بدون اینکه ریزه کاری ها رو دوباره انجام بدیم. یعنی یه سبک با همین مشخصات می سازیم و روی هر متنی که خواستیم اون سبک رو اعمال می&zwnj;کنیم تا همین تغییرات روش اعمال بشه. این کار به درد زمانی می&zwnj;خوره که شما می خواید مثلا تمام دکمه&zwnj;هاتون یه رنگ و شکل و اندازه خاص داشته باشن و وقتی پروژه بزرگ باشه اعمال کردن همه تغییرات به صورت تک به تک واقعا زمان&zwnj;بره و درست کردن یه سبک کلی، خیلی کمک می&zwnj;کنه.
برای ساختن یه سبک نمایش، فایل styles.xml (زیر شاخه res-&gt;values) رو باز کنید. قسمت متنی رو از روی زبانه&zwnj;ی پایین انتخاب کنید.

۳.همون طور که می&zwnj;بینید قبلا دوتا سبک نمایش (style) تو این فایل تعریف شده، حالا ما هم می&zwnj;خوایم یکی دیگه تعریف کنیم، هر سبک نمایش اول احتیاج به یه اسم داره، مثلا من می&zwnj;ذارم ekhtar، بعد هم باید از یک نوع سبک نمایش ارث&zwnj;بری کنیم، چون در غیر اینصورت باید تمامی ویژگی های اون سبک رو تعریف و مقداردهی کنیم که عملا کار عقلانی نیست چون هر شی&zwnj;ای هزاران ویژگی داره که ممکنه ما فقط بخوایم یه موردشو تغییر بدیم. از اونجایی که الان می&zwnj;خوایم سبک نمایش متن رو گسترش بدیم بهتره به عنوان والد (parent) از ظاهرمتن ...........................................



سبک&zwnj;های نمایش (styles)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;سبک&zwnj;های نمایش&raquo;
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه&zwnj;ی pdf این آموزش [1.15 مگابایت]
سبک نمایش پیش&zwnj;فرض اندروید، ممکنه قشنگ به نظر برسه اما خیلی ها دوست دارن که خودشون تعیین کنن که هر چیزی چطور نمایش داده بشه، منظورم ابعاد و رنگ و خیلی ویژگی&zwnj;های ظاهری دیگه است. می&zwnj;خوایم تو این آموزش یاد بگیریم چطور یه سبک نمایش بسازیم و در قسمت&zwnj;های مختلف ازش استفاده کنیم.
۱.برای شروع یه پروژه جدید بسازید و فایل activity_main.xml (در زیرشاخه res-&gt;layout) رو باز کنید، (اگر همین الان پروژه رو ساختید خودش این فایل رو براتون باز می کنه) روی متن Hello world کلیک کنید، حالا می&zwnj;خوایم یه سری از ویژگی&zwnj;هاشو تغییر بدیم، مثلا اندازه&zwnj;اش، فونت&zwnj;اش و رنگش. من این تغییرات رو دادم: رنگ f00 اندازه 25sp فونت serif و text style: bold

۲.حالا می&zwnj;خوایم یاد بگیریم که چطور همین ویژگی&zwnj;ها رو دوباره روی یه متن دیگه اعمال کنیم بدون اینکه ریزه کاری ها رو دوباره انجام بدیم. یعنی یه سبک با همین مشخصات می سازیم و روی هر متنی که خواستیم اون سبک رو اعمال می&zwnj;کنیم تا همین تغییرات روش اعمال بشه. این کار به درد زمانی می&zwnj;خوره که شما می خواید مثلا تمام دکمه&zwnj;هاتون یه رنگ و شکل و اندازه خاص داشته باشن و وقتی پروژه بزرگ باشه اعمال کردن همه تغییرات به صورت تک به تک واقعا زمان&zwnj;بره و درست کردن یه سبک کلی، خیلی کمک می&zwnj;کنه.
برای ساختن یه سبک نمایش، فایل styles.xml (زیر شاخه res-&gt;values) رو باز کنید. قسمت متنی رو از روی زبانه&zwnj;ی پایین انتخاب کنید.

۳.همون طور که می&zwnj;بینید قبلا دوتا سبک نمایش (style) تو این فایل تعریف شده، حالا ما هم می&zwnj;خوایم یکی دیگه تعریف کنیم، هر سبک نمایش اول احتیاج به یه اسم داره، مثلا من می&zwnj;ذارم ekhtar، بعد هم باید از یک نوع سبک نمایش ارث&zwnj;بری کنیم، چون در غیر اینصورت باید تمامی ویژگی های اون سبک رو تعریف و مقداردهی کنیم که عملا کار عقلانی نیست چون هر شی&zwnj;ای هزاران ویژگی داره که ممکنه ما فقط بخوایم یه موردشو تغییر بدیم. از اونجایی که الان می&zwnj;خوایم سبک نمایش متن رو گسترش بدیم بهتره به عنوان والد (parent) از ظاهرمتن (TextAppearance) استفاده می&zwnj;کنیم تا تمام ویژگی&zwnj;های ظاهری متن رو داشته باشیم و موارد دلخواه رو بازنویسی (override) کنیم. تمامی سبک&zwnj;های نمایش پیش&zwnj;فرض در /android:style@ قرار دارن. خوب تا اینجا کدمون اینطوری شد:
&lt;stylename="ekhtar"parent="@android:style/TextAppearance"&gt;&lt;/style&gt;
۴.در داخل برچسب style باید اون چیزایی که قصد داریم بازنویسی کنیم رو قرار بدیم. برای هر ویژگی که می&zwnj;خوایم بازنویسی کنیم باید یه برچسب item تشکلیل بدیم. هر item یه اسم داره و یه مقدار، مثلا برای اندازه&zwnj;ی متن می&zwnj;تونیم از این خط استفاده کنیم:
&lt;itemname="android:textSize"&gt;25sp&lt;/item&gt;
اسم هر item باید کلمات مشخصی باشه تا برنامه بفهمه منظور مون دقیقا چیه، برای اینکه بدونیم چه اسمی باید بذاریم، فایل activity_main.xml رو در قسمت متنی باز کنید. می&zwnj;بینید برای اون متنی که چند دیقه پبش تغییرش دادیم یه سری ویژگی رو نوشته که ما هم دقیقا از همون اسامی در item ها استفاده می&zwnj;کنیم.

بعد از وارد کردن ویژگی&zwnj;هایی که می&zwnj;خوایم، کد سبک نمایش&zwnj;مون اینطوری می&zwnj;شه:
&lt;stylename="ekhtar"parent="@android:style/TextAppearance"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;itemname="android:textSize"&gt;25sp&lt;/item&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;itemname="android:textStyle"&gt;bold&lt;/item&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;itemname="android:typeface"&gt;serif&lt;/item&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;itemname="android:textColor"&gt;#f00&lt;/item&gt;&lt;/style&gt;
۵.فایل styles.xml رو ذخیره کنید و به قسمت گرافیکی activity_main.xml برید. اون متنی که بود رو پاک کنید و یه متن دیگه روی صفحه بندازید. حالا از ستون properties خط style رو پیدا کنید و روش دوتا کلیک کنید تا سبک&zwnj;های نمایش موجود رو بهتون نشون بده و از بینشون همونی که الان ساختید (ekhtar) رو انتخاب کنید. بعد از انتخاب اون سبک، متن&zwnj;تون دقیقا همون ویژگی&zwnj;هایی که تعریف کرده بودید رو پیدا می&zwnj;کنه.

می&zwnj;تونید از این سبک تو کل پروژه تون استفاده کنید و اگر یادتون افتاد که باید یه تغییری می&zwnj;دادید و فراموش کردید، به راحتی فقط فایل styles.xml رو تغییر می&zwnj;دید و اون تغییر روی تمام متن&zwnj;هایی که اون سبک نمایش رو دارن اعمال می&zwnj;شه.
۶.حالا می&zwnj;خوایم یه سبک نمایش درست کنیم که دقیقا همین شکلی باشه ولی متن به جای bold،کج (italic) باشه، یعنی انگار یه زیرکلاس می&zwnj;خوایم برای سبک قبلی تعریف کنیم. برای این کار، تو فایل styles.xml یه برچسب جدید درست می&zwnj;کنیم و این بار اسمشو می&zwnj;ذاریم ekhtar.kaj این یعنی ما می&zwnj;خوایم تمام ویژگی&zwnj;های سبک ekhtar رو داشته باشیم ولی فقط کجش کنیم. اینطوری:
&lt;stylename="ekhtar.kaj"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;itemname="android:textStyle"&gt;italic&lt;/item&gt;&lt;/style&gt;
الان اگه تو فایل activity_main.xml اون متن رو انتخاب کنیم، می&zwnj;تونیم از قسمت style در properties گزینه ekhtar.kaj رو انتخاب کنیم تا متن کجکی بشه :)

۷.ممکنه تو مرحله ۳ براتون سوال پیش اومده باشه که من چطور فهمیدم باید از ظاهرمتن (TextAppearance) به عنوان والد در ارث&zwnj;بری استفاده کنیم. باید بگم خوبیه اندروید اینه که متن&zwnj;بازه، یعنی تمام محتوای سیستم عاملش رو اینترنت هست، ما&zwnj; می&zwnj;تونیم به قسمت سبک&zwnj;های نمایش&zwnj;اش بریم و اسم تمامی سبک&zwnj;های موجود رو ببینیم، مثلا یکی از جاهایی که سیستم عامل اندروید رو به صورت متن&zwnj;باز قرار داده اینجاست. توی این سایت از ستون سمت چپ رو نسخه&zwnj;ی API ای که استفاده می&zwnj;کنید کلیک کنید و مسیر زیر رو باز کنید: (مثلا من نسخه 2.3.3 رو باز کردم)
2.3.3_r1 -&gt; frameworks -&gt; base -&gt; core -&gt; res -&gt; res -&gt; values -&gt; styles.xml
بعد براتون یه صفحه ای مثل این رو باز می&zwnj;کنه که می&zwnj;تونید انواع سبک&zwnj;های نمایش رو توش ببینید و حتی اگه کنجکاو باشید که هر سبک رو چطور ساختن، می&zwnj;تونید کدش رو بخونید.

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


<item>
<title>فهرست‌های سفارشی (Customized Lists)</title>
<link>https://maisamk.loxblog.com/فهرستهای-سفارشی-customized-lists-1</link>
<guid>https://maisamk.loxblog.com/فهرستهای-سفارشی-customized-lists-1</guid>

<description><![CDATA[

فهرست&zwnj;های سفارشی (Customized Lists)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;فهرست&zwnj;های سفارشی&raquo; ( لینک دانلود در ادامه مطلب ) 
زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادامه مطلب ) 
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[757 کیلوبایت] ( لینک دانلود در ادامه مطلب ) &nbsp; 
تو آموزش قبلی یاد گرفتیم که چطور یک فهرست ساده درست کنیم. حالا می&zwnj;خوایم یاد بگیریم که چطور اون فهرست رو سفارشی کنیم و ازحالت سادگی درش بیاریم.
۱.مثل آموزش قبل یه پروژه با&nbsp;یک فهرست ساده بسازید در ادامه&nbsp;می&zwnj;خوایم برای هر ردیف از فهرستمون یه عکس نشان&nbsp;اون دانشگاه رو هم کنار اسمش&nbsp;بندازیم. پس اول از همه تصاویر مورد نظر رو به پروژه مون در زیرشاخه res و پوشه drawable-hdpi اضافه می&zwnj;کنیم، فایل عکس&zwnj;هایی که من استفاده کردم رو می&zwnj;تونید از اینجا دانلود کنید. وارد کردنش به پروژه هم کار آسونیه، هرجایی که عکسهاتون هست کپی کنید و بعد روی پوشه&nbsp;drawable-hdpi راست کلیک کنید و paste.

۲.اولین کاری که باید بکنیم اینه که یه طرح&zwnj;بندی برای هر ردیف از فهرست درست کنیم. تا با توجه به اون اندروید اطلاعتمون رو در هر ردیف بدونه چطور نمایش بده. پس احتیاج داریم تا یه فایل xml برای طرح&zwnj;بندی&zwnj;مون بسازیم. روی فولدر layout (در res) راست کلیک کنید. گزینه New و other رو انتخاب کنید. (این تصویر) بعد هم از زیرشاخه Android گزینه Android XML Layout File رو انتخاب کنید و براش اسم بذارید من اسمشو می&zwnj;ذارم redife_fehrest.
۳. خوب اولین چیزی که هر ردیف می&zwnj;خوایم داشته باشه یه تصویره، پس یه نمای&zwnj;تصویر (imageView) در فایل تازه ساخته&nbsp;شدمون می&zwnj;ذاریم. نمای&zwnj;تصویر رو می&zwnj;تونید از ستون سمت چپ از بخش Images &amp; Media بکشید و روی صفحه رها کنید. همین که رهاش می&zwnj;کنید یه پنجره باز می&zwnj;شه که ازتون می&zwnj;خواد منبع عکس رو مشخص کنید، و اگه به درستی تصاویرتون رو وارد کرده باشید، می&zwnj;بینیدشون.

۴.هر ردیف قراره یه متن داشته باشه که نام دانشگاه درش نوشته بشه، پس یه نمای&zwnj;متنی (TextView) هم وارد صفحه می&zwnj;کنیم و کنار نمای&zwnj;تصویر می&zwnj;ذاریم. الان تصویرمون در کنار متن اینطوریه که به نظر خیلی مطلوب نمی&zwnj;یاد

می&zwnj;تونیم یه کم ویژگی&zwnj;های متن رو تغییر بدیم، مثه اندازه، فاصله از بالای صفحه و سمت راستش و ...

۵.به فایل MainActivity.java (در src) می&zwnj;ریم. در آموزش قبل یک آرایه&zwnj;ی&zwnj;وفق&zwnj;دهنده درست کرده بودیم:
setListAdapter (newArrayAdapter&lt;String&gt;(this, 
android.R.layout.simple_list_item_1,
getResources ().getStringArray(R.array.daneshgah)));
حالا باید برای این فهرست سفارشی&zwnj;مون خودمون کلاس وفق&zwnj;دهنده (Adapter) بسازیم. پس ........................................................



فهرست&zwnj;های سفارشی (Customized Lists)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;فهرست&zwnj;های سفارشی&raquo;
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[757 کیلوبایت]&nbsp;
تو آموزش قبلی یاد گرفتیم که چطور یک فهرست ساده درست کنیم. حالا می&zwnj;خوایم یاد بگیریم که چطور اون فهرست رو سفارشی کنیم و ازحالت سادگی درش بیاریم.
۱.مثل آموزش قبل یه پروژه با&nbsp;یک فهرست ساده بسازید در ادامه&nbsp;می&zwnj;خوایم برای هر ردیف از فهرستمون یه عکس نشان&nbsp;اون دانشگاه رو هم کنار اسمش&nbsp;بندازیم. پس اول از همه تصاویر مورد نظر رو به پروژه مون در زیرشاخه res و پوشه drawable-hdpi اضافه می&zwnj;کنیم، فایل عکس&zwnj;هایی که من استفاده کردم رو می&zwnj;تونید از اینجا دانلود کنید. وارد کردنش به پروژه هم کار آسونیه، هرجایی که عکسهاتون هست کپی کنید و بعد روی پوشه&nbsp;drawable-hdpi راست کلیک کنید و paste.

۲.اولین کاری که باید بکنیم اینه که یه طرح&zwnj;بندی برای هر ردیف از فهرست درست کنیم. تا با توجه به اون اندروید اطلاعتمون رو در هر ردیف بدونه چطور نمایش بده. پس احتیاج داریم تا یه فایل xml برای طرح&zwnj;بندی&zwnj;مون بسازیم. روی فولدر layout (در res) راست کلیک کنید. گزینه New و other رو انتخاب کنید. (این تصویر) بعد هم از زیرشاخه Android گزینه Android XML Layout File رو انتخاب کنید و براش اسم بذارید من اسمشو می&zwnj;ذارم redife_fehrest.
۳. خوب اولین چیزی که هر ردیف می&zwnj;خوایم داشته باشه یه تصویره، پس یه نمای&zwnj;تصویر (imageView) در فایل تازه ساخته&nbsp;شدمون می&zwnj;ذاریم. نمای&zwnj;تصویر رو می&zwnj;تونید از ستون سمت چپ از بخش Images &amp; Media بکشید و روی صفحه رها کنید. همین که رهاش می&zwnj;کنید یه پنجره باز می&zwnj;شه که ازتون می&zwnj;خواد منبع عکس رو مشخص کنید، و اگه به درستی تصاویرتون رو وارد کرده باشید، می&zwnj;بینیدشون.

۴.هر ردیف قراره یه متن داشته باشه که نام دانشگاه درش نوشته بشه، پس یه نمای&zwnj;متنی (TextView) هم وارد صفحه می&zwnj;کنیم و کنار نمای&zwnj;تصویر می&zwnj;ذاریم. الان تصویرمون در کنار متن اینطوریه که به نظر خیلی مطلوب نمی&zwnj;یاد

می&zwnj;تونیم یه کم ویژگی&zwnj;های متن رو تغییر بدیم، مثه اندازه، فاصله از بالای صفحه و سمت راستش و ...

۵.به فایل MainActivity.java (در src) می&zwnj;ریم. در آموزش قبل یک آرایه&zwnj;ی&zwnj;وفق&zwnj;دهنده درست کرده بودیم:
setListAdapter (newArrayAdapter&lt;String&gt;(this, 
android.R.layout.simple_list_item_1,
getResources ().getStringArray(R.array.daneshgah)));
حالا باید برای این فهرست سفارشی&zwnj;مون خودمون کلاس وفق&zwnj;دهنده (Adapter) بسازیم. پس کلمه ArrayAdapter رو به AdaptereMan تغییر می&zwnj;دیم (می&zwnj;دونم که هنوز کلاسشو نساختیم). حالا زیر کلمه&nbsp;AdaptereMan خط قرمز می&zwnj;کشه و وقتی ctrl+1 رو بزنید بهتون پیشنهاد می&zwnj;ده که اون کلاس رو بسازید، ولی ما خودمون می خوایم اون کلاس رو بسازیم. اما همین کد قبلی رو یه تغییر دیگه هم باید بدیم و اون اینه که یه ورودی دیگه قبل از getResources اضافه کنیم و اون هم شناسه (Id) اون نمای&zwnj;متنی هست که قراره نوشته&zwnj;های هر ردیف درونش قرار بگیره. پس کد اینطوری می&zwnj;شه:
setListAdapter (newAdaptereMan&lt;String&gt;(this,
				android.R.layout.simple_list_item_1, R.id.textView1,
				getResources ().getStringArray(R.array.daneshgah)));
۶.می&zwnj;تونیم کلاس AdaptereMan رو توی همون کلاس اصلی&zwnj;مون بسازیم، البته اگه پروژه بزرگ باشه بهتره تو یه فایل جداگانه ساخته بشه ولی برای پروژه الان ما مشکلی ایجاد نمی&zwnj;کنه. در ضمن می&zwnj;خوایم که کلاسمون از ArrayAdapter توسعه پیدا کنه.
privateclassAdaptereManextendsArrayAdapter&lt;String&gt;{
۷. وقتی کد بالا رو می&zwnj;نویسیم زیر نام کلاس خط قرمز می&zwnj;کشه و ازمون می&zwnj;خواد که یه سازنده برای کلاسمون ایجاد کنیم، اونی رو انتخاب می&zwnj;کنیم که ۴ تا ورودی به این ترتیب داشته باشه : محتوا، عدد صحیح (int)، عدد صحیح و فهرستی از نوع رشته (&lt;list &lt;string)

&nbsp;وقتی روش می&zwnj;زنیم سازنده رو برامون ایجاد می&zwnj;کنه و ما تغییرش نمی&zwnj;دیم چون داره سازنده ArrayAdapter رو پیاده می&zwnj;کنه، کاری که ما می&zwnj;خوایم بکنیم اینه که تابع getView رو دوباره&zwnj;نویسی (override) کنیم.
@OverridepublicView getView (int makan,View convertView,ViewGroup parent){// TODO Auto-generated method stubreturnsuper.getView(makan, convertView, parent);}
۸.تابع getView برای هر ردیف از فهرست صدا زده می&zwnj;شه. و زمانی که صدا زده بشه ما این انتخاب رو داریم که برای هر ردیف در فهرستمون چه چیزی رو نشون بدیم. در این مثال ما می&zwnj;خوایم این تابع رو تغییر بدیم تا در کنار نام هر دانشگاه، نشان مربوط به همون دانشگاه قرار بگیره. باید به اون نمای&zwnj;تصویر و نمای متنی یه طوری دسترسی پیدا کنیم و راهش اینه که از کلاس بازکننده&zwnj;صفحه&zwnj;بندی (LayoutInflater)&zwnj; یه نمونه بگیریم و به عنوان ورودی بهش اون صفحه&zwnj;بندی که برای هر ردیف فهرست درست کردیم رو بدیم تا برامون بازش کنه و بتونیم تغییرش بدیم. &nbsp;پس اون خط توضیحات (comment) رو از کد بالا پاک می کنیم و به جاش می&zwnj;نویسیم LayoutInflater bazkonande = حالا باید از یکی از خدمات سیستمی اندروید استفاده کنیم، به نام&nbsp;Context.LAYOUT_INFLATER_SERVICE.
LayoutInflater bazkonande =(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
۹.یه نمونه از کلاس نما (View) می&zwnj;سازیم تا اطلاعات بازشده از صفحه&zwnj;بندی بالا رو بهش بدیم و اون نمای&zwnj;تصویر و نمای&zwnj;متنی رو ازش بکشیم بیرون و مقداردهی&zwnj;اش کنیم. اسمش رو radif می&zwnj;ذاریم و مساوی با bazkonande.inflate.

این تابع سه ورودی می&zwnj;خواد، شماره منبع چیزی که می&zwnj;خوایم بازش کنیم (همون صفحه&zwnj;بندیه)، گروه&zwnj;نما (همون والد این کلاس) و یه متغیر درستی\نادرستی که الان می&zwnj;ذاریمش نادرست.
View radif = bazkonande.inflate(R.layout.radife_fehrest, parent,false);
۱۰.خوب برای اینکه خود فهرستمون رو داشته باشیم یه آرایه&zwnj;ی&zwnj;رشته&zwnj;ای محلی تو همین کلاس درست می کنیم و مقادیر اون فهرست رو می&zwnj;ریزیم توش. (برای راحتی کار با فهرست)&zwnj;&nbsp;اینطوری:
String[] radifha = getResources ().getStringArray(R.array.daneshgah);
حالا وقتشه که&nbsp;از اون نمای&zwnj;متنی و نمای&zwnj;تصویری مربوط به هر ردیف ارجاع&nbsp;بگیریم تا بتونیم تغییرشون بدیم.&nbsp;خیلی ساده مثل قبلنا:
ImageView tasvir =(ImageView) radif.findViewById(R.id.imageView1);TextView matn =(TextView) radif.findViewById(R.id.textView1);
۱۱.متنی&nbsp;که نمای&zwnj;متنی باید نمایش بده رو باید از اون آرایه&zwnj;ی رشته&zwnj;ها در بیاریم. اینکه الان در مکان کدام عنصر از آرایه هستیم رو اولین ورودی تابع getView&nbsp;مشخص می&zwnj;کنه به اسم makan. پس:
matn.setText (radifha[makan]);
تصویری که نمای&zwnj;تصویر باید نمایش بده بر حسب نوشته است، یعنی یه سری عبارت شرطی می&zwnj;ذاریم و بررسی می&zwnj;کنیم نمای&zwnj;متنی چه عبارتی رو داره نشون می&zwnj;ده و با توجه به اون تصویر مناسب رو تو نمای&zwnj;تصویری بارگزاری می&zwnj;کنیم. اما چون متن ما فارسی بوده قبول نمی&zwnj;کنه که تو عبارت شرطی فارسی بنویسیم، یعنی این&zwnj;طوری:
if(radifha[makan].equals("دانشگاه صنعتی شریف"))
		tasvir.setImageResource(R.drawable.sharif);
به خاطر همین می&zwnj;تونیم با توجه به مکانی که اون عنصر آرایه داره تصویرش رو مشخص کنیم:
if(makan ==0)
	tasvir.setImageResource(R.drawable.kntu);elseif(makan ==1)
	tasvir.setImageResource(R.drawable.iust);elseif(makan ==2)
	tasvir.setImageResource(R.drawable.sharif);elseif(makan ==3)
	tasvir.setImageResource(R.drawable.aut);elseif(makan ==4)
	tasvir.setImageResource(R.drawable.ut);
برای خروجی تابع هم فقط هم radif رو برگردونیم کافیه.
زیر AdaptereMan که اول استفاده کردیم یه خط قرمز کشیده، روش موس رو نگه می&zwnj;داریم و گزینه remove type argument رو می&zwnj;زنیم، بعد زیر کل ورودی&zwnj;ها خط قرمز می&zwnj;کشه، موس رو روش نگه می&zwnj;داریم و گزینه change constructor رو می&zwnj;زنیم.&nbsp;پس کلا کلاسمون این&zwnj;طوری می&zwnj;شه:
privateclassAdaptereManextendsArrayAdapter&lt;String&gt;{publicAdaptereMan(Context context,int resource,int textViewResourceId,String[] strings){super(context, resource, textViewResourceId, strings);// TODO Auto-generated constructor stub}@OverridepublicView getView (int makan,View convertView,ViewGroup parent){LayoutInflater bazkonande =(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);View radif = bazkonande.inflate(R.layout.radife_fehrest, parent,false);String[] radifha = getResources ().getStringArray(R.array.daneshgah);ImageView tasvir =(ImageView) radif.findViewById(R.id.imageView1);TextView matn =(TextView) radif.findViewById(R.id.textView1);
			
	matn.setText (radifha[makan]);if(makan ==0)
		tasvir.setImageResource(R.drawable.kntu);elseif(makan ==1)
		tasvir.setImageResource(R.drawable.iust);elseif(makan ==2)
		tasvir.setImageResource(R.drawable.sharif);elseif(makan ==3)
		tasvir.setImageResource(R.drawable.aut);elseif(makan ==4)
		tasvir.setImageResource(R.drawable.ut);return radif;}}
وقتی برنامه رو تو شبیه&zwnj;ساز دیدم این شکلی بود

به نظرم اومد بهتره برای radife_fehrest.xml از صفحه&zwnj;بندی نسبی استفاده کنم تا بتونم عکس و متن رو راست&zwnj;چین کنم به این صورت:

تغییراتی در ویژگی&zwnj;هاشون دادم:
نمای&zwnj;متنی:&zwnj; textSize:14sp - margin:top:20dp - margin:right:5dp
نمای&zwnj;تصویر: margin:top:5dp
که نتیجه&nbsp;این شد:

&nbsp;
&nbsp;

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


<item>
<title>فهرست‌ها (Lists)</title>
<link>https://maisamk.loxblog.com/فهرستها-lists-1</link>
<guid>https://maisamk.loxblog.com/فهرستها-lists-1</guid>

<description><![CDATA[

فهرست&zwnj;ها (Lists)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;فهرست&zwnj;ها&raquo; ( لینک دانلود در ادامه مطلب ) 
زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادامه مطلب ) 
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[719 کیلوبایت] ( لینک دانلود در ادامه مطلب ) 
یکی از مواردی که تو خیلی از برنامه می بینید فهرست هست. فهرست در واقع جایی به کار می&zwnj;ره که شما می&zwnj;خواید از بین یه سری گزینه تو فهرست یکی رو انتخاب کنید مثه انتخاب نام کشور خودتون در بین همه کشورها یا اینکه یه سری اطلاعات رو قراره تو قالب یک فهرست مشاهده کنین.
۱.خوب برای شروع یه پروژه اندروید بسازید. (تصویر متحرک ساختن پروژه) و در فولدر res روی فولدر values راست کلیک کنید و New بعد هم Other.

حالا از زیرساخه Android روی Android XML Values Files کلیک کنید و یه اسمی براش بذارید. من اسمشو می&zwnj;ذارم daneshgah.

۲.فایلی که ساختید براتون باز می&zwnj;شه، روی زبانه&zwnj;ی daneshgah.xml کلیک کنید تا خود فایل رو براتون باز کنه و این آرایه&zwnj;ی رشته&zwnj;ها رو توش وارد کنید. ما قراره این ............................



فهرست&zwnj;ها (Lists)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;فهرست&zwnj;ها&raquo;
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[719 کیلوبایت]
یکی از مواردی که تو خیلی از برنامه می بینید فهرست هست. فهرست در واقع جایی به کار می&zwnj;ره که شما می&zwnj;خواید از بین یه سری گزینه تو فهرست یکی رو انتخاب کنید مثه انتخاب نام کشور خودتون در بین همه کشورها یا اینکه یه سری اطلاعات رو قراره تو قالب یک فهرست مشاهده کنین.
۱.خوب برای شروع یه پروژه اندروید بسازید. (تصویر متحرک ساختن پروژه) و در فولدر res روی فولدر values راست کلیک کنید و New بعد هم Other.

حالا از زیرساخه Android روی Android XML Values Files کلیک کنید و یه اسمی براش بذارید. من اسمشو می&zwnj;ذارم daneshgah.

۲.فایلی که ساختید براتون باز می&zwnj;شه، روی زبانه&zwnj;ی daneshgah.xml کلیک کنید تا خود فایل رو براتون باز کنه و این آرایه&zwnj;ی رشته&zwnj;ها رو توش وارد کنید. ما قراره این آرایه رو داخل یک فهرست قرار بدیم.

۳.خوب به فایل MainActivity.java (در src) می&zwnj;ریم، می&zwnj;بینیم که به صورت پیش&zwnj;فرض کلاس اصلی&zwnj;مون توسط کلاس فعالیت (activity) توسعه داده شده، اگر ما در یک فعالیت بخوایم فقط از فهرست&zwnj;ها استفاده کنیم بهتره به جای کلاس فعالیت از کلاس فعالیت&zwnj;فهرستی یا ListAcrivity استفاده کنیم، پس خط اولمون این شکلی می&zwnj;شه:
publicclassMainActivityextendsListActivity{
وقتی کد رو تغییر می&zwnj;دید زیر کلمه ListActivity خط قرمز می&zwnj;کشه روش ctrl+1 بزنید و گزینه (import 'ListActivity' (android.app رو بزنید.
۴.حالا به فایل activity_main.xml می&zwnj;ریم (در res-&gt;layout) و از ستون سمت چپ (Palette) زیرشاخه composite برید و نمای&zwnj;فهرستی (ListView) رو روی صفحه بکشید و رها کنید. باید به فهرستمون یه شناسه خاص بدیم که بتونیم تو فعالیت&zwnj;فهرستیمون بهش ارجاع بدیم. چون در هر فعالیت فهرستی فقط می&zwnj;تونیم شناسه مربوط به یک فهرست رو بدیم. زبانه&nbsp;activity_main.xml رو از نوار پایین انتخاب کنید و دنبال خطی بگردید که با&nbsp;&lt;ListView شروع شده باشه. قسمت اولش نوشته "android:id="@+id/listView1 به کد زیر تغییرش بدید.&nbsp;
android:id="@android:id/list"
۵.به فایل MainActivity.java می&zwnj;ریم.&nbsp;برای اینکه مقادیر دلخواهمون رو به فهرست وارد کنیم، باید از تابع وفق&zwnj;دهنده&zwnj;فهرست ListAdapter استفاده کنیم. در واقع وفق&zwnj;دهنده مولفه&zwnj;ایه که داده مورد نظر رو می&zwnj;گیره و برای نمایش،&nbsp;شی&zwnj;مون رو وفق می&zwnj;ده. خوب از تابع ایجادوفق&zwnj;دهنده&zwnj;فهرست (setListAdapter) استفاده می&zwnj;کنیم و برای ورودیش یه نمونه جدید از&nbsp;آرایه&zwnj;ی&zwnj;وفق&zwnj;دهنده (ArrayAdapter)&nbsp;می&zwnj;سازیم. کاری که این آرایه می&zwnj;کنه اینه که آرایه&zwnj;ای از اطلاعات رو می&zwnj;گیره تا بتونه در فهرست ما نشون بده. برای درست کردن آرایه&zwnj;ی&zwnj;وفق&zwnj;دهنده سازنده&zwnj;های&nbsp;مختلفی وجود داره، سازنده&zwnj;ای که استفاده می&zwnj;کنید بسته به نوع اطلاعاتی داره که برای فهرستتون تهیه کردید. خوب مثلا اگه یه فهرست سفارشی درست کردیم که فقط یه متن معمولی نیست، می&zwnj;تونیم از شناسه منبع اون که به صورت نمای&zwnj;متنی (TextView) ذخیره شده استفاده کنیم. ولی چون ما اینجا می&zwnj;خوایم یه متن ساده رو به فهرستمون بفرستیم از این سازنده استفاده می کنیم که به عنوان ورودی ۳ تا مورد رو می خواد: محتوا، شماره منبع (که در اینجا همون صفحه&zwnj;بندیه) و شماره&zwnj;منبع&zwnj;نمای&zwnj;متنی.
ArrayAdapter(Context context,int resource,int textViewResourceId)
۶.برای محتوا کافیه کلمه this رو بنویسیم به معنی اینکه برای محتوا به همین فعالیت&zwnj;فهرستی ارجاع بشه، نوع این اطلاعات هم آرایه&zwnj;ای از رشته است که از همون فایل xml ای می&zwnj;یاد که ابتدای این آموزش ساختیم. برای منبع هم چون یه منبع خاص نساختیم می&zwnj;تونیم از منابع داخلی خود اندروید استفاده کنیم. android.R.layout.simple_list_item_1 فقط یه نمای&zwnj;متنی ساده است، اگه می خواستیم از یه فهرست&nbsp;سفارشی و خاص استفاده کنیم باید خودمون نمای&zwnj;فهرستی اش رو می&zwnj;ساختیم. (که در آموزش بعد یادخواهیم گرفت)

۷.برای گرفتن شماره منبع&nbsp;نمای&zwnj;متنی از تابع getResources استفاده می&zwnj;کنیم، این تابع تمامی منابع موجود در پروژه&zwnj;مون رو تهیه می&zwnj;کنه.بعد تابع تهیه&zwnj;ی&zwnj;آرایه&zwnj;ی&zwnj;رشته&zwnj;ای&nbsp;(getStringArray) رو صدا می&zwnj;زنیم و به عنوان ورودی باید شناسه آرایه&zwnj;ی رشته&zwnj;ای که تو فایل daneshgah.xml ساختیم رو بدیم: (بعد زیر ArrayAdapter خط قرمز می&zwnj;کشه روش ctrl+1 رو بزنید و گزینه import رو انتخاب کنید)
setListAdapter (newArrayAdapter&lt;String&gt;(this, 
android.R.layout.simple_list_item_1,
getResources ().getStringArray(R.array.daneshgah)));
۸.تمام این کارا ممکنه یه کمی پیچیده به نظر برسه ولی وقتی علت هر قطعه کد رو متوجه بشید براتون آسون می&zwnj;شه، تو این آموزش یاد گرفتیم که چطور یه فهرست ساده درست کنیم، تو آموزش بعدی یاد می&zwnj;گیریم که چطور فهرست سفارشی (customise list) درست کنیم.
این هم نمایی از همین فهرستی که درست کردیم در شبیه&zwnj;ساز:

نکته : اگر کلمات فارسی به صورت جداجدا در شبیه ساز نشون داده شد، باید شبیه&zwnj;سازتون از نسخه Android 3.0 بالاتر باشه (قسمت Target Name در Android Virtual Device Manager)

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


<item>
<title>دکمه‌ها</title>
<link>https://maisamk.loxblog.com/دکمهها-1</link>
<guid>https://maisamk.loxblog.com/دکمهها-1</guid>

<description><![CDATA[

دکمه&zwnj;ها
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;دکمه&raquo; ( لینک دانلود در ادمه مطلب )
زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادمه مطلب )
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[325 کیلوبایت] ( لینک دانلود در ادمه مطلب )
تا اینجا هرجا خواستیم از دکمه استفاده کنیم، از همون نوع سنتی و ساده&zwnj;اش استفاده کردیم، حالا می&zwnj;خوایم یاد بگیریم چطور از انواع دیگه&zwnj;ی دکمه استفاده کنیم.
۱. اول یه پروژه&zwnj;ی اندروید&nbsp;بسازید. (تصویر متحرک ساختن پروژه) بعد می&zwnj;تونیم&nbsp;در فایل activity_main.xml (در res-&gt;layout) از قسمت Palette انواع مختلف دکمه&zwnj;ها رو امتحان کنیم، الان اونی که روش نوشته off رو بکشید و روی صفحه بندازید.

&nbsp;
، این نوع دکمه برای خاموش روشن کردن تنظیمات دلخواه به کار می ره و این طوریه&nbsp;
شما می&zwnj;تونید به راحتی ظاهرش رو تغییر بدید و مناسب برنامه&zwnj;تون بکنید و می&zwnj;بینید که چقدر کار رو ساده کرده.
از انواع دیگه&zwnj;ی دکمه، دکمه&zwnj;ی رادیویی (radio) و دکمه&zwnj;ی علامت&zwnj;صحیح&nbsp;(checkbox)&nbsp;هستند که می&zwnj;تونید از تو ............................



دکمه&zwnj;ها
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;دکمه&raquo;
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[325 کیلوبایت]
تا اینجا هرجا خواستیم از دکمه استفاده کنیم، از همون نوع سنتی و ساده&zwnj;اش استفاده کردیم، حالا می&zwnj;خوایم یاد بگیریم چطور از انواع دیگه&zwnj;ی دکمه استفاده کنیم.
۱. اول یه پروژه&zwnj;ی اندروید&nbsp;بسازید. (تصویر متحرک ساختن پروژه) بعد می&zwnj;تونیم&nbsp;در فایل activity_main.xml (در res-&gt;layout) از قسمت Palette انواع مختلف دکمه&zwnj;ها رو امتحان کنیم، الان اونی که روش نوشته off رو بکشید و روی صفحه بندازید.

&nbsp;
، این نوع دکمه برای خاموش روشن کردن تنظیمات دلخواه به کار می ره و این طوریه&nbsp;
شما می&zwnj;تونید به راحتی ظاهرش رو تغییر بدید و مناسب برنامه&zwnj;تون بکنید و می&zwnj;بینید که چقدر کار رو ساده کرده.
از انواع دیگه&zwnj;ی دکمه، دکمه&zwnj;ی رادیویی (radio) و دکمه&zwnj;ی علامت&zwnj;صحیح&nbsp;(checkbox)&nbsp;هستند که می&zwnj;تونید از تو palette وارد صفحه&zwnj;تون بکنید.

۲.وقتشه یاد بگیریم چطور به دکمه&zwnj;ها فرمان بدیم و برنامه&zwnj;ریزی کنیم. تو آموزش&zwnj;های قبلی یاد گرفته بودید که برای کنترل یک دکمه می&zwnj;تونید تابع مربوط به کلیک شدن&zwnj;شو تو خودش درست کنید، اما اون کار برای وقتایی مناسبه که یکی دوتا دکمه کلاً داشته باشید، اگر بخواید تعداد دکمه&zwnj;های بیشتری استفاده کنید بهتره از روش&zwnj; دیگه&zwnj;ای استفاده کنید که الان توضیح می&zwnj;دم.
فایل MainActivity.java (در پوشه src) رو باز کنید، برای بهینه شدن استفاده از دکمه&zwnj;ها می&zwnj;تونیم به کلاس فعالیت (activity) بگیم که واسط گوش&zwnj;کننده&zwnj;به&zwnj;کلیک&nbsp;(onClickListener) رو پیاده&zwnj;سازی بکنه. یعنی کد شروع کلاس این طوری بشه:
publicclassMainActivityextendsActivityimplementsOnClickListener{
با این کار ما می&zwnj;تونیم مستقیما تو کلاسمون به رخدادها واکنش نشون بدیم.
۳.وقتی قسمت implements رو به کلاسمون اضافه می&zwnj;کنیم، زیر OnClickListener خط قرمز می&zwnj;کشه، روش که ctrl+1 رو بزنیم یه گزینه میاره که (import 'OnClickListener' (android.view.view که وقتی این گزینه رو انتخاب می&zwnj;کنیم اونوقت زیر MainActivity خط قرمز می&zwnj;کشه، با فشردن ctrl+1 روی اون هم گزینه add unimplemented methods رو بزنید تا تابع مربوط به این پیاده&zwnj;سازی رو بسازه.

تابع جدیدی که ساخته می&zwnj;شه اسمش&nbsp;onClick هست و تمام دکمه&zwnj;هایی که در این فعالیت قرار دارند هر وقت که فشرده بشن، میان و این تابع رو اجرا می&zwnj;کنن، این طوری ما فقط یک تابع مدیریت رخداد کلیک&zwnj;روی&zwnj;دکمه می&zwnj;سازیم.&nbsp;توی این تابع باید بفهمیم کدوم دکمه کلیک شده که کار مربوط به همون دکمه انجام بشه.
۴.پس کاری که ما الان قراره انجام بدیم اینه که برای هر کدوم از دکمه&zwnj;ها باید&nbsp;گوش&zwnj;کننده&zwnj;به&zwnj;کلیک (onClickListener) رو سوار&nbsp;کنیم. و داخل تابعش به جای اینکه مثل قبل یه&nbsp;گوش&zwnj;کننده&zwnj;به&zwnj;کلیک رو توش نمونه&zwnj;گیری کنیم، می نویسیم this، یعنی همین فعالیتی که توش قرار داریم. تو این فعالیت هم فقط یه تابع onClick وجود داره که وقتی دکمه dokme رو بزنیم اونو اجرا می&zwnj;کنه.
Button dokme =(Button) findViewById (R.id.toggleButton1);
dokme.setOnClickListener(this);
۵.همین کارو برای بقیه&zwnj;ی دکمه&zwnj;ها باید انجام بدیم، خوبی این کار اینه که هی کلاس اضافه برای هر دکمه جداگانه تعریف نمی&zwnj;شه و کارآمدی و سرعت برنامه به میزان قابل توجهی بالا می&zwnj;ره.
توی تابع onClick ما باید اول شناسه (id) اون شی&zwnj;ای که این تابع رو فراخوانی کرده بدست بیاریم تا بتونیم با توجه به اون شناسه، کار مربوط به همون دکمه رو انجام بدیم. تابع گرفتن اون شناسه اینه : ()arg0.getId&nbsp;
می&zwnj;تونیم با گذاشتن عبارات شرطی مقدار ()arg0.getId رو بررسی کنیم. خوب مثلا بیاید برای اون دکمه&zwnj;ی خاموش روشنی که گذاشتیم یه عبارت شرطی بذاریم که اگه کلیک شد، تو LogCat بنویسه !dokmeye khamoosh roshan click shod
@Overridepublicvoid onClick(View arg0){if(arg0.getId()== R.id.toggleButton1){Log.d("AC","Dokmeye khamoosh roshan click shod!");}}

بعد از این کار وقتی شبیه&zwnj;ساز رو اجرا می&zwnj;کنیم و روی دکمه خاموش روشن کلیک می&zwnj;کنیم، پیغامی که تنظیم کرده بودیم توی LogCat نمایش داده می&zwnj;شه.
پس یه روش جدید یادگرفتیم که فقط با یک تابع گوش&zwnj;کننده&zwnj;به&zwnj;کلیک توابعمون رو مدیریت کنیم.
۶.یه نوع دکمه&zwnj;ی دیگه هم داریم به اسم دکمه&zwnj;ی&zwnj;عکس&zwnj;دار (ImageButton) که در palette در زیرشاخه &nbsp;Images &amp; Media قرار داره که کاملا مشخصه که برای درست کردن دکمه&zwnj;ی عکس&zwnj;دار بکار می&zwnj;ره. این نوع دکمه رو وقتی می&zwnj;کشید روی صفحه و رها می&zwnj;کنید، ازتون می&zwnj;خواد که منبع عکسش رو انتخاب کنید که یا می&zwnj;تونید از عکس&zwnj;های سیستمی اندروید استفاده کنید یا عکس&zwnj;های دلخواه خودتون.

&nbsp;

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


<item>
<title>صفحه‌بندی (layout)</title>
<link>https://maisamk.loxblog.com/صفحهبندی-layout-1</link>
<guid>https://maisamk.loxblog.com/صفحهبندی-layout-1</guid>

<description><![CDATA[

صفحه&zwnj;بندی (layout)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;واحدها&raquo; ( لینک دانلود در ادامه مطلب ) زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادامه مطلب )
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[641 کیلوبایت] ( لینک دانلود در ادامه مطلب )
خوب تا الان به طور پیش فرض از صفحه&zwnj;بندی نسبی (RelativeLayout) برای واسط کاربری پروژه&zwnj;هامون استفاده می&zwnj;کردیم. حالا می&zwnj;خوایم با انواع صفحه&zwnj;بندی آشنا بشیم.
۱.یه پروژه جدید در ایکلیپس بسازید و از فولدر res به زیر شاخه layout برید و activity_main.xml رو باز کنید. وقتی از منوی پایین روی&nbsp;activity_main.xml کلیک می&zwnj;کنیم و به کد مربوط به این فایل می&zwnj;ریم، می&zwnj;بینیم که در اولین خط نوع صفحه&zwnj;بندی تعیین شده.

۲.صفحه&zwnj;بندی نسبی که به طور پیش&zwnj;فرض برای تمام پروژه&zwnj;های اندروید قرار داره، بگونه&zwnj;ای که ما می&zwnj;تونیم، نسبت به دیواره&zwnj;های اطراف یا اشیائی که در صفحه قرار دارند، اشیا جدید رو قرار بدیم، الان همون متنی که تو صفحه هست رو حذف کنید و مثلا یه دکمه می&zwnj;خوایم به صفحه اضافه کنیم، وقتی دکمه رو از منوی سمت چپ می&zwnj;کشیم، هرجایی در صفحه که بخوایم قرارش بدیم، به طور نسبی مشخص می&zwnj;کنه اون دکمه چه وضعیتی با دیواره&zwnj;های اطراف داره، و بعد اون رو جایی که به نظرمون مناسبه رها می&zwnj;کنیم. (مثلا ۹۰ dp از بالا و ۹۰ dp از چپ فاصله داشته باشه) حتی وقتی دکمه رو روی صفحه رها می&zwnj;کنیم، هنوز برامون مشخص می&zwnj;کنه که اندازه&zwnj;های ما نسبت به دیواره&zwnj;های سمت چپ و بالاست (با دو تا فلش سبز رنگ)

۳.حالا بیاید یه RadioButton رو به صفحه اضافه کنیم، می&zwnj;تونیم طوری تنظیمش کنیم که نسبت اون رو با دکمه&zwnj;ای که قبلا اضافه کرده بودیم بسنجیم و قرارش بدیم. الان دکمه&zwnj;ی قبلی و این radioButton به عنوان یک مجموعه در نظر گرفته می&zwnj;شن، چون&nbsp;جای قرار گرفتن&zwnj;شون&nbsp;نسبت به هم سنجیده شده، حالا اگه&nbsp;جای دکمه&zwnj;ی اولی رو&nbsp;تغییر بدیم، radioButton هم به تبعیت از اون&nbsp;تغییر می کنه. (همین طور اگه&nbsp;radioButton.........................



صفحه&zwnj;بندی (layout)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;واحدها&raquo;زیر نویس انگلیسی [English Subtitle]
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[641 کیلوبایت]
خوب تا الان به طور پیش فرض از صفحه&zwnj;بندی نسبی (RelativeLayout) برای واسط کاربری پروژه&zwnj;هامون استفاده می&zwnj;کردیم. حالا می&zwnj;خوایم با انواع صفحه&zwnj;بندی آشنا بشیم.
۱.یه پروژه جدید در ایکلیپس بسازید و از فولدر res به زیر شاخه layout برید و activity_main.xml رو باز کنید. وقتی از منوی پایین روی&nbsp;activity_main.xml کلیک می&zwnj;کنیم و به کد مربوط به این فایل می&zwnj;ریم، می&zwnj;بینیم که در اولین خط نوع صفحه&zwnj;بندی تعیین شده.

۲.صفحه&zwnj;بندی نسبی که به طور پیش&zwnj;فرض برای تمام پروژه&zwnj;های اندروید قرار داره، بگونه&zwnj;ای که ما می&zwnj;تونیم، نسبت به دیواره&zwnj;های اطراف یا اشیائی که در صفحه قرار دارند، اشیا جدید رو قرار بدیم، الان همون متنی که تو صفحه هست رو حذف کنید و مثلا یه دکمه می&zwnj;خوایم به صفحه اضافه کنیم، وقتی دکمه رو از منوی سمت چپ می&zwnj;کشیم، هرجایی در صفحه که بخوایم قرارش بدیم، به طور نسبی مشخص می&zwnj;کنه اون دکمه چه وضعیتی با دیواره&zwnj;های اطراف داره، و بعد اون رو جایی که به نظرمون مناسبه رها می&zwnj;کنیم. (مثلا ۹۰ dp از بالا و ۹۰ dp از چپ فاصله داشته باشه) حتی وقتی دکمه رو روی صفحه رها می&zwnj;کنیم، هنوز برامون مشخص می&zwnj;کنه که اندازه&zwnj;های ما نسبت به دیواره&zwnj;های سمت چپ و بالاست (با دو تا فلش سبز رنگ)

۳.حالا بیاید یه RadioButton رو به صفحه اضافه کنیم، می&zwnj;تونیم طوری تنظیمش کنیم که نسبت اون رو با دکمه&zwnj;ای که قبلا اضافه کرده بودیم بسنجیم و قرارش بدیم. الان دکمه&zwnj;ی قبلی و این radioButton به عنوان یک مجموعه در نظر گرفته می&zwnj;شن، چون&nbsp;جای قرار گرفتن&zwnj;شون&nbsp;نسبت به هم سنجیده شده، حالا اگه&nbsp;جای دکمه&zwnj;ی اولی رو&nbsp;تغییر بدیم، radioButton هم به تبعیت از اون&nbsp;تغییر می کنه. (همین طور اگه&nbsp;radioButton رو&nbsp;تغییر بدید، دکمه اولی هم همراه&zwnj;ش&nbsp;تغییر مکان می&zwnj;ده.)

۴.حالا بیایید مقدار ثقل (Gravity) دکمه radioButton را به مرکز (center) تغییر بدیم، برای این کار روی دکمه&zwnj;ای که در تصویر مشخص شده کلیک کنید و center را انتخاب کنید، حالا مرکز ثقل مجموعه دو دکمه، به مرکز صفحه تغییر مکان می&zwnj;ده.

حالا اگه&nbsp;به داخل پنجره properties نگاه کنید، می&zwnj;بینید که مقدار ثقل (Gravity) هر دو دکمه به مقدار زیر تغییر پیدا کرده:
center_vertical|start
۴.از انواع دیگه&zwnj;ی صفحه&zwnj;بندی می&zwnj;تونم به صفحه&zwnj;بندی خطی (LinearLayout) اشاره کنم، در این نوع صفحه&zwnj;بندی، همه چیز به صورت خطی پشت&zwnj;سرهم قرار می&zwnj;گیره.&nbsp;روی صفحه راست کلیک کنید، Change Layout و بعد هم&nbsp;LinearLayout، صفحه&zwnj;بندی خطی دو مدل داره افقی (Horizantal) یا عمودی (Vertical)، بیاید اول افقی رو انتخاب کنیم:

و قسمت کد activity_main.xml به صورت زیر تغییر می&zwnj;کنه:

یعنی به جای کلمه Relative نوشته شده Linear و یه شناسه جدید بهش داده شده، به همراه اینکه افقی بودنش مشخص شده.
۵.برای اینکه بهتر متوجه بشیم این صفحه&zwnj;بندی چطور عمل می&zwnj;کنه، در قسمت&nbsp;گرافیکی، یه متن تو صفحه بندازید و&nbsp;یه&nbsp;دکمه از منوی سمت چپ بکشید و کنار متن رها کنین، خواهید دید که دکمه به صورت خطی کنار متن قرار می&zwnj;گیره&nbsp;و شما نمی&zwnj;تونید اون رو&nbsp;جای دیگه&zwnj;ای&nbsp;در صفحه (مثلا پایین&nbsp;صفحه) قرار بدید. این&nbsp;خطی قرار گرفتن همه چیز به صورت افقی است، می&zwnj;تونیم با کلیک روی دکمه&zwnj;ای که تو شکل مشخص شده، خطی بودن رو به صورت عمودی تنظیم کنیم. در این صورت هیچ چیز را نمی&zwnj;تونید در صفحه، افقی کنار هم قرار بدید و باید همه اشیا به صورت خطی و عمودی پشت&zwnj;سر&zwnj;هم قرار بگیرن.

بعد از خطی شدن به صورت عمودی، اگر به کد نگاه کنیم می&zwnj;بینیم که این کد در&nbsp;قسمت مشخصات صفحه&zwnj;بندی تغییر کرده و نوع جهت&zwnj;یابی رو به عمودی تغییر داده:
android:orientation="vertical"
۶.نوع بعدی، صفحه&zwnj;بندی چهارچوبی است (FrameLayout). یعنی هر چیزی برای خودش چهارچوبی داره&nbsp;که اون رو از بقیه جدا می&zwnj;کنه، به طوریکه حتی اشیا می&zwnj;تونن روی همدیگه&nbsp;بیوفتن، چون این نوع صفحه&zwnj;بندی طوری سازمان&zwnj;دهی نشده که اشیا رو مجزا از هم نگه داره.
برای تغییر به صفحه&zwnj;بندی چهارچوبی، روی صفحه راست کلیک کنید، Change Layout و بعد هم FrameLayout :

۷.الان می&zwnj;تونید یه متن و یه دکمه رو، روی هم بندازید، می&zwnj;تونید روی دکمه کلیک کنید و از قسمت ثقل (Gravity) مرکز (center) رو انتخاب کنید و ببنید که دکمه مستقلا به مرکز صفحه منتقل شد.

این نوع صفحه&zwnj;بندی خیلی استفاده نداره، مگر اینکه مثلا شما می&zwnj;خواید با توجه به واکنش&zwnj;هایی که کاربر می&zwnj;ده، یه شی رو قابل رویت کنید و یه شی رو نامرئی کنید، مثلا می&zwnj;خواید یه سری عکس رو دنبال هم نشون بدید، می&zwnj;تونید با این صفحه&zwnj;بندی همه رو، روی هم بندازید و یکی یکی اونها رو قابل رویت بکنید. خلاصه این صفحه&zwnj;بندی در واقع هیچ کاری برای شما انجام نمی&zwnj;ده که شما رو مطمئن کنه اشیائتون به صورت مجزا از هم نشون داده می&zwnj;شن و همه زحمتش رو خودتتون باید بکشید.
۸.نوع دیگه، صفحه&zwnj;بندی جدولی (TableLayout) هست، که خیلی هم می&zwnj;تونه مفید و کارراه&zwnj;انداز باشه. مفهومش خیلی شبیه جدول توی Excel یا HTML هست. راستی یه راه دیگه برای تغییر صفحه&zwnj;بندی اینه که مستقیما خود فایل activity_main.xml رو دستکاری کنید.&nbsp;(یعنی الان به جای کلمه Frame بنویسید&nbsp;Table)

۹.در این صفحه&zwnj;بندی هر چیزی رو بندازید خودش به صورت سطرهای جدول در نظر می&zwnj;گیره و عرضشون رو به اندازه صفحه زیاد می&zwnj;کنه. اگر بخواید دوتا شی رو کنار هم در یه ردیف از جدول قرار بدید باید از منوی سمت چپ، گزینه layout رو بزنید و از توش TableRow رو انتخاب کنید و تو صفحه بندازیدش بعد تو این سطر می&zwnj;تونید چند تا شی رو کنار هم قرار بدید.

این نوع صفحه&zwnj;بندی خیلی مناسب درست کردن فرم عضویت در سایت و موارد مشابه.
۱۰.بحث دیگه ای که وجود داره اینه که مثلا ما می&zwnj;خوایم تو صفحه دو تا دکمه با صفحه&zwnj;بندی خطی عمودی کنار هم باشن و سایر اجزای صفحه، با صفحه&zwnj;بندی نسبی(یا هرچیز دیگه&zwnj;ای که دلخواهتون هست) برای این کار باید صفحه&zwnj;بندی کلی&zwnj;مون همون نسبی باشه اما&nbsp;اون دوتا دکمه رو تو یه ظرف (container)&nbsp;بذاریم و صفحه&zwnj;بندی اون ظرف رو از نوع خطی عمودی تنظیم کنیم، برای این کار، اول هرچی تو صفحه هست رو پاک کنید، بعد با راست کلیک روی صفحه -&gt; change layout بعد هم RelativeLayout. با این کار صفحه&zwnj;بندی کلی نسبی شد، حالا دوتا دکمه تو صفحه بندازید، یکی شون رو انتخاب کنید بعد کلید شیفت رو نگه دارید و اون یکی رو هم انتخاب کنید (دور هردوشون خط آبی بشه) بعد راست کلیک کنید و wrap in container رو بزنید.

نوع صفحه&zwnj;بندی این دو تا دکمه رو انتخاب کنید و براشون یه اسمی بذارید. بعد هم ok.

دکمه ها این شکلی شدن (تو این مثال) همون طور که می&zwnj;بینید حالا دور مجموعه&zwnj;ی دو دکمه یه خط آبی کشیده (البته به راحتی می&zwnj;تونید هر کدوم از دکمه&zwnj;ها رو با کشیدن و رها کردن از تو مجموعه در بیارید)

با این کار توی activity_main.xml یه LinearLayout داخل تگ RelativeLayout با مشخصات زیر درست می شه:

من می&zwnj;خواستم فاصله&zwnj;ی دو تا دکمه از هم صفر بشه&nbsp;پس مقدار margin هاشون رو صفر کردم که اینطوری شدن. هر تغییر دیگه&zwnj;ای که دلتون بخواد به راحتی می&zwnj;تونید توش اعمال کنین.

&nbsp;
پس حواستون باشه قبل از این که یه صفحه به وجود بیارید درباره محتویات صفحه و اینکه چطور می&zwnj;خواید در صفحه چیده بشن خوب فکر کنید و صفحه&zwnj;بندی مناسبش&nbsp;رو انتخاب کنید. البته وقتی change Layout رو می&zwnj;زنید می&zwnj;بینید که انواع صفحه&zwnj;بندی خیلی زیاده، می&zwnj;تونید خودتون هر کدومشون رو امتحان کنید ولی صفحه&zwnj;بندی های اصلی همین&zwnj;ها بودن.

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


<item>
<title>واحدهای اندازه‌گیری</title>
<link>https://maisamk.loxblog.com/واحدهای-اندازهگیری-1</link>
<guid>https://maisamk.loxblog.com/واحدهای-اندازهگیری-1</guid>

<description><![CDATA[

واحدهای اندازه&zwnj;گیری
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;واحدها&raquo; ( لینک دانلود در ادامه مطلب )
زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادامه مطلب )
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[352 کیلوبایت] ( لینک دانلود در ادامه مطلب )
وقتی که برای اندازه&zwnj;های مختلف صفحه می خوایم برنامه درست کنیم، اولین چیزی که لازمه بدونیم واحدهای اندازه&zwnj;گیری در اندرویده، تا بتونیم طوری برنامه رو توسعه بدیم که تو اندازه صفحه&zwnj;های مختلف به درستی نمایش داده بشه.
۱.خوب برای اینکه بهتر متوجه بشیم، یه پروژه جدید در ایکلیپس می&zwnj;سازیم.
از فولدر res زیر شاخه layout و activity_main.xml رو باز می&zwnj;کنیم و محیط گرافیکی اون برامون باز می&zwnj;شه. به طور پیش&zwnj;فرض صفحه&zwnj;بندی نسبی (RelativeLayout) برای همه پروژه&zwnj;ها در نظر گرفته شده. حالا اگه روی activity_main.xml کلیک کنیم می بینیم که در اولین خط نوشته RelativeLayout یعنی نوع صفحه بندی نسبی است.

۲.حداقل تنظیماتی که هر شی در اندروید نیاز داره، ارتفاع و عرض در صفحه&zwnj;بندیه. مثلا در قسمت صفحه&zwnj;بندی نسبی نوشته :

یعنی عرض و ارتفاع صفحه بندی به صورتی باشه که تمام فضای والد خودش رو پر کنه (fill_parent) یعنی تمام صفحه رو بپوشونه.
حالا می&zwnj;تونیم به قسمت گرافیکی activity_main.xml بریم و اون متن رو حذف کنیم و از منوی سمت چپ یه دکمه روی صفحه بکشیم و رها کنیم. وقتی به قسمت کد&nbsp;activity_main.xml می&zwnj;ریم می&zwnj;بینیم که اون هم برای خودش ارتفاع و عرض داره که با عبارت &laquo;wrap_content&raquo; پر شده، به این معنی که فقط به&nbsp;همون اندازه که نیاز داره، فضا اشغال می&zwnj;کنه.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
۳.برای دیدن مشخصات دکمه&zwnj;ای که ایجاد کردیم، از منوی سمت راست properties رو انتخاب می&zwnj;کنیم (اگه منوی properties رو ندارید، از منوی بالای ایکلیپس روی window بعد show view و other کلیک کنید و در زیرشاخه General گزینه properties رو انتخاب کنید تا براتون پنجره اش باز بشه و اگه دلتون بخواد می&zwnj;تونید اونو در سمت راست بذارید) این منو به ما اجازه می&zwnj;ده مشخصات هر چیزی که در قسمت گرافیکی انتخاب کردیم&nbsp;رو تغییر بدیم. الان می&zwnj;تونید&nbsp;رو دکمه&zwnj;ای که تو شکل مشخص کردم (پر کردن ارتفاع:&nbsp;toggle fill height)&nbsp;کلیک کنید تا بینید که در قسمت توضیحات درباره ارتفاع دکمه نوشته شده : match_parent به این معنی که طول اون شی رو انقدر اضافه می&zwnj;کنه تا به اندازه ........................................



واحدهای اندازه&zwnj;گیری
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;واحدها&raquo;
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[352 کیلوبایت]
وقتی که برای اندازه&zwnj;های مختلف صفحه می خوایم برنامه درست کنیم، اولین چیزی که لازمه بدونیم واحدهای اندازه&zwnj;گیری در اندرویده، تا بتونیم طوری برنامه رو توسعه بدیم که تو اندازه صفحه&zwnj;های مختلف به درستی نمایش داده بشه.
۱.خوب برای اینکه بهتر متوجه بشیم، یه پروژه جدید در ایکلیپس می&zwnj;سازیم.
از فولدر res زیر شاخه layout و activity_main.xml رو باز می&zwnj;کنیم و محیط گرافیکی اون برامون باز می&zwnj;شه. به طور پیش&zwnj;فرض صفحه&zwnj;بندی نسبی (RelativeLayout) برای همه پروژه&zwnj;ها در نظر گرفته شده. حالا اگه روی activity_main.xml کلیک کنیم می بینیم که در اولین خط نوشته RelativeLayout یعنی نوع صفحه بندی نسبی است.

۲.حداقل تنظیماتی که هر شی در اندروید نیاز داره، ارتفاع و عرض در صفحه&zwnj;بندیه. مثلا در قسمت صفحه&zwnj;بندی نسبی نوشته :

یعنی عرض و ارتفاع صفحه بندی به صورتی باشه که تمام فضای والد خودش رو پر کنه (fill_parent) یعنی تمام صفحه رو بپوشونه.
حالا می&zwnj;تونیم به قسمت گرافیکی activity_main.xml بریم و اون متن رو حذف کنیم و از منوی سمت چپ یه دکمه روی صفحه بکشیم و رها کنیم. وقتی به قسمت کد&nbsp;activity_main.xml می&zwnj;ریم می&zwnj;بینیم که اون هم برای خودش ارتفاع و عرض داره که با عبارت &laquo;wrap_content&raquo; پر شده، به این معنی که فقط به&nbsp;همون اندازه که نیاز داره، فضا اشغال می&zwnj;کنه.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
۳.برای دیدن مشخصات دکمه&zwnj;ای که ایجاد کردیم، از منوی سمت راست properties رو انتخاب می&zwnj;کنیم (اگه منوی properties رو ندارید، از منوی بالای ایکلیپس روی window بعد show view و other کلیک کنید و در زیرشاخه General گزینه properties رو انتخاب کنید تا براتون پنجره اش باز بشه و اگه دلتون بخواد می&zwnj;تونید اونو در سمت راست بذارید) این منو به ما اجازه می&zwnj;ده مشخصات هر چیزی که در قسمت گرافیکی انتخاب کردیم&nbsp;رو تغییر بدیم. الان می&zwnj;تونید&nbsp;رو دکمه&zwnj;ای که تو شکل مشخص کردم (پر کردن ارتفاع:&nbsp;toggle fill height)&nbsp;کلیک کنید تا بینید که در قسمت توضیحات درباره ارتفاع دکمه نوشته شده : match_parent به این معنی که طول اون شی رو انقدر اضافه می&zwnj;کنه تا به اندازه والدش بشه و در محیط گرافیکی می&zwnj;بینیم که همین طور هم شده.

در کنار دکمه پر کردن ارتفاع (toggle fill height)، دکمه پر کردن عرض هم وجود داره، که اگه اون رو برای شی&zwnj;ای انتخاب کنید، باعث می&zwnj;شه شی تمام عرض والدش رو پر کنه.
قبل از GingerBread وقتی این دکمه رو می&zwnj;زدید، می&zwnj;نوشت fill_parent که در واقع همون کارو می&zwnj;کرد ولی الان اسمش رو عوض کردن گذاشتن match_parent
۴.حالا اگه بخوایم شی مورد نظرمون یه عرض و ارتفاع مشخصی داشته باشه باید چی کار کنیم؟ کاری که اکثر افراد می&zwnj;کنن اینه که یه مقدار با واحد pixel به اون شی اختصاص می&zwnj;دن. ولی یک پیکسل در دستگاه&zwnj;های مختلف اندازه متفاوتی داره مثلا یه شرکت دوست داره مقدار پیکسل رو یک دهم اینچ در نظر بگیره و یه شرکت دیگه یه مقدار متفاوتی رو، و این باعث می&zwnj;شه تا برنامه ما روی هر دستگاهی یه جور متفاوت باشه، به همین خاطر باید از یه واحد دیگه به نام dp استفاده کنیم که مخفف Device-Independent Pixle هست یعنی پیکسلی که مستقل از دستگاهه و برای همه دستگاه&zwnj;های اندروید یه چیز ثابته، قبلا sdk بهمون این اجازه رو می&zwnj;داد که هر واحدی که می&zwnj;خوایم رو استفاده کنیم، اما چون باعث می&zwnj;شد برنامه در دستگاه&zwnj;های مختلف متفاوت نمایش داده بشه، دیگه الان sdk به شما اجازه نمی&zwnj;ده واحد px رو بنویسید و خودش به dp تبدیلش می&zwnj;کنه.

۵.حالا اون دکمه رو از&nbsp;رو صفحه حذف می&zwnj;کنیم و یه متن (textView) به صفحه اضافه می&zwnj;کنیم، می&zwnj;خوایم اندازه متن رو تغییر بدیم. می&zwnj;تونیم از همون واحد dp استفاده کنیم. مثلا 50 dp.&nbsp;ولی یه تنظیماتی در اندروید برای افرادی که چشمان ضعیفی دارند وجود داره که می&zwnj;تونن گزینه&zwnj;ای رو انتخاب کنن تا همه متن&zwnj;ها براشون درشت&zwnj;تر نمایش داده بشه، در چنین حالتی این متن ما همون اندازه خواهد موند و براشون بزرگ نمی&zwnj;شه، برای برطرف کردن این مشکل از واحد sp استفاده می&zwnj;کنیم، که مخفف Scale-Indepentent Pixle هست به معنی اینکه با توجه به مقیاسی که کاربر تنظیم کرده متن نمایش داده بشه و این واحد فقط برای متن به کاربرده می&zwnj;شه. و اگر کاربر تنظیمات گوشی اش رو دست نزده باشه، اندازه &nbsp;50 dp برابره 50 sp خواهد شد، ولی برای افرادی که چشماشون ضعیفه بزرگتر نمایش داده خواهد شد.

&nbsp;

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


<item>
<title>اشکال زدایی (debug) برنامه</title>
<link>https://maisamk.loxblog.com/اشکال-زدایی-debug-برنامه-1</link>
<guid>https://maisamk.loxblog.com/اشکال-زدایی-debug-برنامه-1</guid>

<description><![CDATA[

اشکال زدایی (debug) برنامه
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;اشکال زدایی برنامه&raquo; ( لینک دانلود در ادامه مطلب )
زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادامه مطلب )
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[1.89 مگابایت] ( لینک دانلود در ادامه مطلب )
تابحال تو دو تا از پست ها بهتون نشون داده شده که چجوری از DDMS برای مشاهده واقعی گزارشات ثبت شده (log) مربوط به برنامه که ناشی از دستگاهتون یا شبیه&zwnj;سازتونه، استفاده کنید. این کار بهتون کمک میکنه که بتونید خطاهای برنامه&zwnj;تونو رفع&nbsp;کنید یا فقط ببینید چه اتفاقی داره در حال اجرا&nbsp;می&zwnj;یفته.
در این مطلب می&zwnj;خوایم یه مقدار بیشتر به روش&zwnj;های&nbsp;خطایابی های قدیمی بپردازیم.
1. اول یه پروژه جدید ایجاد کنید.
2. میریم سراغ فولدر res بعد layout ، فایل activity_main.xml رو&nbsp;باز می&zwnj;کنیم، از قسمت pallette یه TextViewو Button و EditText می&zwnj;کشیم میاریم رو صفحه. البته TextView معمولا به صورت پیش فرض هست(همون HelloWord).

و برنامه رو ذخیره می&zwnj;کنیم.
3. حالا اگر بخوایم برنامه مونو اشکال زدایی کنیم، باید یه چیزی به manifest اضافه کنیم که اجازه این کارو بهمون بده.
پس فایل Androidmanifest.xml&nbsp;رو باز می&zwnj;کنیم و رو زبانه Application کلیک می&zwnj;کنیم.
می&zwnj;تونیم مشخصه&zwnj;ی debuggable رو همون بالا ببینیم. اگر بخوایم برنامه&zwnj;مونو به اشکال زدای ایکلیپس متصل کنیم، باید این مشخصه رو&nbsp;فعال(true) کنیم.

&nbsp;
۴. می&zwnj;خوایم تو فایل جاوای برنامه مون اعلام کنیم که در صورت فشردن دکمه چیکار کنه. پس با این کد یه نمونه از دکمه می&zwnj;سازیم و به دکمه&zwnj;ای که قبلا رو صفحه گذاشته بودیم متصل می&zwnj;کنیم.
Button dokme =(Button)findViewById(R.id.button1);
و بعد تابعی که قراره موقع کلیک دکمه صدا زده بشه رو می&zwnj;سازیم.
dokme.setOnClickListener(newOnClickListener(){@Overridepublicvoid onClick(View v){// TODO Auto-generated method stub	}});

۵. روی DDMS کلیک کنید و LogCat رو ببینید. البته بدون رفتن تو DDMS هم می&zwnj;تونید LogCat رو ببینید، از منوی که پایین ایکلیپس قرار داره&nbsp;می&zwnj;تونید پیداش کنید.&nbsp;&nbsp;LogCat در واقع هر چیزی رو که تو دستگاه اندروید در حال وقوعه، گزارش می&zwnj;کنه. پس به ازای هر ضربه ای که به صفحه ی دستگاهتون میزنید، اگر کار خاصی انجام بدید، شروع میکنه به ساختن اطلاعات گزارشی. ولی ما می&zwnj;تونیم اطلاعاتی رو که خودمون درباره برنامه&zwnj;مون می&zwnj;خوایم هم اونجا قرار بدیم.
۶. پس به فایل جاوا برمی&zwnj;گردیم. اینجا از کلاس Log که تو بسته ی android.util هست، استفاده می&zwnj;کنیم.
تو این کلاس چندتا تابع وجود داره که می&zwnj;تونیم ازشون برای تهیه گزارش از هرچیزی تو LogCat&nbsp;استفاده کنیم. مثلا تابع d یه پیغام اشکال زدایی&nbsp;ارسال می&zwnj;کنه و ورودی&zwnj;هاش یه برچسب(tag) و یه پیغام(msg) هست. البته اگر بخوایم یه استثنایی رو هم گزارش کنیم، میتونیم یه شیء throwable رو به عنوان ورودی بهش بدیم.
همچنین تابع e رو داریم که برای گزارش استثناء بکار می&zwnj;ره، تابع i یه پیغام اطلاعاتی و تابع v پیغام طولانی رو گزارش می&zwnj;کنه. w هم برای اخطاره. و اما جالب ترین چیزی که اینجا وجود داره، wtf هستش که مخفف اینه: What a Terrible Failure یعنی چه خرابی وحشتناکی&nbsp;و بیانگر چیزیه که انتظار نداشتیم تو سیستم اتفاق بیفته.

حالا ما می&zwnj;خوایم از تابع d استفاده کنیم. تو قسمت tag هر چیزی می&zwnj;تونه باشه، فقط باید یه جوری باشه که بتونیم از بین گزارشای دیگه توی LogCat تشخیصش بدیم. من اینجا با حروف بزرگ، سه بار می&zwnj;نویسم A. به عنوان پیغام هم اعلام می&zwnj;کنم که دکمه کلیک شده.
publicvoid onClick(View v){// TODO Auto-generated method stubLog.d("AAA","dokme feshorde shode");}
7. کاری که من میخوام انجام بدم اینه که یه نقطه توقف&nbsp;(break point) به قطعه کد بالا اضافه کنم، بطوریکه اجرای برنامه رو تو اون نقطه متوقف کنه و به ما اجازه اشکال زدایی (debug) بده. به ستونی که سمت چپ کدتون هست توجه کنید. روی اون ستون، دقیقا روبروی خط سوم، دوبار کلیک کنید تا یه break point ایجاد بشه. مطمئنا هر کدوم از شما که قبلا کدش رو دیباگ کرده، این کارو انجام داده.
&nbsp;

و بعد اون علامت دیباگ بالای صفحه رو میزنیم. و گزینه اول، یعنی Android Application رو انتخاب می&zwnj;کنیم.۸. تو شبیه&zwnj;ساز&nbsp;اول یه پیغام نشون میده مبنی بر اینکه منتظر اشکال زدا (Debugger) بوده.

در واقع منتظر اشکال زدای ایکلیپس بوده که به برنامه&zwnj;مون متصل شه. یه کمی صبر کنید متصل می&zwnj;شه.وقتی رو دکمه ای که ساختیم کلیک کنیم، میبینیم که خودش ما رو می&zwnj;بره به قسمت debug توی ایکلیپس.

البته بسته به اینکه قبلا رو ایکلیپس چه کارایی انجام دادید، ممکنه یه پیغام نشون بده و ازتون بپرسه که آیا میخواید به قسمت اشکال زدا (debug) برید یا نه؟ که فقط کافیه بله رو بزنید.۹. اگه یه نگاهی به logcat بندازید، متوجه می&zwnj;شید که پیغاممون رو گزارش نکرده. به خاطر اینکه برنامه مون رو تو اون نقطه متوقف کرده. پس رو علامت ادامه&nbsp; کلیک می&zwnj;کنیم تا اجرا ادامه پیدا کنه و اینجاست که می&zwnj;بینید پیغاممون گزارش می&zwnj;شه.ستون Tag تو LogCat در واقع نشون دهنده&zwnj;ی اینه که کدوم فرایند، یا کدوم برنامه این پیغام رو ارسال کرده.۱۰. یه چیز دیگه که باید درمورد LogCat بهش توجه کنیم، اینه که مقدار عظیمی از اطلاعات رو، درمورد هر اتفاقی که تو دستگاه می&zwnj;افته، گزارش می&zwnj;کنه. ولی اگه بخوایم که فقط اطلاعات مربوط برنامه مون گزارش بشه چی؟کاری که باید انجام بدیم اینه که یه فیلتر تنظیم کنیم. پس روی علامت  که اون بالاست، کلیک می&zwnj;کنیم. و من اسم فیلترمو میذارم A و بهش میگم اون گزارش هایی رو نشون بده که با برچسب AAA علامت گذاری شدن.
&nbsp;

و بعد مشاهده میکنید.....................................................



اشکال زدایی (debug) برنامه
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;اشکال زدایی برنامه&raquo;
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه&zwnj;ی pdf این آموزش&nbsp;[1.89 مگابایت]
تابحال تو دو تا از پست ها بهتون نشون داده شده که چجوری از DDMS برای مشاهده واقعی گزارشات ثبت شده (log) مربوط به برنامه که ناشی از دستگاهتون یا شبیه&zwnj;سازتونه، استفاده کنید. این کار بهتون کمک میکنه که بتونید خطاهای برنامه&zwnj;تونو رفع&nbsp;کنید یا فقط ببینید چه اتفاقی داره در حال اجرا&nbsp;می&zwnj;یفته.
در این مطلب می&zwnj;خوایم یه مقدار بیشتر به روش&zwnj;های&nbsp;خطایابی های قدیمی بپردازیم.
1. اول یه پروژه جدید ایجاد کنید.
2. میریم سراغ فولدر res بعد layout ، فایل activity_main.xml رو&nbsp;باز می&zwnj;کنیم، از قسمت pallette یه TextViewو Button و EditText می&zwnj;کشیم میاریم رو صفحه. البته TextView معمولا به صورت پیش فرض هست(همون HelloWord).

و برنامه رو ذخیره می&zwnj;کنیم.
3. حالا اگر بخوایم برنامه مونو اشکال زدایی کنیم، باید یه چیزی به manifest اضافه کنیم که اجازه این کارو بهمون بده.
پس فایل Androidmanifest.xml&nbsp;رو باز می&zwnj;کنیم و رو زبانه Application کلیک می&zwnj;کنیم.
می&zwnj;تونیم مشخصه&zwnj;ی debuggable رو همون بالا ببینیم. اگر بخوایم برنامه&zwnj;مونو به اشکال زدای ایکلیپس متصل کنیم، باید این مشخصه رو&nbsp;فعال(true) کنیم.

&nbsp;
۴. می&zwnj;خوایم تو فایل جاوای برنامه مون اعلام کنیم که در صورت فشردن دکمه چیکار کنه. پس با این کد یه نمونه از دکمه می&zwnj;سازیم و به دکمه&zwnj;ای که قبلا رو صفحه گذاشته بودیم متصل می&zwnj;کنیم.
Button dokme =(Button)findViewById(R.id.button1);
و بعد تابعی که قراره موقع کلیک دکمه صدا زده بشه رو می&zwnj;سازیم.
dokme.setOnClickListener(newOnClickListener(){@Overridepublicvoid onClick(View v){// TODO Auto-generated method stub	}});

۵. روی DDMS کلیک کنید و LogCat رو ببینید. البته بدون رفتن تو DDMS هم می&zwnj;تونید LogCat رو ببینید، از منوی که پایین ایکلیپس قرار داره&nbsp;می&zwnj;تونید پیداش کنید.&nbsp;&nbsp;LogCat در واقع هر چیزی رو که تو دستگاه اندروید در حال وقوعه، گزارش می&zwnj;کنه. پس به ازای هر ضربه ای که به صفحه ی دستگاهتون میزنید، اگر کار خاصی انجام بدید، شروع میکنه به ساختن اطلاعات گزارشی. ولی ما می&zwnj;تونیم اطلاعاتی رو که خودمون درباره برنامه&zwnj;مون می&zwnj;خوایم هم اونجا قرار بدیم.
۶. پس به فایل جاوا برمی&zwnj;گردیم. اینجا از کلاس Log که تو بسته ی android.util هست، استفاده می&zwnj;کنیم.
تو این کلاس چندتا تابع وجود داره که می&zwnj;تونیم ازشون برای تهیه گزارش از هرچیزی تو LogCat&nbsp;استفاده کنیم. مثلا تابع d یه پیغام اشکال زدایی&nbsp;ارسال می&zwnj;کنه و ورودی&zwnj;هاش یه برچسب(tag) و یه پیغام(msg) هست. البته اگر بخوایم یه استثنایی رو هم گزارش کنیم، میتونیم یه شیء throwable رو به عنوان ورودی بهش بدیم.
همچنین تابع e رو داریم که برای گزارش استثناء بکار می&zwnj;ره، تابع i یه پیغام اطلاعاتی و تابع v پیغام طولانی رو گزارش می&zwnj;کنه. w هم برای اخطاره. و اما جالب ترین چیزی که اینجا وجود داره، wtf هستش که مخفف اینه: What a Terrible Failure یعنی چه خرابی وحشتناکی&nbsp;و بیانگر چیزیه که انتظار نداشتیم تو سیستم اتفاق بیفته.

حالا ما می&zwnj;خوایم از تابع d استفاده کنیم. تو قسمت tag هر چیزی می&zwnj;تونه باشه، فقط باید یه جوری باشه که بتونیم از بین گزارشای دیگه توی LogCat تشخیصش بدیم. من اینجا با حروف بزرگ، سه بار می&zwnj;نویسم A. به عنوان پیغام هم اعلام می&zwnj;کنم که دکمه کلیک شده.
publicvoid onClick(View v){// TODO Auto-generated method stubLog.d("AAA","dokme feshorde shode");}
7. کاری که من میخوام انجام بدم اینه که یه نقطه توقف&nbsp;(break point) به قطعه کد بالا اضافه کنم، بطوریکه اجرای برنامه رو تو اون نقطه متوقف کنه و به ما اجازه اشکال زدایی (debug) بده. به ستونی که سمت چپ کدتون هست توجه کنید. روی اون ستون، دقیقا روبروی خط سوم، دوبار کلیک کنید تا یه break point ایجاد بشه. مطمئنا هر کدوم از شما که قبلا کدش رو دیباگ کرده، این کارو انجام داده.
&nbsp;

و بعد اون علامت دیباگ بالای صفحه رو میزنیم. و گزینه اول، یعنی Android Application رو انتخاب می&zwnj;کنیم.۸. تو شبیه&zwnj;ساز&nbsp;اول یه پیغام نشون میده مبنی بر اینکه منتظر اشکال زدا (Debugger) بوده.

در واقع منتظر اشکال زدای ایکلیپس بوده که به برنامه&zwnj;مون متصل شه. یه کمی صبر کنید متصل می&zwnj;شه.وقتی رو دکمه ای که ساختیم کلیک کنیم، میبینیم که خودش ما رو می&zwnj;بره به قسمت debug توی ایکلیپس.

البته بسته به اینکه قبلا رو ایکلیپس چه کارایی انجام دادید، ممکنه یه پیغام نشون بده و ازتون بپرسه که آیا میخواید به قسمت اشکال زدا (debug) برید یا نه؟ که فقط کافیه بله رو بزنید.۹. اگه یه نگاهی به logcat بندازید، متوجه می&zwnj;شید که پیغاممون رو گزارش نکرده. به خاطر اینکه برنامه مون رو تو اون نقطه متوقف کرده. پس رو علامت ادامه&nbsp; کلیک می&zwnj;کنیم تا اجرا ادامه پیدا کنه و اینجاست که می&zwnj;بینید پیغاممون گزارش می&zwnj;شه.ستون Tag تو LogCat در واقع نشون دهنده&zwnj;ی اینه که کدوم فرایند، یا کدوم برنامه این پیغام رو ارسال کرده.۱۰. یه چیز دیگه که باید درمورد LogCat بهش توجه کنیم، اینه که مقدار عظیمی از اطلاعات رو، درمورد هر اتفاقی که تو دستگاه می&zwnj;افته، گزارش می&zwnj;کنه. ولی اگه بخوایم که فقط اطلاعات مربوط برنامه مون گزارش بشه چی؟کاری که باید انجام بدیم اینه که یه فیلتر تنظیم کنیم. پس روی علامت  که اون بالاست، کلیک می&zwnj;کنیم. و من اسم فیلترمو میذارم A و بهش میگم اون گزارش هایی رو نشون بده که با برچسب AAA علامت گذاری شدن.
&nbsp;

و بعد مشاهده میکنید11. همه این کارایی که انجام دادیم، یه روش قدیمی برای اشکال زدایی کد بود. و اما در مورد واسط کاربری، یه ابزار فوق العاده تو بسته ی SDK هست که این امکان رو برمون فراهم می&zwnj;کنه تا بتونیم مشکلات مربوط به صفحه&zwnj;بندی&zwnj;ها (layout)&nbsp;و در واقع واسط کاربری بپردازیم.بنابراین فعلا رو علامت  کلیک میکنیم که ارتباط دیباگر قطع شه.به محل نصب android sdk می&zwnj;ریم یعنی&nbsp;پوشه ی android-sdk رو باز می&zwnj;کنیم&nbsp;و بعد به پوشه ی Toolsمی&zwnj;ریم. ابزار مورد نظرمون یه&nbsp;batch فایله که اسمش هست hierarchyviewer. روش دوبار کلیک میکنیم. تو مک خودش برنامه رو&nbsp;از طریق command line باز می&zwnj;کنه.hierarchy به معنی سلسله مراتبه. کاری که این ابزار انجام می&zwnj;ده اینه که تمام فرایندها یا برنامه هایی رو که روی دستگاهمون&nbsp;در حال اجرا هستند، نمایش میده. الان دستگاهمون همون شبیه&zwnj;سازه.12. برنامه&zwnj;های آماده&zwnj;ی اشکال&zwnj;زدایی&nbsp;تو hierarchyviewer نشون داده می&zwnj;شه. برنامه&zwnj;ای می&zwnj;خوایم رو&nbsp;انتخاب&nbsp;می&zwnj;کنیم و بعد هم گزینه Load View Hierarchy رو می&zwnj;زنیم.

کاری که انجام می&zwnj;ده اینه که می&zwnj;ره و واسط کاربری برنامه&zwnj;مونو بررسی می&zwnj;کنه و اونو در قالب درختی نشون می&zwnj;ده.می&zwnj;تونیم تصویر رو بزرگ و کوچک کنیم و در واقع ساختار برنامه مون رو مشاهده کنیم.الان ممکنه کنجکاو بشید که اون سه تا دایره ی رنگی چی هستن؟ در واقع برای نشون دادن performance یا همون سرعت عملکرده و سه مرحله هم واسش وجود داره. اولی&nbsp;اندازه گیری (measure)&zwnj;&nbsp;هستش که میزان فضای مورد نیاز رو اندازه می&zwnj;گیره. مرحله ی دوم صفحه&zwnj;بندی (layout) هستش که چیزایی که داریم رو صفحه&zwnj;بندی می&zwnj;کنه و مرحله ی سوم هم رسم کردن&nbsp;(draw) نام داره که طراحی رو روی صفحه رسم می&zwnj;کنه. و واضحه که اگر رنگ همه این دایره ها سبز باشه، بهتره، که اینم فقط به بقیه ی viewهای برنامه تون بستگی داره. ولی اگر رنگشون زرد یا قرمز باشه، خوب نیست (واضحه که قرمز بدترین حالت رو نشون میده) و شما باید این نقاط رو به خاطر بسپارید و مراقبشون باشید که خرابی به بار نیارن.
13. همه ما هنگام ساخت یه برنامه اندروید دوست داریم نمایی که از سلسله مراتب برنامه مون می&zwnj;بینیم،در ساده ترین شکل ممکن باقی بمونه و نمی&zwnj;خوایم که کلی صفحه&zwnj;بندی&zwnj;های تو در تو داشته باشیم. حالا اگه رو مستطیل مربوط به دکمه&zwnj;مون کلیک کنیم، یه قاب باز می&zwnj;شه که کنترل دکمه اصلی توی اون قاب نمایانه.
&nbsp;&nbsp; 
همچنین می&zwnj;تونیم تو قسمت property که سمت راست قرار داره، همه اطلاعات مربوط به این دکمه، از جمله اندازه و مکان قرار گرفتن و ... رو با جزئیات کامل مشاهده کنیم.

14. این دفعه اگه رو مستطیل مربوط به دکمه&zwnj;مون دو بار کلیک کنیم، یه پیش نمایش ظاهر می&zwnj;شه که می&zwnj;تونیم بطور زنده توش ببینیم دکمه مون با پشت زمینه سیاه یا سفید چه شکلی میشه یا یه سری اطلاعات اضافه&zwnj;تری رو ببینیم.

بهتون پیشنهاد میکنم حتما hierarchyviewer رو باز کنید و سلسله مراتب طراحی&zwnj;تونو توش ببینید، چون این ابزار میتونه برای بهبود عملکرد برنامه&zwnj;تون خیلی مهم باشه.15. ابزارهای دیگه ای هم وجود دارند که به همین خوبی هستند. این تصویر سایت SDK، زبانه ی Dev Guide، قسمت Debugging هستش. اگر شما واقعا به یه ردیابی عملکرد با جزئیات بالا برای برنامه تون نیاز دارید، یه ابزار به نام TraceView وجود داره که می&zwnj;تونه این کارو انجام بده. این ابزار حتی یه چیزی بیشتر از یه ابزار پیشرفته&zwnj;ست، به خاطر همینم ما فعلا خیلی بهش نمی پردازیم.اما این ابزار یه نمایشی از یه نمودار زمانی بهتون می&zwnj;ده که نشون می&zwnj;ده کد شما تو کدوم زمان تو باریکه قرار گرفته. شما میتونید این کار رو&nbsp;با اضافه کردن یه سری اطلاعات مربوط به ردیابی، تو کدتون، انجام بدید.تاکید می&zwnj;کنم که اگر شما با مشکلات اساسی تو برنامه تون روبرو می&zwnj;شید، یا دارید برنامه ای می نویسید که عملکرد خوب جز&nbsp;اولویت&zwnj;های بالای اونه، TraceView ابزاریه که خیلی می&zwnj;تونه کمکتون کنه.

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


<item>
<title>درک امنیت و اجازه ها (permission)</title>
<link>https://maisamk.loxblog.com/درک-امنیت-و-اجازه-ها-permission-1</link>
<guid>https://maisamk.loxblog.com/درک-امنیت-و-اجازه-ها-permission-1</guid>

<description><![CDATA[

درک امنیت و اجازه ها (permission)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;درک امنیت و اجازه&zwnj;ها&raquo; ( لینک دانلود در ادامه مطلب )
زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادامه مطلب )
دریافت نسخه pdf این آموزش&nbsp;[حجم ۶۶۱ کیلوبایت] ( لینک دانلود در ادامه مطلب )
&nbsp;ممکنه تا بحال موقع دانلود و نصب یه برنامه اندرویدی توی گوشیتون، به یه همچین پیغامی برخورده باشید که بهتون می&zwnj;گه این برنامه کاربردی که دارید نصب می&zwnj;کنید، به فلان مجوز نیاز داره. مثلا ممکنه بخواد به دوربین دستگاهتون دسترسی داشته باشه، و اونو اینطوری اعلام کنه: "همونطور که می&zwnj;دونید، این برنامه ای که در حال دانلود اون هستید، قراره به دوربین شما دسترسی داشته باشه، بنابراین بهتره به سازنده این برنامه اعتماد کنید".بنابراین اگر شما می&zwnj;خواید برنامه&zwnj;تون بتونه به چیزای مشخصی از دستگاه دسترسی داشته باشه، لازمه که به صراحت اعلام کنید که من برای استفاده از&nbsp;فلان امکانات مشخص، نیاز به مجوز دارم.
پس بذارید یه&nbsp;برنامه رو بررسی کنیم که&nbsp;بطور مشخص قراره باهاش وضعیت wi-fi دستگاه رو بررسی کنیم. می&zwnj;خوایم بدونیم که آیا wifi اتصال داره یا نه؟ یا در واقع آیا&nbsp;کاربر میتونه از طریق wifi به اینترنت وصل بشه یا نه؟
&nbsp;
۱. اول یه پروژه جدید ایجاد می&zwnj;کنیم و به کلاس MainActivity.java می&zwnj;ریم.

۲.کاری که قراره انجام بدیم اینه که تو تابع onCreate تلاش کنیم به وضعیت wifi دسترسی داشته باشیم. در اینجا&nbsp;نیاز به ساختن یه نمونه از کلاس ConnectivityManager داریم که من اسمشو به اختصار، conman گذاشتم.
هر وقت نیاز داریم که سرویسی رو از سیستمی بگیریم،&nbsp;باید درخواست دسترسی به اون سرویس رو بدیم. برای این کار از تابع getSystemService&nbsp;استفاده می&zwnj;کنیم. بعدش فقط لازمه&nbsp;اسم اون سرویسی که می&zwnj;خوایم بهش دسترسی داشته باشیم رو وارد کنیم.&nbsp;که تو اینجا&nbsp;بهش از طریق یه ثابت ایستا که تو کلاس Context به نام CONNECTIVITY_SERVICE هست ارجاع میدیم.
ConnectivityManager conman =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
۳. حالا می&zwnj;خوایم، توی متنی که به صورت پیش فرض همه پروژه&zwnj;های جدید دارن، بنویسیم که آیا wifi متصل هست یا نه. و چون به صورت پیش فرض این فیلد متنی شناسه نداره به activity_main.xml می ریم و برای اون یه شناسه تعریف می&zwnj;کنیم.
نحوه تعریف کردن شناسه اینطوره که در فایل activity_main.xml، در تگ TextView می&zwnj;نویسیم "android:id="@id/matneman و چون این اولین باره که این شناسه رو تعریف می کنیم، یه علامت مثبت (+) هم کنار کلمه id می نویسیم، یعنی اینطوری:

android:id="@+id/matneman"
۴. تو تابع onCreate به متن&zwnj;مون داخل xml ارجاع میدیم.

TextView matn =(TextView) findViewById (R.id.matneman);
۵. اطلاعات مربوط به وضعیت wifi رو&nbsp;تو یه متغیر&nbsp;boolan&nbsp;به نام wifi می&zwnj;ریزیم. برای همین از کلاس ConnectivityManager استفاده می&zwnj;کنیم. تابع getNetworkInfo اطلاعاتی که بخوایم رو از شبکه می&zwnj;گیره. حالا برای ورودی این تابع باید اون اطلاعاتی که احتیاج داریم رو بدیم، ما الان به اطلاعات wifi احتیاج داریم



درک امنیت و اجازه ها (permission)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;درک امنیت و اجازه&zwnj;ها&raquo;
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه pdf این آموزش&nbsp;[حجم ۶۶۱ کیلوبایت]
&nbsp;ممکنه تا بحال موقع دانلود و نصب یه برنامه اندرویدی توی گوشیتون، به یه همچین پیغامی برخورده باشید که بهتون می&zwnj;گه این برنامه کاربردی که دارید نصب می&zwnj;کنید، به فلان مجوز نیاز داره. مثلا ممکنه بخواد به دوربین دستگاهتون دسترسی داشته باشه، و اونو اینطوری اعلام کنه: "همونطور که می&zwnj;دونید، این برنامه ای که در حال دانلود اون هستید، قراره به دوربین شما دسترسی داشته باشه، بنابراین بهتره به سازنده این برنامه اعتماد کنید".بنابراین اگر شما می&zwnj;خواید برنامه&zwnj;تون بتونه به چیزای مشخصی از دستگاه دسترسی داشته باشه، لازمه که به صراحت اعلام کنید که من برای استفاده از&nbsp;فلان امکانات مشخص، نیاز به مجوز دارم.
پس بذارید یه&nbsp;برنامه رو بررسی کنیم که&nbsp;بطور مشخص قراره باهاش وضعیت wi-fi دستگاه رو بررسی کنیم. می&zwnj;خوایم بدونیم که آیا wifi اتصال داره یا نه؟ یا در واقع آیا&nbsp;کاربر میتونه از طریق wifi به اینترنت وصل بشه یا نه؟
&nbsp;
۱. اول یه پروژه جدید ایجاد می&zwnj;کنیم و به کلاس MainActivity.java می&zwnj;ریم.

۲.کاری که قراره انجام بدیم اینه که تو تابع onCreate تلاش کنیم به وضعیت wifi دسترسی داشته باشیم. در اینجا&nbsp;نیاز به ساختن یه نمونه از کلاس ConnectivityManager داریم که من اسمشو به اختصار، conman گذاشتم.
هر وقت نیاز داریم که سرویسی رو از سیستمی بگیریم،&nbsp;باید درخواست دسترسی به اون سرویس رو بدیم. برای این کار از تابع getSystemService&nbsp;استفاده می&zwnj;کنیم. بعدش فقط لازمه&nbsp;اسم اون سرویسی که می&zwnj;خوایم بهش دسترسی داشته باشیم رو وارد کنیم.&nbsp;که تو اینجا&nbsp;بهش از طریق یه ثابت ایستا که تو کلاس Context به نام CONNECTIVITY_SERVICE هست ارجاع میدیم.
ConnectivityManager conman =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
۳. حالا می&zwnj;خوایم، توی متنی که به صورت پیش فرض همه پروژه&zwnj;های جدید دارن، بنویسیم که آیا wifi متصل هست یا نه. و چون به صورت پیش فرض این فیلد متنی شناسه نداره به activity_main.xml می ریم و برای اون یه شناسه تعریف می&zwnj;کنیم.
نحوه تعریف کردن شناسه اینطوره که در فایل activity_main.xml، در تگ TextView می&zwnj;نویسیم "android:id="@id/matneman و چون این اولین باره که این شناسه رو تعریف می کنیم، یه علامت مثبت (+) هم کنار کلمه id می نویسیم، یعنی اینطوری:

android:id="@+id/matneman"
۴. تو تابع onCreate به متن&zwnj;مون داخل xml ارجاع میدیم.

TextView matn =(TextView) findViewById (R.id.matneman);
۵. اطلاعات مربوط به وضعیت wifi رو&nbsp;تو یه متغیر&nbsp;boolan&nbsp;به نام wifi می&zwnj;ریزیم. برای همین از کلاس ConnectivityManager استفاده می&zwnj;کنیم. تابع getNetworkInfo اطلاعاتی که بخوایم رو از شبکه می&zwnj;گیره. حالا برای ورودی این تابع باید اون اطلاعاتی که احتیاج داریم رو بدیم، ما الان به اطلاعات wifi احتیاج داریم پس ConnectivityManager.TYPE_WIFI رو به عنوان ورودی وارد می&zwnj;کنیم. چون در آخر نیاز به خروجی از نوع boolean (درست یا نادرست) داریم از تابع isConnectedOrConnecting استفاده می&zwnj;کنیم.

در صورتی که wifi دستگاه اتصال داشته باشه و یا در حال اتصال باشه، پیغام "wifi roshane" نمایش داده می&zwnj;شه.
boolean wifi =conman.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();if(wifi)matn.setText("wifi roshane!");else
matn.setText("wifi khamooshe!");
۶. اگه برنامه رو اجرا کنیم، با این خطا موجه می&zwnj;شیم:

7. اگر وارد قسمت DDMS بشیم و LogCat رو بیاریم، میبینیم که مشکل یه استثنای امنیتیه! در واقع ما برای دسترسی به وضعیت شبکه، اجازه نگرفتیم.

8. این اجازه رو باید تو فایل AndroidManifest.xml ثبت کنیم. پس Manifest رو باز میکنیم، داخلش زبانه ی permission دیده میشه.
روی زبانه ی permission کلیک میکنیم و میخوایم به کاربر اعلام کنیم که آیا میتونیم به وضعیت شبکه دسترسی داشته باشیم یا نه؟
پس روی دکمه Add کلیک کرده و Uses Permission رو انتخاب میکنیم.

با انتخاب این گزینه، اعلام میکنیم که این برنامه به فلان اجازه احتیاج داره.
9. با زدن فلش جلوی Name میتونیم اسم همه ی اجازه هایی رو که ممکنه برنامه مون بهش نیاز داشته باشه ببینیم.
تو اینجا به Access_Network_State نیاز داریم.

10. حالا اگه زبانه ی AndroidManifest.xml رو بیاریم، میبینیم که یه خط بهش اضافه شده.
&lt;uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/&gt;
11. دوباره برنامه رو اجرا میکنیم تا ببینیم شبیه ساز چه متنی رو نشون میده.

میگه wifi خاموشه، چون تو ماشین شبیه ساز اینجا در واقع از اتصال شبکه ای من برای شبیه سازی شبکه ی داده های تلفن همراه استفاده میکنه، و این همون چیزیه که انتظارشو داشتیم.

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


<item>
<title>ساختن و استفاده از منابع (Resources)</title>
<link>https://maisamk.loxblog.com/ساختن-و-استفاده-از-منابع-resources-1</link>
<guid>https://maisamk.loxblog.com/ساختن-و-استفاده-از-منابع-resources-1</guid>

<description><![CDATA[

ساختن و استفاده از منابع (Resources)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;نحوه ی ساخت و استفاده از منابع&raquo; ( لینک دانلود در ادمه مطلب )
زیر نویس انگلیسی [English Subtitle] ( لینک دانلود در ادمه مطلب )
دریافت نسخه pdf این آموزش&nbsp;[1.73 مگابایت] ( لینک دانلود در ادمه مطلب )
&lrm;وقتی دارید برنامتون رو می&zwnj;سازید احتمال زیاد از منابع بیرونی هم استفاده خواهید کرد، مثل فایلهای ویدیویی یا شنیداری، تصاویر، xml و ... پس باید بدونید چطور از داخل برنامتون به این منابع ارجاع بدید. منابع برنامتون داخل پوشه ی res ذخیره می شن. و یه سری فایلها به صورت خودکار بهش اضافه می شه مثل :
layout : شامل فایل های xml ای که مربوط به محیط های کاربریه.
values : شامل تمام مقادیریه که توی برنامتون تعریف می کنید و بهشون یه اسم می دید و بعدا با اون اسم بهشون رجوع می کنید و ازشون استفاده می کنید.
&lrm; فایل string.xml &nbsp;هم به طور پیش فرض در این فولدر به وجود اومده.&nbsp;نحوه&zwnj;ی کارکرد string.xml این طوریه که ما یه سری منابع رشته&zwnj;ای داریم که مثلا&nbsp;&zwnj;(با توجه به تصویر) هرجا که تو برناممون بخوایم از Hello World, Main! استفاده کنیم، به جاش می تونیم به این منبع ارجاعش بدیم و بنویسیم hello.

&lrm; حالا چرا این منابع رو بیرون نگه می&zwnj;داریم؟ به خاطر اینکه بتونیم متغیرهای سراسری (global) داشته باشیم، مثلا می تونیم چند تا فولدر برای زبان های مختلف داشته باشیم و فقط لازمه که به فایل xml مربوط به اون زبان بریم و دیگه لازم نیست تمام کدهای برناممون رو به خاطر تغییر زبان کاربر تغییر بدیم.
&lrm; ۲.اگه به سایت اصلی توسعه اندروید مراجعه کنید یه قسمت داره به اسم API Guide که توش راهنمایی های مفیدی برای ساخت برنامه کرده، یکی &nbsp;از این راهنماها مربوط به منابع می شه، خود اندروید به طور پیش فرض یه سری از فولدرها رو تو res تشخیص می&zwnj;ده مثلا&nbsp;
&lrm; اگه فولدر anim رو درست کنید و توش یه فایل xml مخصوص انیمیشن بذارید، اندروید متوجه می شه که انیمیشنه. (تو آموزش های بعدی مفصل به انیمیشن می پردازیم).
&lrm; یا مثلا اگه می&zwnj;خواید یه لیستی از رنگ ها رو در برنامتون استفاده کنید می تونید تو فولدر color بذاریدشون.
&lrm; هر کدوم از عکس&zwnj;هامون یا هر فایل xml مربوط به گرافیک در داحل فولدر drawable قرار می گیره.
&lrm; فولدر layout شامل فایلهای xml مربوط به چیدمان صفحه است.
&lrm; اگه بخوایم منو برای برناممون بسازیم (که بعدا آموزش داده خواهد شد) باید اونو تو فولدر menu بذاریم و ...
&lrm; چون تمام این منابع نوعی assets هستن، ممکنه از خودتون بپرسید پس این فولدر assets چیه (معمولا بالای فولدره bin هست)، در واقع می تونید منابعتون رو تو این فولدر بذارید ولی نمی تونید با یک id بهشون ارجاع بدید. به همین خاطر بهتره تمام منابع رو توی همون فولدر res قرار بدیم چون به طور خودکار براشون id ساخته می شه و با دستور R.id می تونید بهشون رجوع کنید.

&lrm; ۳.اگه تو زیر شاخه های فولدر res دقت کرده باشید، خود فولدر drawable به تنهایی وجود نداره بلکه سه تا فولدر drawable-hdpi، drawable-ldpi و drawable-mdpi وجود دارن، این به خاطر یک ویژگی مهمه اندرویده که دستگاه ها رو به سه وضوح تصویر تقسیم بندی کرده : دستگاه&zwnj;های با وضوح تصویر بالا (High dpi)، دستگاه&zwnj;های با وضوح تصویر متوسط (Medium dpi) و دستگاه&zwnj;های با وضوح تصویر پایین (Low dpi). برای هر کدوم از این وضوح تصویرهای مختلف می&zwnj;تونیم assetهای مربوط به خودشون رو بذاریم، و سیستم اندروید با توجه به دستگاهی که داره روش اجرا می&zwnj;شه، asset مربوطه رو بیرون می&zwnj;کشه و در برنامه ازش استفاده می کنه (توی یه آموزش دیگه بهش می&zwnj;پردازیم) ولی فقط بدونید که اگر از یه asset خواستید که تو همه&zwnj;ی وضوح تصاویر استفاده بشه، کافیه فقط توی drawable-hdpi بذاریدش، اون وقت تو یه دستگاه با وضوح تصویر متوسط یا پایین هم سیستم از تو فولدر drawable-hdpi برشون می&zwnj;داره.
&lrm; ۴.راحت&zwnj;ترین راه برای اضافه کردن asset به برنامه&zwnj;تون اینه که محتوایی که می خواید رو بکشید و تو فولدر مورد نظر ول کنید.
&lrm; برای این که به پیغام خطا برخورد نکنید حواستون باشه اسم asset هایی که می&zwnj;خواید وارد کنید فقط می&zwnj;تونه شامل حروف a تا z، اعداد 0 تا 9 و خط زیر باشه.

&lrm; ۵.تو فولدر gen اگه R.java رو باز کنید، می&zwnj;بینید که به اون asset جدیدی که اضافه کردید یه عدد نسبت داده، لازم نیست برای ارجاع به این asset اون عدد رو استفاده کنید بلکه از راه دیگه ای این کارو می&zwnj;کنیم که الان توضیح می&zwnj;دم. (حواستون باشه که اصلا تغییری هم توی فایل R.java ایجاد نکنید چون این فایل به طور خودکار ..................................



ساختن و استفاده از منابع (Resources)
&nbsp;



تماشای برخط [لینک مستقیم] فیلم آموزشی &laquo;نحوه ی ساخت و استفاده از منابع&raquo;
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه pdf این آموزش&nbsp;[1.73 مگابایت]
&lrm;وقتی دارید برنامتون رو می&zwnj;سازید احتمال زیاد از منابع بیرونی هم استفاده خواهید کرد، مثل فایلهای ویدیویی یا شنیداری، تصاویر، xml و ... پس باید بدونید چطور از داخل برنامتون به این منابع ارجاع بدید. منابع برنامتون داخل پوشه ی res ذخیره می شن. و یه سری فایلها به صورت خودکار بهش اضافه می شه مثل :
layout : شامل فایل های xml ای که مربوط به محیط های کاربریه.
values : شامل تمام مقادیریه که توی برنامتون تعریف می کنید و بهشون یه اسم می دید و بعدا با اون اسم بهشون رجوع می کنید و ازشون استفاده می کنید.
&lrm; فایل string.xml &nbsp;هم به طور پیش فرض در این فولدر به وجود اومده.&nbsp;نحوه&zwnj;ی کارکرد string.xml این طوریه که ما یه سری منابع رشته&zwnj;ای داریم که مثلا&nbsp;&zwnj;(با توجه به تصویر) هرجا که تو برناممون بخوایم از Hello World, Main! استفاده کنیم، به جاش می تونیم به این منبع ارجاعش بدیم و بنویسیم hello.

&lrm; حالا چرا این منابع رو بیرون نگه می&zwnj;داریم؟ به خاطر اینکه بتونیم متغیرهای سراسری (global) داشته باشیم، مثلا می تونیم چند تا فولدر برای زبان های مختلف داشته باشیم و فقط لازمه که به فایل xml مربوط به اون زبان بریم و دیگه لازم نیست تمام کدهای برناممون رو به خاطر تغییر زبان کاربر تغییر بدیم.
&lrm; ۲.اگه به سایت اصلی توسعه اندروید مراجعه کنید یه قسمت داره به اسم API Guide که توش راهنمایی های مفیدی برای ساخت برنامه کرده، یکی &nbsp;از این راهنماها مربوط به منابع می شه، خود اندروید به طور پیش فرض یه سری از فولدرها رو تو res تشخیص می&zwnj;ده مثلا&nbsp;
&lrm; اگه فولدر anim رو درست کنید و توش یه فایل xml مخصوص انیمیشن بذارید، اندروید متوجه می شه که انیمیشنه. (تو آموزش های بعدی مفصل به انیمیشن می پردازیم).
&lrm; یا مثلا اگه می&zwnj;خواید یه لیستی از رنگ ها رو در برنامتون استفاده کنید می تونید تو فولدر color بذاریدشون.
&lrm; هر کدوم از عکس&zwnj;هامون یا هر فایل xml مربوط به گرافیک در داحل فولدر drawable قرار می گیره.
&lrm; فولدر layout شامل فایلهای xml مربوط به چیدمان صفحه است.
&lrm; اگه بخوایم منو برای برناممون بسازیم (که بعدا آموزش داده خواهد شد) باید اونو تو فولدر menu بذاریم و ...
&lrm; چون تمام این منابع نوعی assets هستن، ممکنه از خودتون بپرسید پس این فولدر assets چیه (معمولا بالای فولدره bin هست)، در واقع می تونید منابعتون رو تو این فولدر بذارید ولی نمی تونید با یک id بهشون ارجاع بدید. به همین خاطر بهتره تمام منابع رو توی همون فولدر res قرار بدیم چون به طور خودکار براشون id ساخته می شه و با دستور R.id می تونید بهشون رجوع کنید.

&lrm; ۳.اگه تو زیر شاخه های فولدر res دقت کرده باشید، خود فولدر drawable به تنهایی وجود نداره بلکه سه تا فولدر drawable-hdpi، drawable-ldpi و drawable-mdpi وجود دارن، این به خاطر یک ویژگی مهمه اندرویده که دستگاه ها رو به سه وضوح تصویر تقسیم بندی کرده : دستگاه&zwnj;های با وضوح تصویر بالا (High dpi)، دستگاه&zwnj;های با وضوح تصویر متوسط (Medium dpi) و دستگاه&zwnj;های با وضوح تصویر پایین (Low dpi). برای هر کدوم از این وضوح تصویرهای مختلف می&zwnj;تونیم assetهای مربوط به خودشون رو بذاریم، و سیستم اندروید با توجه به دستگاهی که داره روش اجرا می&zwnj;شه، asset مربوطه رو بیرون می&zwnj;کشه و در برنامه ازش استفاده می کنه (توی یه آموزش دیگه بهش می&zwnj;پردازیم) ولی فقط بدونید که اگر از یه asset خواستید که تو همه&zwnj;ی وضوح تصاویر استفاده بشه، کافیه فقط توی drawable-hdpi بذاریدش، اون وقت تو یه دستگاه با وضوح تصویر متوسط یا پایین هم سیستم از تو فولدر drawable-hdpi برشون می&zwnj;داره.
&lrm; ۴.راحت&zwnj;ترین راه برای اضافه کردن asset به برنامه&zwnj;تون اینه که محتوایی که می خواید رو بکشید و تو فولدر مورد نظر ول کنید.
&lrm; برای این که به پیغام خطا برخورد نکنید حواستون باشه اسم asset هایی که می&zwnj;خواید وارد کنید فقط می&zwnj;تونه شامل حروف a تا z، اعداد 0 تا 9 و خط زیر باشه.

&lrm; ۵.تو فولدر gen اگه R.java رو باز کنید، می&zwnj;بینید که به اون asset جدیدی که اضافه کردید یه عدد نسبت داده، لازم نیست برای ارجاع به این asset اون عدد رو استفاده کنید بلکه از راه دیگه ای این کارو می&zwnj;کنیم که الان توضیح می&zwnj;دم. (حواستون باشه که اصلا تغییری هم توی فایل R.java ایجاد نکنید چون این فایل به طور خودکار درست می&zwnj;شه و اگه تغییرش بدید برنامتون به هم می&zwnj;ریزه.)

۶.من برای این آموزش یه پروژه&zwnj;ی جدید ساختم و تا اینجا فقط یه عکس به فولدر drawable-hdpi اضافه کردم، از فولدر res به layout برید و فایل xml اصلی تون رو انتخاب کنید (برای من main.xml هست)، اون فیلد متنی رو پاک کنید، به جاش می&zwnj;خوایم عکسی که به پروژه اضافه کردیم رو بذاریم، از منوی کنار Images &amp; Media رو انتخاب کنید و اون المانی که تو عکس دورش قرمز شده رو انتخاب کنید و به داخل صفحه بکشید و ول کنید، حالا ازتون می&zwnj;خواد منبع عکس رو مشخص کنید.

&lrm; برای اینکه متوجه بشید دقیقا چه اتفاقی افتاده، به قسمت ویرایش متنی xml برید، تو مشخصات این تصویر یه قسمت داره به اسم android:src که با کد @drawable/androidcode_logo&nbsp;به تصویر مورد نظر ارجاع داده.

اصولا برای ارجاع به هر چیزی از علامت @ استفاده می&zwnj;کنیم.مثلا اینجا بعد از علامت @ می خوایم به drawable بریم.

و بعد هم یه تصویر دیگه رو انتخاب می&zwnj;کنیم، مثل ic_launcher.

دقت کنید که برای رسیدن به androidcode_logo یا هر asset دیگه&zwnj;ای، نیازی نبود که بنویسیم @drawable-hdpi فقط کافی بود از @drawable استفاده کنیم. اینکه این asset از کدوم وضوح تصویر انتخاب بشه رو، خود سیستم عامل اندروید با توجه گوشی کاربر انجام می&zwnj;ده. حالا اگه به قسمت گرافیکی main.xml بریم، می&zwnj;بینیم که تصویر عوض شده.

خوب این روش ارجاع در فایل های xml بود، حالا اگه از فایل&zwnj;های جاوا بخوایم به منابعمون ارجاع بدیم باید چی کار کنیم؟
۷.اول یه ارجاع از خود ImageView می&zwnj;گیریم :
ImageView ax =(ImageView) findViewById (R.id.imageView1);
بعد منبع این ImageView رو می&zwnj;ذاریم عکسی که می&zwnj;خوایم :
ax.setImageResource(R.drawable.androidcode_logo);

این دستور باعث می&zwnj;شه وقتی که برنامه اجرا شد، منبع عکس از اون چیزی که بوده، تغییر پیدا کنه به R.drawable.androidcode_logo و وقتی برنامه رو اجرا می&zwnj;کنیم، این خروجی رو می&zwnj;بینیم.

&nbsp;
فایل main.xml :
&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"&gt;&lt;ImageViewandroid:id="@+id/imageView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher"/&gt;&lt;/LinearLayout&gt;
فایل Main.java :
package ir.AndroidCode.intent;import android.app.Activity;import android.os.Bundle;import android.widget.ImageView;publicclassMainextendsActivity{@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
       setContentView(R.layout.main);ImageView ax =(ImageView) findViewById (R.id.imageView1);
       ax.setImageResource(R.drawable.androidcode_logo);}}
&nbsp;
&nbsp;

]]></description>

<pubDate>Fri, 26 Jun 2026 00:42:17 +0330</pubDate>
</item>


</channel>
</rss>

