Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách hiển thị ProgressDialog trước khi khởi động Activity trên Android bằng Kotlin

Giới thiệu

Ví dụ minh họa hiển thị ProgressDialog (hộp thoại tiến trình) trước khi chuyển sang Activity khác, sử dụng AsyncTask để mô phỏng tác vụ nền. Lưu ý: ProgressDialog và AsyncTask đã deprecated, bài viết kèm giải pháp hiện đại.

Các bước thực hiện

Bước 1: Tạo dự án mới

Android Studio > File > New Project.

Bước 2: Layout (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="70dp"
        android:background="#008080"
        android:padding="5dp"
        android:text="TutorialsPoint"
        android:textColor="#fff"
        android:textSize="24sp"
        android:textStyle="bold" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Hiển thị ProgressDialog trước khi bắt đầu Activity"
        android:textAlignment="center"
        android:textColor="@android:color/holo_blue_bright"
        android:textSize="24sp"
        android:textStyle="bold" />

</RelativeLayout>

Bước 3: MainActivity.kt (Cách cũ - Deprecated)

import android.app.ProgressDialog
import android.os.AsyncTask
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

@Suppress("DEPRECATION")
class MainActivity : AppCompatActivity() {
    private lateinit var progressDialog: ProgressDialog

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"

        progressDialog = ProgressDialog(this).apply {
            setTitle("Đang tải nội dung")
            progress = 10
            max = 100
            setMessage("Loading...")
        }

        MyTask(this).execute()
    }

    companion object {
        class MyTask(private val mainActivity: MainActivity) : AsyncTask<Void, Void, Void>() {
            override fun doInBackground(vararg params: Void?): Void? {
                Thread.sleep(3000) // Giả lập tác vụ nặng 3 giây
                return null
            }

            override fun onPreExecute() {
                mainActivity.progressDialog.show()
            }

            override fun onPostExecute(result: Void?) {
                mainActivity.progressDialog.dismiss()
                // Chuyển sang Activity mới ở đây nếu cần
            }
        }
    }
}

Bước 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.progressdialog">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Cách hiện đại (Khuyến nghị)

Thay vì ProgressDialog + AsyncTask, hãy dùng:

  • Coroutines + Flow / StateFlow cho tác vụ nền.
  • ProgressBar trong layout (thay vì dialog modal) hoặc MaterialDialog từ thư viện Material Components.
  • ViewModel + LiveData / StateFlow để quản lý trạng thái loading.

Ví dụ hiện đại với Coroutines & ProgressBar

// Trong ViewModel
class MainViewModel : ViewModel() {
    val _uiState = MutableStateFlow(UiState.Loading)
    val uiState: StateFlow = _uiState

    fun loadData() {
        viewModelScope.launch {
            _uiState.value = UiState.Loading
            try {
                val data = repository.fetchData() // suspend function
                _uiState.value = UiState.Success(data)
            } catch (e: Exception) {
                _uiState.value = UiState.Error(e.message)
            }
        }
    }
}

sealed interface UiState {
    data class Loading : UiState
    data class Success(val data: String) : UiState
    data class Error(val message: String?) : UiState
}

// Trong Activity/Fragment
lifecycleScope.launch {
    viewModel.uiState.collect { state ->
        when (state) {
            is UiState.Loading -> progressBar.visibility = View.VISIBLE
            is UiState.Success -> {
                progressBar.visibility = View.GONE
                // Cập nhật UI với state.data
            }
            is UiState.Error -> {
                progressBar.visibility = View.GONE
                // Hiển thị lỗi
            }
        }
    }
    viewModel.loadData()
}

Chạy ứng dụng

Chạy app, ProgressDialog sẽ hiện ra "Loading..." trong 3 giây rồi tự tắt (cách cũ). Với cách hiện đại, UI sẽ mượt mà hơn, hỗ trợ rotation, lifecycle-aware.