آموزش جاوا و اندروید

یادداشت های یک برنامه نویس معمولی

آموزش جاوا و اندروید

یادداشت های یک برنامه نویس معمولی

طبقه بندی موضوعی

 اگر از اپراتور null safety کاتلین که .? هست، برای چک کردن نهایی null بودن متغیر باید به صورت زیر عمل کرد:

var word: String? = "Elvis"
val length: Int = if (word != null) word.length else -1

 

یعنی باید به صورت Explicit بررسی کرد که آیا word مقدار null دارد یا خیر. به جای بررسی کردن با if میشه از :? استفاده کرد.

val word: String? = "Elvis"
val length: Int = word?.length ?: -1

 

به این اپراتور Elvis گفته میشه و میگه اگر word مقدارش null بود، 1- جایگزین بشه.

 

۰ نظر موافقین ۰ مخالفین ۰ ۲۵ اسفند ۰۲ ، ۲۱:۳۹
میم دال

1. سینگل تون

 

2. بیلدر (با توجه به وجود named constructor و کلاس data در کاتلین این دیزاین پترن معنی نداره)

 

3. فکتوری

 

4. dependency Injection (DI)

 

5. Facade:

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

 

6. Adapter:

این دیزاین پترن برای اتصال دو کلاس با ساختارهای متفاوت استفاده می شود. به عبارت دیگر، یک میانجی بین دو ساختار دیگر است. این میانجی تغییرات لازم را روی داده های سورس انجام میده تا در مقصد نشون داده بشه بدون اینکه داده های اصلی تغییر پیدا کنه. مثل اداپتر در ریسایکلر ویو که لیستی از داده های منبع که عموما لیست یا آرایه هست را به view holder که قابل نمایش برای ریسایکلر ویو است را تبدیل میکند.

۰ نظر موافقین ۰ مخالفین ۰ ۱۱ اسفند ۰۲ ، ۰۵:۳۰
میم دال

در برنامه نویسی imperative باید step by step مشخص کنیم چیا میخوایم. (How) - در این حالت مثلا میگیم میخوایم فلان تکست توی textView نمایش داده بشه

 

در برنامه نویسی declarative فقط میگیم چیا میخوایم. (What) - در این حالت state داریم و میگیم قراره state تکست جدیدی رو نشون بده.

 

مثال imperative programming:

 

        val list = listOf(1, 2, 20, 3, 4, 25, 5)

        val newList: MutableList<Int> = ArrayList()

        for (i in list) {
            if (i < 10) {
                newList.add(i)
            }
        }

        Log.d(TAG, "imperative newList: $newList")

 

مثال declarative programming: 

Log.d(TAG, "declarative newList: ${list.filter { i -> i < 10 }.toList()}")

 

۰ نظر موافقین ۰ مخالفین ۰ ۳۰ بهمن ۰۲ ، ۰۴:۴۵
میم دال

1. چنل Canary: این چنل unStable ترین هست و زود به زود (هفتگی) آپدیت میشه. برای اینه که یوزرا متوجه بشن چیا جدید اومده ولی این نسخه اصلا مناسب پروداکشن نیست.

 

2. چنل Dev: نسخه این کانال از Canary با ثبات تر هست. به روز رسانی هایی کمتر از Canary داره و مناسب توسعه دهندگانی است که میخواهند قبل از انتشار عمومی، نسخه های جدید اندروید استودیو را آزمایش کنند. مناسب پروداکشن نیست.

 

3. چنل Beta: این چنل شامل نسخه ای است که به طور کامل آزمایش شده و آماده انتشار عمومی هست. اما ممکن است شامل تمام ویژگی های جدید نباشد.

 

4. چنل Stable: نسخه پایدار که مناسب پروداکشن و تمامی کاربران است.

۰ نظر موافقین ۰ مخالفین ۰ ۳۰ بهمن ۰۲ ، ۰۲:۳۶
میم دال

Modifier یکی از مهم ترین Composableها هست که میتونه ویژگی های زیادی رو برای دیزاین در اختیار ما بذاره. در compose، ترتیب (order) قرار گرفتن پراپرتی های Modifier مهمه و میتونه نتیجه رو تغییر بده. این مثال نشون میده که چجوری جا به جایی padding میتونه در جواب نهایی تاثیر داشته باشه.

 

Modifier کاستوم شده

fun Modifier.socialMedia(): Modifier = composed {
    if (isSystemInDarkTheme()) {
        this
            .border(shape = RoundedCornerShape(16.dp), width = 2.dp, color = BlueGray)
            .background(Color.Transparent)

    } else {
        this
            .border(shape = RoundedCornerShape(16.dp), width = 2.dp, color = LightGray)
            .background(LightBlueWhite)

    }

}

this همون آنجکت Modifier هست که میتونه نوشته نشه.

 

اطلاعات بیشتر

۰ نظر موافقین ۰ مخالفین ۰ ۲۶ بهمن ۰۲ ، ۰۴:۱۷
میم دال
fun TextCompose_3() {

    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.Black),
        contentAlignment = Alignment.Center,
    ) {
        val annotatedString = buildAnnotatedString {
            blueGradientText("Hello")
            append("\n\n")
            pinkBlueGradientText("Maryam")
            append("\n\n")

        }

        Text(text = annotatedString)
    }
}

۰ نظر موافقین ۰ مخالفین ۰ ۱۲ بهمن ۰۲ ، ۰۲:۳۶
میم دال

TextButton: 

 

TextButton(onClick = { /*TODO*/ }) {
                        Text(text = "Click!")
                    }

 

IconButton:

   IconButton(onClick = { /*TODO*/ }) {
                        Icon(painter = painterResource(id = R.drawable.directions_bike_24), contentDescription = null)

                    }

 

۰ نظر موافقین ۰ مخالفین ۰ ۱۲ بهمن ۰۲ ، ۰۲:۱۷
میم دال

یک Button که در وسط یک Box قرار گرفته است.

۰ نظر موافقین ۰ مخالفین ۰ ۱۲ بهمن ۰۲ ، ۰۲:۱۵
میم دال

در کاتلین دو نوع لیست mutable و immutable وجود داره.

لیست immutable:

 val mylist = listOf("1","2","3")

 

لیست mutable:

سه روش برای ایجاد این نوع لیست وجود داره:

        val mylist = ArrayList<String>()

        val mylist1 = mutableListOf<String>()

        val mylist2 = arrayListOf<String>()

این سه تا فرقی با هم ندارن.

 

 

 

۰ نظر موافقین ۰ مخالفین ۰ ۲۳ آذر ۰۲ ، ۰۳:۰۶
میم دال

آرایه:

دو نوع روش برای ایجاد آرایه وجود داره. در روش اول باید سایز آرایه و مقدار اولیه اون مشخص بشه. در روش دوم فقط باید مقدار اولیه مشخص بشه. هر دو mutable هستن، یعنی میشه یه عضو از آرایه را تغییر داد. اما طول آرایه قابل تغییر نیست.

 

val myArray = Array<Int>(5){0}

val myArray = arrayOf("1", "2")

۰ نظر موافقین ۰ مخالفین ۰ ۲۲ آذر ۰۲ ، ۱۴:۵۸
میم دال