본문 바로가기

Android

[JAVA][Android] ProgressBarLoad를 사용해 로딩 다이얼로그 만들기

간혹 통신을하다가 데이터를 수신받아 로드 될때 다른 버튼을 눌러 다른 작업이 되면 오류를 발생 할 수 있다

이를 방지하기 위해 프로그레스바를 이용해서 설정한 시간동안 다른 버튼이 눌리지 않도록 해줄 수 있다

그렇다면 통신이 다 되고나서 프로그레스바를 종료하게 되면 안전하게 데이터 로드가 가능해진다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="프로그레스바가 진행되는 동안 터치가 되는지 테스트해보세요"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/start_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="프로그레스바 시작"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="터치테스트"
        app:layout_constraintBottom_toBottomOf="@+id/start_button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="@+id/start_button"
        app:layout_constraintVertical_bias="0.0" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

progress_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:layout_marginStart="40dp"
        android:indeterminateTint="@color/black"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.477" />

    <TextView
        android:id="@+id/loadingText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="잠시만 기다려주세요!! ..."
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="@+id/progressBar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/progressBar"
        app:layout_constraintTop_toTopOf="@+id/progressBar" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

MainActitvity

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button start_btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        start_btn = findViewById(R.id.start_button);
        ProgressBarLoad progressBarLoad = new ProgressBarLoad(this);
        // ex) 서버에 통신 요청
        start_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressBarLoad.showDialog(5000);
                // 5초 동안 프로그레스바를 통해 5초동안 로딩상태를 표현 할 수 있습니다.
            }
        });
        // 통신부분에서 서버에 데이터를 요청할때 프로그레스바를 실행하고
        // 데이터가 수신되어 로드가 될때 프로그레스바를 종료하게 되면 서버에 요청할때 터치가 되어 오작동나는 오류를 줄일수가 있습니다.
        // ex ) 서버 데이터 수신 로드완료
        // progressBarLoad.dismissDialog(); -> 프로그레스바 종료
    }
}

ProgressBarLoad


import android.content.Context;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;

import androidx.appcompat.app.AlertDialog;

public class ProgressBarLoad {
    Context context;
    View view;
    AlertDialog.Builder builder;
    AlertDialog dialog;

    public ProgressBarLoad(Context context) {
        this.context = context;
        this.view = LayoutInflater.from(context).inflate(R.layout.progress_bar, null);
        this.builder = new AlertDialog.Builder(context);
        this.dialog = builder
                .setCancelable(false)
                .setTitle("로딩되는 동안 터치를 할 수 없습니다")
                .setView(view)
                .create();
    }

    public void showDialog(long second) {
        // 로딩
        dialog.show();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                dialog.dismiss();
            }
        }, second);
    }

    public void dismissDialog() {
        dialog.dismiss();
    }
}