Сегодня в выпуске: security-новшества Android 12, полезные и вредные функции‑расширения, советы по работе с Flow, лучшее объяснение принципа работы корутин. А также подборка библиотек для программистов.
First preview of Android 12 — анонс Android 12, самая интересная часть которого — новые механизмы обеспечения безопасности.
PendingIntent.FLAG_MUTABLE
, PendingIntent.FLAG_IMMUTABLE
). PendingIntent используется в Android, чтобы позволить системе или сторонним приложениям передать интент от имени другого приложения.ACTION_CLOSE_SYSTEM_DIALOGS
объявлен устаревшим и больше не работает.5 Kotlin Extensions To Make Your Android Code More Expressive — очередная статья о том, как сделать код на Kotlin выразительнее с помощью функций‑расширений.
Функции для показа и скрытия элементов интерфейса:
fun View.show(){ this.visibility = View.VISIBLE}fun View.hide() { this.visibility = View.INVISIBLE}fun View.remove(){ this.visibility = View.GONE}
Функции валидации строк:
fun String?.valid(): Boolean = this != null && !this.equals("null", true) && this.trim().isNotEmpty()fun String.isValidEmail(): Boolean = this.isNotEmpty() && Patterns.EMAIL_ADDRESS.matcher(this).matches()fun String.formatPhoneNumber(context: Context, region: String): String? { val phoneNumberKit = PhoneNumberUtil.createInstance(context) val number = phoneNumberKit.parse(this, region) if (!phoneNumberKit.isValidNumber(number)) return null return phoneNumberKit.format(number, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)
Функции для работы с бандлами:
inline fun <reified T: Any> Activity.getValue(lable: String, defaultvalue: T? = null) = lazy{ val value = intent?.extras?.get(lable) if (value is T) value else defaultvalue}inline fun <reified T: Any> Activity.getValueNonNull(lable: String, defaultvalue: T? = null) = lazy{ val value = intent?.extras?.get(lable) requireNotNull((if (value is T) value else defaultvalue)){lable}}inline fun <reified T: Any> Fragment.getValue(lable: String, defaultvalue: T? = null) = lazy { val value = arguments?.get(lable) if (value is T) value else defaultvalue}inline fun <reified T: Any> Fragment.getValueNonNull(lable: String, defaultvalue: T? = null) = lazy { val value = arguments?.get(lable) requireNotNull(if (value is T) value else defaultvalue) { lable }}
Функции для извлечения ресурсов:
fun Int.asColor() = ContextCompat.getColor(ApplicationCalss.instance, this)fun Int.asDrawable() = ContextCompat.getDrawable(MavrikApplication.instance, this)
Показ диалогов и сообщений:
fun Context.showAlertDialog(positiveButtonLable: String = getString(R.string.okay), title: String = getString(R.string.app_name), message: String, actionOnPositveButton: () -> Unit) { val builder = AlertDialog.Builder(this) .setTitle(title) .setMessage(message) .setCancelable(false) .setPositiveButton(positiveButtonLable) { dialog, id -> dialog.cancel() actionOnPositveButton() } val alert = builder.create() alert?.show()}fun Context.showShotToast(message: String){ Toast.makeText(this, message, Toast.LENGTH_SHORT).show()}fun Context.showLongToast(message: String){ Toast.makeText(this, message, Toast.LENGTH_LONG).show()}fun View.showShotSnackbar(message: String){ Snackbar.make(this, message, Snackbar.LENGTH_SHORT).show()}fun View.showLongSnackbar(message: String){ Snackbar.make(this, message, Snackbar.LENGTH_LONG).show()}fun View.snackBarWithAction(message: String, actionlable: String, block: () -> Unit){ Snackbar.make(this, message, Snackbar.LENGTH_LONG) .setAction(actionlable) { block() }}
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
1 год9300 р. |
1 месяц870 р. |
Я уже участник «Xakep.ru»
Читайте также
Последние новости