loading...

مرجع تخصصی بروزترین مقالات طراحی اپلیکیشن

بازدید : 15
يکشنبه 4 خرداد 1404 زمان : 13:45


کاربرد State در Jetpack Compose چیست؟
Jetpack Compose با معرفی قابلیتی به عنوان State به گرفتاری بخش اعظمی از اپلیکیشن‌نویسان اندروید نقطه پايان اعطا کرد. Stateها در Jetpack Compose شرایط کامپوننت‌های نرم‌افزار را مشخص و معلوم می‌نمایند و با به کارگیری از آنان به سادگی می‌اقتدار رابط کاربری نرم افزار را طراحی اپلیکیشن در مشهد بروزرسانی کرد.


درین قسمت از نوشته به پرسش جواب داده گردد که کاربرد State در Jetpack Compose چیست و چه‌طور می‌قدرت از آن در نرم افزار اندرویدی بهره برد. کد ذیل به طور عملی طرز استعمال از State و کاربرد آن در Jetpack Compose را آرم می دهد.

1@Composable
2fun ButtonClickComponent() {
3 var showPopup by remember {
4 mutableStateOf(false)
5 }
6 val color = if (showPopup) {
7 Color.Green
8 } else {
9 Color.Red
10 }
11 val colors = ButtonDefaults.buttonColors(backgroundColor = color)
12 Button(
13 onClick = { showPopup = true },
14 colors = btnColors
15 ) {
16 Text(text = "Click Me")
17 }
18}
مشاهده بدون نقص کدها
در مثال کد ارائه گردیده در صدر، متغیری از نوع «تغییر‌و تحول پذیر» (mutable) با نامshowPopup تمجید گردیده است. خلال این، در کنار این متغیر لغات کلیدی جذاب و جدیدی همچونremember وmutableStateOf نیز چشم میشوند که احتمالاً در اپ نویسی اندروید کمتر با آن ها مواجه گردیده‌اید.

برخورد به تغییر تحول State از خصوصیت‌های مهم Jetpack Compose میباشد. با تغییر تحول مقدار متغیرshowPopupتمام کامپوننت‌ها و قسمت‌هایی از اپ که از این متغیر به کارگیری کرده‌اند، به طور اتومات مجدداً رسم و بروزرسانی می شوند. در نمونه فوق، با کلیک استفاده کننده بر روی دکمه مقدار متغیرshowPopup تغییر تحول می‌نماید و در سود، رنگ این دکمه سبز میگردد.


امروزه ضمن Jetpack Compose فریمورک‌هایی همانند «فلاتر» (Flutter) و «ریکت نیتیو» (React Native) نیز از راه «مدیر موقعیت» (State Managment) برای بروزرسانی رابط کاربری به کار گیری می‌نمایند.

پیاده سازی Layout در Jetpack Compose
درین نصیب از نوشته روش پیاده‌سازی یک کامپوننت معمولی آیتم نظارت قرار خواهد گرفت که مشتمل بر دو متن و یک تصویر میباشد. تصویر پایین محل قرارگیری اجزای این کامپوننت آرم داده گردیده است.


آحاد نرم افزار‌های اندرویدی از کنار هم قرار به دست آوردن تعدادی کامپوننت همچون کامپوننت فوق ساخته میگردند. برای ریلکس‌خیس شدن پروسه پیاده سازی این کامپوننت در Jetpack Compose می بایست آن را به یک‌سری قسمت کوچکتر تقسیم کرد. در تصویر تحت کامپوننت فوق به قسمت‌های کوچکتر تقسیم شد‌ه‌است.


با دقت به تصویر فوق، این کامپوننت از یک ستون یا این که Row تشکیل‌شده میباشد که‌این ستون نیز مشمول یک تصویر یا این که ImageView و یک ردیف یا این که Column میباشد. در غایت، ردیف متبوع نیز از دو متن یا این که Text تشکیل‌شده میباشد. برای پیاده‌سازی این کامپوننت به امداد شیوه سنتی پیشرفت رابط کاربری در اندروید می بایست از عناصری همچونLinearLayout یاRelativeLayout بهره برد.

مثلا، برای پیاده‌سازی کامپوننت فوق در Jetpack Compose به مکان به کار گیری ازLinearLayout می‌اقتدار ازRow یاColumn با دقت به وضعیت به کار گرفت. به دنبال، کد مرتبط با پیاده‌سازی این کامپوننت به امداد Jetpack Compose اورده شده میباشد.

1@Composable
2fun ImageWithTitleSubtitleComponent(
3 title: String,
4 subtitle: String,
5 imageUrl: String
6) {
7 Card(
8 shape = RoundedCornerShape(4.dp),
9 modifier = Modifier.fillParentMaxWidth().padding(16.dp)
10 ) {
11 Row(
12 modifier = Modifier.fillMaxWidth()
13 .padding(16.dp)
14 ) {
15 // Assume we created a component to render an Image. NetworkImage(imageUrl)
16 Column(
17 modifier = Modifier.padding(start = 16.dp)
18 ) {
19 BasicText(title) BasicText(subtitle)
20 }
21 }
22 }
23}
مشاهده بی نقص کدها
طراحی List به امداد Jetpack Compose
لیست‌ ویو (ListView) یکی ویجت‌های پر استفاده در نرم افزار‌های اندرویدی میباشد. با به کارگیری از این ویجت می‌اقتدار لیستی از مورد‌ها را در نرم افزار اکران بخشید. برای مثال کاربردهای لیست ویو می‌اقتدار به استعمال از آن در نرم افزار‌های مرتبط با اکران لیست مخاطبین، لیست تولید ها و لیست شهرها اشاره نمود.


برای ایجاد کرد لیستی از ارکان به یاری Jetpack Compose بایستی به‌این پرسش جواب اعطا کرد که هم اندازه ListView در Jetpack Compose چیست و چه‌گونه بایستی از آن بهره مند شد. با به کار گیری ازLazyColumn می‎‌اقتدار لیستی از موادسازنده را در Jetpack Compose پیاده‌سازی کرد. مثال کد تحت، طرز پیاده‌سازی لیستی از موادتشکیل دهنده را به کمکLazyColumn در Jetpack Compose آرم می دهد.

1@Composable
2fun ListComponent(list: List) {
3 LazyColumn(modifier = Modifier.fillMaxHeight()) {
4 items(
5 items = list,
6 itemContent = { listItem -> ImageWithTitleSubtitleComponent(
7 title = listItem.title,
8 subtitle = listItem.subtitle,
9 imageUrl = listItem.imageUrl
10 )}
11 )
12 }
13}

با پژوهش مثال کد بالا و کد مرتبط با پیاده‌سازی لیست ویو به طرز سنتی در اندروید می‌اقتدار متوجه کاهش قابل مراعات کدها شد. کاهش معیار کدها و ارتقاء خوانایی از نکات مثبت به کار گیری از Jetpack Compose در پیاده سازی رابط کاربری نرم افزار‌های اندرویدی میباشد.

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

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


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

1class SuperheroListActivity : AppCompatActivity() {
2 override fun onCreate(savedInstanceState: Bundle?) {
3 super.onCreate(savedInstanceState)
4 val viewModel = ViewModelProvider(this).get(SuperheroesViewModel::class.java)
5 setContent {SuperheroListScreen(viewModel.superheroes)}
6 }
7}

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

1class SuperheroesViewModel : ViewModel() {
2 val superheroes = liveData {
3 val superheroList = loadSuperheroes()
4 emit(superheroList)
5 }
6
7 // Added a delay of 2 seconds to emulate a network request. This method
8 // just sets the list of superheroes to the livedata after 2 seconds.
9 suspend fun loadSuperheroes(): List {
10 delay(2000)
11 return listOf(
12 Superhero("Iron Man", 43, "https..."),
13 Superhero("Hulk", 38, "https..."),
14 ...
15 )
16 }
17}
18// Model class for superhero metadata
19data class Superhero(
20 val name: String,
21 val age: Int,
22 val profileImageUrl: String
23)
مشاهده بی نقص کدها
مثال کد بالا، مسئولیت بارگزاری داده ها مایحتاج برای تشکیل داد لیست شخصیت‌های ابر قهرمانی در اپ را برعهده دارااست.

قدم سوم: پیاده سازی منطق رابط کاربری
«امکان همیاری» (Interoperability) سیستم تازه با سیستم فعلی یکی سوالاتی میباشد که هنگام معرفی یک فریمورک نو می بایست به آن جواب داده خواهد شد. یک کدام از نکات مثبت Jetpack Compose قابلیت و امکان همیاری آن با طرز بسط سنتی در اندروید میباشد.

مراد از قابلیت و امکان همیاری این میباشد که می‌اقتدار از این دو ابزار در کنار یکدیگر و سوای خلل بهره برد. از جمله، کد پایین طرز تبدیل یک شی از نوعLiveData را با به کار گیری از تابعobserveAsState به متغیری از نوعState در Jetpack Compose نشانه میدهد.

1@Composable
2fun SuperheroListScreen(
3 list: LiveData>) {
4 val superheroes by list.observeAsState(
5 initial = emptyList()
6 )
7 if (superheroes.isEmpty())
8 {LoadingComponent()}
9 else {SuperheroListComponent(superheroes)}
10 }

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

1@Composable
2fun LoadingComponent() {
3 val alignment = CenterHorizontally
4 Column(
5 modifier = Modifier.fillMaxSize(),
6 verticalArrangement = Center,
7 horizontalAlignment = alignment
8 ) {
9 CircularProgressIndicator(Modifier.wrapContentWidth(CenterHorizontally)
10 )
11 }
12}

در‌حالتی که خالی نبودن شیstate بایستی لیست شخصیت‌های ابرقهرمانی اکران داده گردد. برای این مراد تابعSuperheroListComponent پیاده‌سازی شد‌ه‌است. پیرو، کدهای مرتبط با پیاده‌سازی این تابع اورده شده میباشد.

1@Composable
2fun SuperheroListComponent(
3 superheroList: List
4 ) {
5 LazyColumn {
6 items(
7 items = superheroList,
8 itemContent = { superhero ->
9 Card(
10 shape = RoundedCornerShape(4.dp),
11 backgroundColor = Color.White,
12 modifier = Modifier
13 .fillParentMaxWidth()
14 .padding(8.dp)
15 ) {
16 ImageWithTitleSubtitleComponent(
17 superhero.name,
18 "Age: ${superhero.age}",
19 superhero.profilePictureUrl!!
20 )
21 }
22 }
23 )
24 }
25 }
مشاهده بی نقص کدها
تصویر ذیل خروجی پایانی مرتبط با پیاده‌سازی این برگه از رابط کاربری نرم افزار را نشانه میدهد.


کاربرد State در Jetpack Compose چیست؟
Jetpack Compose با معرفی قابلیتی به عنوان State به گرفتاری بخش اعظمی از اپلیکیشن‌نویسان اندروید نقطه پايان اعطا کرد. Stateها در Jetpack Compose شرایط کامپوننت‌های نرم‌افزار را مشخص و معلوم می‌نمایند و با به کارگیری از آنان به سادگی می‌اقتدار رابط کاربری نرم افزار را طراحی اپلیکیشن در مشهد بروزرسانی کرد.


درین قسمت از نوشته به پرسش جواب داده گردد که کاربرد State در Jetpack Compose چیست و چه‌طور می‌قدرت از آن در نرم افزار اندرویدی بهره برد. کد ذیل به طور عملی طرز استعمال از State و کاربرد آن در Jetpack Compose را آرم می دهد.

1@Composable
2fun ButtonClickComponent() {
3 var showPopup by remember {
4 mutableStateOf(false)
5 }
6 val color = if (showPopup) {
7 Color.Green
8 } else {
9 Color.Red
10 }
11 val colors = ButtonDefaults.buttonColors(backgroundColor = color)
12 Button(
13 onClick = { showPopup = true },
14 colors = btnColors
15 ) {
16 Text(text = "Click Me")
17 }
18}
مشاهده بدون نقص کدها
در مثال کد ارائه گردیده در صدر، متغیری از نوع «تغییر‌و تحول پذیر» (mutable) با نامshowPopup تمجید گردیده است. خلال این، در کنار این متغیر لغات کلیدی جذاب و جدیدی همچونremember وmutableStateOf نیز چشم میشوند که احتمالاً در اپ نویسی اندروید کمتر با آن ها مواجه گردیده‌اید.

برخورد به تغییر تحول State از خصوصیت‌های مهم Jetpack Compose میباشد. با تغییر تحول مقدار متغیرshowPopupتمام کامپوننت‌ها و قسمت‌هایی از اپ که از این متغیر به کارگیری کرده‌اند، به طور اتومات مجدداً رسم و بروزرسانی می شوند. در نمونه فوق، با کلیک استفاده کننده بر روی دکمه مقدار متغیرshowPopup تغییر تحول می‌نماید و در سود، رنگ این دکمه سبز میگردد.


امروزه ضمن Jetpack Compose فریمورک‌هایی همانند «فلاتر» (Flutter) و «ریکت نیتیو» (React Native) نیز از راه «مدیر موقعیت» (State Managment) برای بروزرسانی رابط کاربری به کار گیری می‌نمایند.

پیاده سازی Layout در Jetpack Compose
درین نصیب از نوشته روش پیاده‌سازی یک کامپوننت معمولی آیتم نظارت قرار خواهد گرفت که مشتمل بر دو متن و یک تصویر میباشد. تصویر پایین محل قرارگیری اجزای این کامپوننت آرم داده گردیده است.


آحاد نرم افزار‌های اندرویدی از کنار هم قرار به دست آوردن تعدادی کامپوننت همچون کامپوننت فوق ساخته میگردند. برای ریلکس‌خیس شدن پروسه پیاده سازی این کامپوننت در Jetpack Compose می بایست آن را به یک‌سری قسمت کوچکتر تقسیم کرد. در تصویر تحت کامپوننت فوق به قسمت‌های کوچکتر تقسیم شد‌ه‌است.


با دقت به تصویر فوق، این کامپوننت از یک ستون یا این که Row تشکیل‌شده میباشد که‌این ستون نیز مشمول یک تصویر یا این که ImageView و یک ردیف یا این که Column میباشد. در غایت، ردیف متبوع نیز از دو متن یا این که Text تشکیل‌شده میباشد. برای پیاده‌سازی این کامپوننت به امداد شیوه سنتی پیشرفت رابط کاربری در اندروید می بایست از عناصری همچونLinearLayout یاRelativeLayout بهره برد.

مثلا، برای پیاده‌سازی کامپوننت فوق در Jetpack Compose به مکان به کار گیری ازLinearLayout می‌اقتدار ازRow یاColumn با دقت به وضعیت به کار گرفت. به دنبال، کد مرتبط با پیاده‌سازی این کامپوننت به امداد Jetpack Compose اورده شده میباشد.

1@Composable
2fun ImageWithTitleSubtitleComponent(
3 title: String,
4 subtitle: String,
5 imageUrl: String
6) {
7 Card(
8 shape = RoundedCornerShape(4.dp),
9 modifier = Modifier.fillParentMaxWidth().padding(16.dp)
10 ) {
11 Row(
12 modifier = Modifier.fillMaxWidth()
13 .padding(16.dp)
14 ) {
15 // Assume we created a component to render an Image. NetworkImage(imageUrl)
16 Column(
17 modifier = Modifier.padding(start = 16.dp)
18 ) {
19 BasicText(title) BasicText(subtitle)
20 }
21 }
22 }
23}
مشاهده بی نقص کدها
طراحی List به امداد Jetpack Compose
لیست‌ ویو (ListView) یکی ویجت‌های پر استفاده در نرم افزار‌های اندرویدی میباشد. با به کارگیری از این ویجت می‌اقتدار لیستی از مورد‌ها را در نرم افزار اکران بخشید. برای مثال کاربردهای لیست ویو می‌اقتدار به استعمال از آن در نرم افزار‌های مرتبط با اکران لیست مخاطبین، لیست تولید ها و لیست شهرها اشاره نمود.


برای ایجاد کرد لیستی از ارکان به یاری Jetpack Compose بایستی به‌این پرسش جواب اعطا کرد که هم اندازه ListView در Jetpack Compose چیست و چه‌گونه بایستی از آن بهره مند شد. با به کار گیری ازLazyColumn می‎‌اقتدار لیستی از موادسازنده را در Jetpack Compose پیاده‌سازی کرد. مثال کد تحت، طرز پیاده‌سازی لیستی از موادتشکیل دهنده را به کمکLazyColumn در Jetpack Compose آرم می دهد.

1@Composable
2fun ListComponent(list: List) {
3 LazyColumn(modifier = Modifier.fillMaxHeight()) {
4 items(
5 items = list,
6 itemContent = { listItem -> ImageWithTitleSubtitleComponent(
7 title = listItem.title,
8 subtitle = listItem.subtitle,
9 imageUrl = listItem.imageUrl
10 )}
11 )
12 }
13}

با پژوهش مثال کد بالا و کد مرتبط با پیاده‌سازی لیست ویو به طرز سنتی در اندروید می‌اقتدار متوجه کاهش قابل مراعات کدها شد. کاهش معیار کدها و ارتقاء خوانایی از نکات مثبت به کار گیری از Jetpack Compose در پیاده سازی رابط کاربری نرم افزار‌های اندرویدی میباشد.

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

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


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

1class SuperheroListActivity : AppCompatActivity() {
2 override fun onCreate(savedInstanceState: Bundle?) {
3 super.onCreate(savedInstanceState)
4 val viewModel = ViewModelProvider(this).get(SuperheroesViewModel::class.java)
5 setContent {SuperheroListScreen(viewModel.superheroes)}
6 }
7}

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

1class SuperheroesViewModel : ViewModel() {
2 val superheroes = liveData {
3 val superheroList = loadSuperheroes()
4 emit(superheroList)
5 }
6
7 // Added a delay of 2 seconds to emulate a network request. This method
8 // just sets the list of superheroes to the livedata after 2 seconds.
9 suspend fun loadSuperheroes(): List {
10 delay(2000)
11 return listOf(
12 Superhero("Iron Man", 43, "https..."),
13 Superhero("Hulk", 38, "https..."),
14 ...
15 )
16 }
17}
18// Model class for superhero metadata
19data class Superhero(
20 val name: String,
21 val age: Int,
22 val profileImageUrl: String
23)
مشاهده بی نقص کدها
مثال کد بالا، مسئولیت بارگزاری داده ها مایحتاج برای تشکیل داد لیست شخصیت‌های ابر قهرمانی در اپ را برعهده دارااست.

قدم سوم: پیاده سازی منطق رابط کاربری
«امکان همیاری» (Interoperability) سیستم تازه با سیستم فعلی یکی سوالاتی میباشد که هنگام معرفی یک فریمورک نو می بایست به آن جواب داده خواهد شد. یک کدام از نکات مثبت Jetpack Compose قابلیت و امکان همیاری آن با طرز بسط سنتی در اندروید میباشد.

مراد از قابلیت و امکان همیاری این میباشد که می‌اقتدار از این دو ابزار در کنار یکدیگر و سوای خلل بهره برد. از جمله، کد پایین طرز تبدیل یک شی از نوعLiveData را با به کار گیری از تابعobserveAsState به متغیری از نوعState در Jetpack Compose نشانه میدهد.

1@Composable
2fun SuperheroListScreen(
3 list: LiveData>) {
4 val superheroes by list.observeAsState(
5 initial = emptyList()
6 )
7 if (superheroes.isEmpty())
8 {LoadingComponent()}
9 else {SuperheroListComponent(superheroes)}
10 }

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

1@Composable
2fun LoadingComponent() {
3 val alignment = CenterHorizontally
4 Column(
5 modifier = Modifier.fillMaxSize(),
6 verticalArrangement = Center,
7 horizontalAlignment = alignment
8 ) {
9 CircularProgressIndicator(Modifier.wrapContentWidth(CenterHorizontally)
10 )
11 }
12}

در‌حالتی که خالی نبودن شیstate بایستی لیست شخصیت‌های ابرقهرمانی اکران داده گردد. برای این مراد تابعSuperheroListComponent پیاده‌سازی شد‌ه‌است. پیرو، کدهای مرتبط با پیاده‌سازی این تابع اورده شده میباشد.

1@Composable
2fun SuperheroListComponent(
3 superheroList: List
4 ) {
5 LazyColumn {
6 items(
7 items = superheroList,
8 itemContent = { superhero ->
9 Card(
10 shape = RoundedCornerShape(4.dp),
11 backgroundColor = Color.White,
12 modifier = Modifier
13 .fillParentMaxWidth()
14 .padding(8.dp)
15 ) {
16 ImageWithTitleSubtitleComponent(
17 superhero.name,
18 "Age: ${superhero.age}",
19 superhero.profilePictureUrl!!
20 )
21 }
22 }
23 )
24 }
25 }
مشاهده بی نقص کدها
تصویر ذیل خروجی پایانی مرتبط با پیاده‌سازی این برگه از رابط کاربری نرم افزار را نشانه میدهد.

نظرات این مطلب

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

درباره ما
موضوعات
آمار سایت
  • کل مطالب : 795
  • کل نظرات : 0
  • افراد آنلاین : 1
  • تعداد اعضا : 0
  • بازدید امروز : 19
  • بازدید کننده امروز : 1
  • باردید دیروز : 1
  • بازدید کننده دیروز : 0
  • گوگل امروز : 0
  • گوگل دیروز : 0
  • بازدید هفته : 20
  • بازدید ماه : 299
  • بازدید سال : 4978
  • بازدید کلی : 38544
  • <
    پیوندهای روزانه
    اطلاعات کاربری
    نام کاربری :
    رمز عبور :
  • فراموشی رمز عبور؟
  • خبر نامه


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


    ایمیل شما :

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



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