Kotlin: Разница между app.R и com.google.android.material.R

Разработчики Android нередко сталкиваются с путаницей относительно использования различных версий класса R, особенно когда речь идет о доступе к ресурсам своего приложения и сторонних библиотек. Эта статья поможет разобраться в разнице между app.R и com.google.android.material.R, а также научит правильно обращаться к нужным ресурсам.

Что такое классы R?


Класс R представляет собой специальную структуру, автоматически создаваемую Android Studio во время процесса сборки проекта. Он служит контейнером ссылок на ресурсы вашего приложения (изображения, цвета, стили, макеты и т.д.). Каждый ресурс автоматически получает уникальный числовой идентификатор, хранящийся в соответствующих полях класса R.

Классы R бывают двух типов:
  • Ваш собственный класс R, называемый app.R, соответствует ресурсам вашего проекта.
  • Класс R сторонней библиотеки, обозначаемый именем пакета библиотеки (например, com.google.android.material.R), содержит ссылки на ресурсы конкретной внешней библиотеки.

app.R


Что это?Это...

PHP: Как определить тип HTTP-запроса (POST или GET)

Определить тип HTTP-запроса (POST или GET) в PHP можно несколькими способами:

Основные способы определения метода запроса



Использование суперглобального массива $_SERVER
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'GET') {
    // Обработка GET-запроса
} elseif ($method === 'POST') {
    // Обработка POST-запроса
}

Использование константы PHP_SAPI (менее надёжный способ)
if (php_sapi_name() === 'cgi-fcgi' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    // POST-запрос
}

Через функцию filter_input
$method = filter_input(INPUT_SERVER, 'REQUEST_METHOD');

Практическое применение


switch ($_SERVER['REQUEST_METHOD']) {
    case 'GET':
        // Обработка GET-запроса
        $data = $_GET;
        break;
    
    case 'POST':
        // Обработка POST-запроса
        $data = $_POST;
        break;
    
    default:
        http_response_code(405); // Метод не разрешён
        echo 'Метод запроса не
...

Kotlin: Корутины (coroutines)

Корутины (coroutines) — это механизм в Kotlin, который позволяет писать асинхронный и неблокирующий код в стиле синхронного программирования. Корутины упрощают работу с асинхронными задачами, такими как сетевые запросы, работа с базами данных и другие длительные операции, без необходимости использования сложных конструкций, таких как коллбэки или потоки.

Основные особенности корутин



Асинхронность: Корутины позволяют выполнять длительные операции асинхронно, не блокируя основной поток.

Неблокирующий код: Корутины могут приостанавливаться и возобновляться без блокировки потока, что делает их эффективными для выполнения длительных операций.

Легкость в использовании: Корутины позволяют писать асинхронный код в стиле синхронного программирования, что упрощает чтение и понимание кода.

Пример использования корутин
import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Start")

    // Запуск корутины
    launch {
        delay(2000) // Приостановка корутины на 2
...

Kotlin: Как осуществляется переход от списка к ID (Использование XML макетов)

Для примера возьмём список чатов и один чат, к которому будем писать код, чтобы перейти.

Для реализации перехода между списком чатов и конкретным чатом в Kotlin/Android, можно использовать следующий подход:

Список чатов (ChatListActivity/Fragment):
// При клике на элемент списка
chatList.setOnItemClickListener { parent, view, position, id ->
    val chatId = chatList[position].id // Получаем id чата
    
    // Создаем Intent для перехода
    val intent = Intent(this, ChatActivity::class.java)
    intent.putExtra("chat_id", chatId) // Передаем id чата
    startActivity(intent)
}

Activity/Fragment чата (ChatActivity):
class ChatActivity : AppCompatActivity() {
    private var chatId: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_chat)

        // Получаем переданный id чата
        chatId = intent.getIntExtra("chat_id", 0)

        // Теперь
...

PHP: Как определить поворот изображения с помощью exif_read_data()

Что такое EXIF и зачем он нужен


EXIF (Exchangeable Image File Format) — это стандарт, позволяющий добавлять к изображениям и другим файлам метаданные: информацию о камере, настройках съёмки, дате, геолокации и ориентации снимка.

Эти данные записываются камерой или смартфоном при создании фото и могут быть прочитаны специальными инструментами, в том числе PHP‑функцией exif_read_data().

Как EXIF хранит информацию о повороте


Ключевой параметр для определения поворота — поле Orientation (ориентация). Оно принимает значения от 1 до 8, каждое из которых описывает определённое положение камеры при съёмке:
  • 1: нормальное положение (0°);
  • 3: повёрнуто на 180°;
  • 6: повёрнуто на 90° по часовой стрелке;
  • 8: повёрнуто на 90° против часовой стрелки.

Остальные значения (2, 4, 5, 7) описывают зеркальные повороты, которые встречаются реже.

Практический пример на PHP
Шаг 1. Чтение EXIF‑данных
Используйте функцию exif_read_data(), чтобы получить метаданные изображения:
$exifData =
...