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

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

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

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

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

برای تغییر رنگ پراگرس بار، باید توی فایل styles، واسش یه استایل کاستوم تعریف کنیم:

 

<style name="ProgressBarTheme" parent="Widget.AppCompat.ProgressBar">

    <item name="android:indeterminateTint">#BBE6FF</item>

</style>

و بدین شکل توی پراپرتی های xml براش ست کنیم:
 

style="@style/ProgressBarTheme"
۰ نظر موافقین ۰ مخالفین ۰ ۱۱ اسفند ۰۳ ، ۱۲:۰۶
میم دال

انواع امضا در اندروید

  1. V1 (Jar Signature)

    • قدیمی‌ترین روش امضا که از اندروید 1.0 معرفی شده است.
    • فقط فایل‌های داخل APK را امضا می‌کند.
    • برای نسخه‌های قبل از Android 7.0 ضروری است.
  2. V2 (APK Signature Scheme v2)

    • از Android 7.0 معرفی شد.
    • کل فایل APK را امضا می‌کند.
    • امنیت بیشتری نسبت به V1 دارد.
  3. V3 (APK Signature Scheme v3)

    • در Android 9.0 معرفی شد.
    • امکاناتی مانند Rollback Protection را اضافه می‌کند.
    • به مدیریت بهتر کلیدها کمک می‌کند.
  4. V4 (APK Signature Scheme v4)

    • در Android 10 معرفی شد.
    • برای بهینه‌سازی به‌روزرسانی‌ها در Google Play استفاده می‌شود.
    • فایل امضا Signature جدا از APK ذخیره می‌شود.

 

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

امضای دیجیتال (Signing) در اپلیکیشن‌های اندرویدی فرآیندی است که به تایید اصالت و یکپارچگی فایل APK کمک می‌کند.

 

وقتی یک برنامه اندروید (فایل APK) ساخته می‌شود، نیاز است که امضا شود. این امضا برای موارد زیر ضروری است:

  1. تایید اصالت توسعه‌دهنده: نشان می‌دهد که این فایل APK از یک توسعه‌دهنده خاص آمده است.
  2. یکپارچگی فایل: تضمین می‌کند که فایل APK بعد از امضا تغییر نکرده است.
  3. انتشار در فروشگاه Google Play: برنامه‌ها باید امضا شوند تا در Google Play منتشر شوند.
  4. به‌روزرسانی برنامه: وقتی برنامه‌ای در دستگاه نصب می‌شود، نسخه‌های جدیدتر آن باید با همان کلید امضا شوند تا به‌روزرسانی انجام شود.

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

 اگر از اپراتور 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)

                    }

 

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