간혹 통신을하다가 데이터를 수신받아 로드 될때 다른 버튼을 눌러 다른 작업이 되면 오류를 발생 할 수 있다
이를 방지하기 위해 프로그레스바를 이용해서 설정한 시간동안 다른 버튼이 눌리지 않도록 해줄 수 있다
그렇다면 통신이 다 되고나서 프로그레스바를 종료하게 되면 안전하게 데이터 로드가 가능해진다.
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();
}
}
'Android' 카테고리의 다른 글
[Android] QuickContactBadge를 사용해서 주소록 연락처 정보가져오기 (0) | 2024.08.13 |
---|---|
[JAVA][Android] 채팅중 키보드에 글자가 가려지는 경우 setStackFromEnd 사용 // RecyclerView 스크롤 키보드 가려지는경우 (2) | 2024.07.13 |
[JAVA][Android]안드로이드 interface 사용하기 (1) | 2024.06.07 |
안드로이드 네이버 로그인 API 자바 연결하기 /JAVA/Android/NaverLogin (1) | 2024.05.15 |
안드로이드 카카오 로그인 API 연결 / kakao Login API (5) | 2024.05.14 |