Sobes.tech
Middle

Android-də istifadəçi interfeysi ilə işləməni düzgün təşkil etmək necədir?

sobes.tech Süni İntellekt

AI-dan cavab

Android-də istifadəçi interfeysi ilə işləmək üçün Google-un memarlıq prinsiplərinə və tövsiyələrinə riayət etmək lazımdır.

Əsas komponentlər və yanaşmalar:

  • Activity/Fragment: İstifadəçi qarşılıqlı əlaqəsi üçün giriş nöqtələridir, təqdimat logikasını (View) ehtiva edir.

  • View Binding/Data Binding: UI elementlərinə daha təhlükəsiz və rahat giriş üçün mexanizmlər, kod miqdarını və potensial səhvləri azaldır. Sadə hallarda View Binding, daha mürəkkəb ssenarilərdə isə Data Binding tövsiyə olunur, burada məlumatlar birbaşa layout-a bağlanır.

    <!-- res/layout/activity_main.xml (View Binding nümunəsi) -->
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/textViewHello"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello, World!" />
    
        <Button
            android:id="@+id/buttonClick"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Click Me" />
    </LinearLayout>
    
    // MainActivity.kt (View Binding nümunəsi)
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import com.example.myapp.databinding.ActivityMainBinding
    
    class MainActivity : AppCompatActivity() {
    
        private lateinit var binding: ActivityMainBinding
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    
            binding.buttonClick.setOnClickListener {
                binding.textViewHello.text = "Button Clicked!"
            }
        }
    }
    
  • ViewModel: Android Architecture Components-dən olan komponent, UI-ə aid məlumatların saxlanması və idarə olunması üçün, həyat dövrünü nəzərə alaraq. Activity dəyişikliklərindən sonra məlumatların itirilməsinin qarşısını alır.

    // MyViewModel.kt
    import androidx.lifecycle.MutableLiveData
    import androidx.lifecycle.ViewModel
    
    class MyViewModel : ViewModel() {
        val counter = MutableLiveData<Int>().apply { value = 0 }
    
        fun incrementCounter() {
            counter.value = (counter.value ?: 0) + 1
        }
    }
    
  • LiveData/StateFlow/Flow: Həyat dövrü ilə inteqrasiya olunmuş müşahidə olunan məlumat tutucuları. UI-də məlumatlar dəyişdikdə avtomatik yenilənir və yaddaş sızmalarını qarşısını alır. LiveData çox vaxt ViewModel ilə birlikdə istifadə olunur. StateFlow və Flow (Kotlin Coroutines-dən) daha güclü reaktiv proqramlaşdırma imkanları təqdim edir.

    LiveData və ViewModel ilə nümunə:

    // MainActivity.kt (davamı, ViewModel və LiveData ilə)
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import androidx.activity.viewModels
    import androidx.lifecycle.Observer
    import com.example.myapp.databinding.ActivityMainBinding
    
    class MainActivity : AppCompatActivity() {
    
        private lateinit var binding: ActivityMainBinding
        private val viewModel: MyViewModel by viewModels()
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    
            viewModel.counter.observe(this, Observer { count ->
                binding.textViewHello.text = "Counter: $count"
            })
    
            binding.buttonClick.setOnClickListener {
                viewModel.incrementCounter()
            }
        }
    }
    
  • Memarlıq nümunələri (MVVM, MVI): Məsuliyyətləri komponentlər arasında bölür. MVVM (Model-View-ViewModel) Google tərəfindən ən çox tövsiyə olunan nümunədir, burada View ViewModel-dəki dəyişiklikləri izləyir, ViewModel isə Model (məlumat mənbələri) ilə əlaqə saxlayır. MVI (Model-View-Intent) isə tək istiqamətli məlumat axınına əsaslanan alternativ yanaşmadır.

  • UI Toolkit (View System və ya Jetpack Compose): View System ənənəvi imperativ UI sistemidir. Jetpack Compose isə müasir, deklarativ UI alətidir, mürəkkəb interfeyslərin yaradılmasını asanlaşdırır.

    // Jetpack Compose nümunəsi
    import android.os.Bundle
    import androidx.activity.ComponentActivity
    import androidx.activity.compose.setContent
    import androidx.compose.foundation.layout.Column
    import androidx.compose.material.Button
    import androidx.compose.material.Text
    import androidx.compose.runtime.*
    import androidx.compose.ui.graphics.Color
    import androidx.compose.ui.tooling.preview.Preview
    
    class ComposeActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContent {
                Greeting("Compose World")
            }
        }
    }
    
    @Composable
    fun Greeting(name: String) {
        var count by remember { mutableStateOf(0) }
    
        Column {
            Text(text = "Hello $name! Counter: $count")
            Button(onClick = { count++ }) {
                Text("Increment")
            }
        }
    }
    
    @Preview(showBackground = true)
    @Composable
    fun DefaultPreview() {
        Greeting("Compose Preview")
    }
    
  • Axınların idarə olunması: Bütün UI ilə bağlı əməliyyatlar əsas (UI) axında həyata keçirilməlidir. Uzunmüddətli əməliyyatlar (şəbəkə sorğuları, verilənlər bazası ilə işləmək) fon axınlarına (məsələn, Coroutines, RxJava və ya standart ExecutorService istifadə etməklə) çıxarılmalı və nəticələr UI-nin yenilənməsi üçün əsas axına qaytarılmalıdır.

    // Coroutines nümunəsi
    import kotlinx.coroutines.*
    
    class MyRepository {
        suspend fun fetchData(): String = withContext(Dispatchers.IO) {
            // Uzunmüddətli əməliyyatın simulyasiyası
            delay(1000)
            "Background-dan məlumat"
        }
    }
    
    // ViewModel və ya Activity/Fragment-də (amma daha üstünən ViewModel-də)
    fun loadData() {
        viewModelScope.launch { // Activity/Fragment üçün lifecycleScope də istifadə edilə bilər
            val data = MyRepository().fetchData()
            // UI-nin müşahidə etdiyi LiveData-nı yeniləyir
            _dataLiveData.value = data
        }
    }
    
  • Hadisələrin işlənməsi: Düymələrə kliklər, mətn daxil etmə kimi hadisə dinləyicilərinin tətbiqi Activity/Fragment və ya View-də, biznes logikanın isə ViewModel-də delegasiyası.

  • Vəziyyətin idarə olunması: ViewModel, StateFlow və ya Compose-də MutableState istifadə edərək UI vəziyyətinin təhlükəsiz və proqnozlaşdırıla bilən idarə olunması.

Bu prinsiplərə riayət etmək miqyaslana bilən, dəstəklənən və səhvlərə davamlı tətbiqlər yaratmağa kömək edir. Konkret alətlərin seçimi (View System vs Compose, LiveData vs StateFlow) layihənin və komanda üstünlüklərinin əsasında olur. Google Jetpack Compose və Kotlin Coroutines-i aktiv şəkildə təşviq edir. Android Architecture Components (ViewModel, LiveData, Room) istifadə etmək isə standartdır.