Kotlin | Вопросы собесов
2.57K subscribers
28 photos
961 links
Download Telegram
🤔 К каким событиям привязаны методы Activity ?

🟠`onCreate(Bundle savedInstanceState)`
Создание активности. Вызывается при создании активности. Здесь инициализируются основные компоненты (например, настройка пользовательского интерфейса).

🟠`onStart()`
Активность становится видимой для пользователя. Вызывается после onCreate и каждый раз, когда активность становится видимой.

🟠`onResume()`
Активность становится доступной для взаимодействия с пользователем. Вызывается после onStart и каждый раз, когда активность возвращается на передний план (например, после паузы).

🟠`onPause()`
Активность перестает быть доступной для взаимодействия. Вызывается, когда активность переходит в состояние паузы (например, при открытии новой активности или диалога).

🟠`onStop()`
Активность становится невидимой для пользователя. Вызывается, когда активность больше не видна (например, при переходе к другой активности).

🟠`onDestroy()`
Уничтожение активности. Вызывается перед окончательным уничтожением активности. Здесь освобождаются ресурсы.

🟠`onRestart()`
Активность снова становится активной после остановки. Вызывается после onStop, перед onStart.

🟠`onSaveInstanceState(Bundle outState)`
Сохранение состояния активности. Вызывается перед уничтожением активности для сохранения ее текущего состояния.

🟠`onRestoreInstanceState(Bundle savedInstanceState)`
Восстановление состояния активности. Вызывается после onStart, если активность была ранее уничтожена и существует сохраненное состояние.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Чем launch отличается от async/await?

Функция launch в Kotlin Coroutines используется для запуска новой сопрограммы, которая выполняется параллельно остальному коду, и не блокирует поток, в котором она была вызвана. Результатом launch является Job, который представляет собой ссылку на сопрограмму.
Async используется для запуска сопрограммы, которая возвращает Deferred — промис для результата. Await используется для получения этого результата, при этом ожидание результата suspend'ит (приостанавливает) текущую сопрограмму до его получения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4
🤔 Почему нужен отдельный колбек на создание UI у фрагмента ?

🟠Разделение логики создания и инициализации UI
Фрагменты предназначены для повторного использования интерфейса и логики. Разделение методов onCreate и onCreateView позволяет разделить код, связанный с настройкой фрагмента, и код, связанный с созданием и настройкой пользовательского интерфейса.
onCreate: Используется для выполнения общей логики фрагмента, такой как инициализация переменных, настройка адаптеров и других объектов, которые не зависят от представления.
onCreateView: Используется для создания и настройки пользовательского интерфейса фрагмента, включая инфлейтинг макета и инициализацию виджетов.

🟠Поддержка разных макетов для разных устройств и ориентаций
Фрагменты могут использоваться в разных макетах для разных устройств (например, планшеты и телефоны) или ориентаций экрана (портретный и ландшафтный режимы). Использование onCreateView позволяет гибко создавать и настраивать пользовательский интерфейс в зависимости от текущей конфигурации устройства.

🟠Повторное использование фрагментов
Фрагменты могут быть добавлены или заменены динамически в различных контейнерах активностей. Метод onCreateView позволяет гибко создавать интерфейс каждый раз, когда фрагмент добавляется или заменяется.
class MyFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Инициализация логики фрагмента, например, настройка адаптера
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Инфлейтинг макета для фрагмента
val view = inflater.inflate(R.layout.fragment_layout, container, false)
// Инициализация элементов пользовательского интерфейса
val textView: TextView = view.findViewById(R.id.textView)
textView.text = "Hello, World!"
return view
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Расскажи как существуют и к чему привязаны фрагменты в Activity.

Фрагменты в Android — это компоненты приложения, которые могут быть добавлены в Activity для создания модульного интерфейса. Фрагменты жизненно привязаны к Activity, которая выступает как хост для них. Они имеют собственный жизненный цикл, который тесно связан с жизненным циклом своей родительской Activity. Фрагменты можно добавлять, удалять и заменять во время выполнения приложения, что делает их идеальными для адаптивных и динамических пользовательских интерфейсов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🤔 Каким образом ты выбираешь layout ?

Выбор макета для фрагмента осуществляется в методе onCreateView с помощью LayoutInflater
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_example, container, false)
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3👍1
🤔 Расскажи, про какие структуры данных знаешь.

Я знаю о многих структурах данных, включая массивы, связные списки (односвязные и двусвязные), стеки, очереди, деревья (бинарные, AVL, красно-черные), хеш-таблицы, графы, кучи (минимальные и максимальные), и более сложные структуры, такие как B-деревья и префиксные деревья (трие). Каждая структура данных имеет свои особенности и используется в зависимости от требований к алгоритму и операциям, которые необходимо оптимизировать.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
🤔 Какой layout выбрать для списка из большого количества элементов?

Для списка из большого количества элементов следует использовать RecyclerView. Это наиболее эффективный и рекомендуемый компонент для отображения больших данных в виде списка или сетки в Android.

🚩Почему именно его?

🟠Производительность
RecyclerView использует механизм повторного использования (рециклинга) элементов, что значительно повышает производительность при работе с большими наборами данных.

🟠Гибкость
Поддержка различных компоновок через LayoutManager (например, LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager).

🟠Анимации
Простая интеграция анимаций для добавления, удаления и перемещения элементов.

🟠Декораторы
Возможность добавления специальных эффектов и декораций, таких как разделители и отступы.

🚩Пример использования

1⃣Добавьте RecyclerView в XML макет
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>


2⃣Создайте адаптер для RecyclerView
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> data;

public MyAdapter(List<String> data) {
this.data = data;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String item = data.get(position);
holder.textView.setText(item);
}

@Override
public int getItemCount() {
return data.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView textView;

public ViewHolder(View view) {
super(view);
textView = view.findViewById(R.id.textView);
}
}
}


3⃣Настройте RecyclerView в Activity или Fragment
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

List<String> data = new ArrayList<>();
for (int i = 0; i < 100; i++) {
data.add("Item " + i);
}

MyAdapter adapter = new MyAdapter(data);
recyclerView.setAdapter(adapter);
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5😁4
🤔 Что означает в Android-разработке подход Single Activity?

Single Activity — это архитектурный подход в Android, при котором используется одна активность (Activity) как единственный контейнер для всего пользовательского интерфейса приложения. Вместо множества активностей используются фрагменты (Fragments), которые управляют различными частями пользовательского интерфейса внутри этой единственной активности. Этот подход облегчает управление жизненным циклом и навигацию внутри приложения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Forwarded from Идущий к IT
Твое резюме на HeadHunter — ОК, если ты видишь это.

HeadHunter сравнивает ключевые навыки в твоем резюме и в вакансии и в момент отклика отображает, насколько % ты соответствуешь требованиям.

Специальный бейджик «Подходит по навыкам на 100%» отображается, если соответствие составляет более 60%.

Если при просмотре вакансий ты видишь такой бейджик, это значит, что список навыков в твоем резюме качественно составлен.

Это важный параметр, так как рекрутерам чаще показываются резюме с лучшим соответствием.

О том, как правильно указывать ключевые навыки и оптимизировать свое резюме я уже рассказывал в этом видео
🤔 Что позволяет делать ItemDecoration ?

ItemDecoration в RecyclerView позволяет добавлять украшения (декорации) к элементам списка. Это может включать в себя отступы, разделительные линии, рамки и любые другие визуальные элементы, которые не являются частью содержимого элементов списка.

🚩Основные возможности

🟠Добавление отступов
Вы можете добавлять отступы (margin) между элементами списка, чтобы улучшить визуальное разделение.
🟠Рисование разделительных линий
Легко добавлять разделительные линии между элементами списка, что делает его более читаемым.
🟠Настройка фона для отдельных элементов
Позволяет рисовать фоновые элементы, такие как цветные блоки или изображения, за элементами списка.

🚩Пример использования `ItemDecoration`

Добавление разделительных линий между элементами
class DividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() {

private val divider: Drawable? = ContextCompat.getDrawable(context, R.drawable.line_divider)

override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
val left = parent.paddingLeft
val right = parent.width - parent.paddingRight

val childCount = parent.childCount
for (i in 0 until childCount - 1) {
val child = parent.getChildAt(i)
val params = child.layoutParams as RecyclerView.LayoutParams

val top = child.bottom + params.bottomMargin
val bottom = top + (divider?.intrinsicHeight ?: 0)

divider?.setBounds(left, top, right, bottom)
divider?.draw(c)
}
}
}


Применение ItemDecoration в RecyclerView
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = MyAdapter(data)
recyclerView.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))


Добавление отступов между элементами
class SpacesItemDecoration(private val space: Int) : RecyclerView.ItemDecoration() {

override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
outRect.left = space
outRect.right = space
outRect.bottom = space

// Добавляем верхний отступ только для первого элемента, чтобы избежать двойного отступа между элементами
if (parent.getChildAdapterPosition(view) == 0) {
outRect.top = space
}
}
}


Применение SpacesItemDecoration в RecyclerView
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = MyAdapter(data)
recyclerView.addItemDecoration(SpacesItemDecoration(16)) // 16 пикселей отступа


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁1
🤔 Расскажи data классы и sealed классы

`Data` классы в Kotlin предназначены для хранения данных и автоматически генерируют методы `equals()`, `hashCode()`, `toString()`, а также `copy()`, что упрощает работу с ними. `Sealed` классы представляют ограниченные иерархии наследования, где все возможные подклассы известны на этапе компиляции, что удобно для обработки фиксированных наборов типов. В сочетании, `data` и `sealed` классы помогают создавать типобезопасные и легко управляемые структуры данных, особенно для использования в `when` выражениях.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
🤔 Как в RecyclerView делаются анимации ?

DefaultItemAnimator для стандартных анимаций
recyclerView.setItemAnimator(new DefaultItemAnimator());


Custom ItemAnimator для пользовательских анимаций
public class CustomItemAnimator extends DefaultItemAnimator {
@Override
public boolean animateRemove(RecyclerView.ViewHolder holder) {
holder.itemView.animate().alpha(0).setDuration(300).start();
return super.animateRemove(holder);
}
}
recyclerView.setItemAnimator(new CustomItemAnimator());


Анимации в Adapter для анимаций элементов
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemView.setAlpha(0);
holder.itemView.animate().alpha(1).setDuration(500).start();
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1👀1
🤔 Расскажи про data классы и sealed классы

Data-классы в Kotlin предназначены для хранения данных и автоматически создают полезные методы, такие как `equals()`, `hashCode()`, `toString()`, а также методы для копирования объектов. Они удобны для представления сущностей с полями, которые нужно сравнивать, копировать или выводить, например, записи в базе данных. Sealed-классы (запечатанные классы) ограничивают наследование, позволяя создавать иерархии с фиксированным набором подклассов, что полезно для работы с типами, набор которых известен на этапе компиляции.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
🤔 Как в Android можно сделать анимацию ?

🟠Property Animations
Используйте ObjectAnimator для анимации свойств объектов.
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 0f, 100f);
animation.setDuration(1000);
animation.start();


🟠View Animations
Используйте XML-анимации для представлений. XML-анимация (res/anim/slide_in.xml)
<translate xmlns:android="https://schemas.android.com/apk/res/android"
android:fromXDelta="100%p"
android:toXDelta="0"
android:duration="500" />


Применение анимации
Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_in);
view.startAnimation(animation);


🟠Drawable Animations
Используйте анимации кадров для изображений. Анимация кадров (res/drawable/animation.xml)
<animation-list xmlns:android="https://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/frame1" android:duration="50" />
<item android:drawable="@drawable/frame2" android:duration="50" />
</animation-list>


Применение анимации
ImageView imageView = findViewById(R.id.imageView);
imageView.setBackgroundResource(R.drawable.animation);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
animationDrawable.start();


🟠MotionLayout
Используйте MotionLayout для сложных анимаций. XML (res/layout/activity_main.xml)
<androidx.constraintlayout.motion.widget.MotionLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/scene">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/image" />
</androidx.constraintlayout.motion.widget.MotionLayout>


MotionScene (res/xml/scene.xml)
<MotionScene xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto">
<Transition app:constraintSetStart="@+id/start" app:constraintSetEnd="@+id/end" app:duration="1000">
<OnSwipe app:dragDirection="dragUp" app:touchAnchorId="@+id/imageView" />
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint android:id="@+id/imageView" app:layout_constraintTop_toTopOf="parent" />
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint android:id="@+id/imageView" app:layout_constraintBottom_toBottomOf="parent" />
</ConstraintSet>
</MotionScene>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 В каком потоке запускается самый обычный сервис

Самый обычный сервис в Android запускается в основном (главном) потоке приложения. Это означает, что для операций, требующих длительного времени, необходимо запускать дополнительные потоки, чтобы не блокировать UI и не вызывать ANR (Application Not Responding). Для фоновых задач лучше использовать IntentService или управлять потоками вручную.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
🤔 Что такое Jetpack ?

Это набор библиотек, инструментов и рекомендаций от Google, предназначенных для упрощения разработки высококачественных Android-приложений. Jetpack помогает разработчикам следовать лучшим практикам, сокращает количество шаблонного кода и делает разработку проще и быстрее.

🚩Основные компоненты Jetpack

🟠Foundation (Основы)
AppCompat: Обратная совместимость с более старыми версиями Android.
Android KTX: Расширения для упрощения написания кода на Kotlin.
Multidex: Поддержка многодексных APK.

🟠Architecture (Архитектура)
LiveData: Компонент для наблюдения за изменениями данных.
ViewModel: Управление данными UI с учётом жизненного цикла.
Room: Библиотека для работы с базой данных SQLite с использованием объектов.
WorkManager: Управление фоновыми задачами с учетом условий выполнения.

🟠Behavior (Поведение)
Navigation: Упрощает навигацию и управление фрагментами.
Paging: Загрузка данных постранично.
DataStore: Современная и более гибкая альтернатива SharedPreferences.
CameraX: Упрощение работы с камерой.

🟠UI (Пользовательский интерфейс):
RecyclerView: Эффективное отображение больших списков.
Fragment: Управление фрагментами.
ConstraintLayout: Современный способ создания гибких и сложных макетов.
Jetpack Compose: Современная декларативная библиотека для создания UI.

🚩Преимущества Jetpack

Ускоренная разработка
Jetpack снижает количество шаблонного кода, что ускоряет процесс разработки.
Поддержка лучших практик
Библиотеки Jetpack созданы с учётом лучших практик Android-разработки.
Совместимость
Многие библиотеки Jetpack поддерживают обратную совместимость, что позволяет использовать их на более старых версиях Android.
Обратная совместимость и обновления
Библиотеки обновляются через Google Play, что позволяет использовать последние версии без обновления всей системы.

// ViewModel class
class MyViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> get() = _data

fun updateData(newData: String) {
_data.value = newData
}
}

// Fragment or Activity
class MyFragment : Fragment() {
private lateinit var viewModel: MyViewModel

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_my, container, false)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

viewModel.data.observe(viewLifecycleOwner, Observer { newData ->
// Обновление UI
})

return view
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
🤔 Какие есть особенности использования Nothing в дженериках

Nothing в Kotlin используется как нижняя граница для дженериков, что означает, что он совместим с любым типом, но не может иметь значений. Это позволяет указывать, что функция или выражение не возвращают никакого значения, например, в случае исключений или бесконечного цикла. Nothing удобно использовать в дженериках для создания функций, которые гарантированно завершат выполнение программы или выбросят исключение.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍2
🤔 Какие библиотеки есть в Architecture Components ?

🟠ViewModel
Управляет данными UI с учётом жизненного цикла.
class MyViewModel : ViewModel() {
val data: MutableLiveData<String> = MutableLiveData()
}


🟠LiveData
Наблюдаемые данные, автоматически обновляющиеся при изменениях.
val data: LiveData<String> = viewModel.data
data.observe(this, Observer { value ->
// Обновление UI
})


🟠Room
Работа с базой данных SQLite.
@Entity
data class User(@PrimaryKey val uid: Int, val firstName: String?, val lastName: String?)

@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>

@Insert
fun insertAll(vararg users: User)
}

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}


🟠WorkManager
Управление фоновыми задачами.
val uploadWorkRequest: WorkRequest = OneTimeWorkRequestBuilder<UploadWorker>().build()
WorkManager.getInstance(context).enqueue(uploadWorkRequest)


🟠Data Binding
Привязка данных к элементам UI.
<layout xmlns:android="https://schemas.android.com/apk/res/android">
<data>
<variable name="viewModel" type="com.example.MyViewModel" />
</data>
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.data}" />
</LinearLayout>
</layout>


🟠Paging
Постраничная загрузка данных.
val pager = Pager(PagingConfig(pageSize = 20)) {
UserPagingSource()
}.flow.cachedIn(viewModelScope)


🟠Navigation
Навигация между компонентами приложения.
<fragment
android:id="@+id/firstFragment"
android:name="com.example.FirstFragment">
<action
android:id="@+id/action_firstFragment_to_secondFragment"
app:destination="@id/secondFragment" />
</fragment>


🟠DataStore
Современное хранилище данных.
val dataStore: DataStore<Preferences> = context.createDataStore(name = "settings")
val exampleCounter = dataStore.data.map { preferences -> preferences[EXAMPLE_COUNTER] ?: 0 }


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Чем launch отличается от async/await

В Kotlin launch и async — это функции для запуска корутин, но они отличаются по назначению и возвращаемому значению. launch запускает корутину, но не возвращает результат, обычно используется для выполнения фоновой работы без ожидания результата, например, обновления UI. async, напротив, возвращает Deferred объект, который можно ожидать с помощью await, и предназначен для получения результата вычислений, что полезно для асинхронных операций с возвращаемым значением.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3
🤔 Использовал Data Binding ?

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

1⃣Включите Data Binding в вашем проекте
Добавьте в файл build.gradle модуля
android {
...
viewBinding {
enabled = true
}
}


2⃣Создайте макет с использованием Data Binding
В макете XML добавьте корневой элемент <layout> и определите переменные данных:
<!-- res/layout/activity_main.xml -->
<layout xmlns:android="https://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="com.example.MyViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.text}" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> viewModel.onButtonClick()}"
android:text="Click Me" />
</LinearLayout>
</layout>


3⃣Настройте ViewModel
Создайте ViewModel для управления данными:
// MyViewModel.kt
package com.example

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
private val _text = MutableLiveData("Hello, Data Binding!")
val text: LiveData<String> get() = _text

fun onButtonClick() {
_text.value = "Button Clicked!"
}
}


4⃣Настройте Activity
Инициализируйте Data Binding в вашей Activity и свяжите ViewModel с макетом:
// MainActivity.kt
package com.example

import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.example.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.lifecycleOwner = this
binding.viewModel = viewModel
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2