ProgressDialog는 더 이상 사용되지 않습니다. 사용할 대체 대화 상자는 무엇입니까?


215

ProgressDialog더 이상 사용되지 않는 것을 보았습니다 . 무엇에서 떨어져 그 대신 사용할 수있는 대체 하나가 될 것입니다 ProgressBar. 안드로이드 스튜디오 버전 2.3.3을 사용하고 있습니다.

ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();

답변:


196

예, API level 26더 이상 사용되지 않습니다. 대신을 사용할 수 있습니다 progressBar.

프로그래밍 방식으로 작성하려면 다음을 수행하십시오.

먼저 루트 레이아웃에 대한 참조를 얻으십시오

RelativeLayout layout = findViewById(R.id.display);  //specify here Root layout Id

또는

RelativeLayout layout = findViewById(this);

그런 다음 진행률 표시 줄을 추가하십시오

progressBar = new ProgressBar(youractivity.this, null, android.R.attr.progressBarStyleLarge);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100, 100);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(progressBar, params);

진행률 표시 줄을 표시하려면

progressBar.setVisibility(View.VISIBLE);

진행률 표시 줄을 숨기려면

progressBar.setVisibility(View.GONE);

사용자 상호 작용을 비활성화하려면 다음 코드 만 추가하면됩니다.

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                           WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

사용자 상호 작용을 되 찾으려면 다음 코드를 추가하면됩니다.

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

나중에 참조 할 수 android.R.attr.progressBarStyleSmall있도록로 변경하십시오 android.R.attr.progressBarStyleHorizontal.

아래 코드는 위에서 만 작동합니다. API level 21

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

xml을 통해 작성하려면 다음을 수행하십시오.

<ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:max="100"
        android:backgroundTint="@color/white"
        android:layout_below="@+id/framelauout"
        android:indeterminateTint="#1a09d6"
        android:layout_marginTop="-7dp"/>

당신의 활동에서

progressBar = (ProgressBar) findViewById(R.id.progressbar);

진행률 표시 줄 표시 / 숨기기는 동일합니다

 progressBar.setVisibility(View.VISIBLE); // To show the ProgressBar 
 progressBar.setVisibility(View.INVISIBLE); // To hide the ProgressBar

다음은 그 모습에 대한 샘플 이미지입니다.

자세한 내용 :
1. 참조 1
2. 참조 2


마치 당신이 이것을 사용하는 것처럼 당신은 그렇습니다. 그래서 진보 대화는 더 이상 사용되지 않습니다. 그래서 나는 세상에 나의 잠재력을 보여줄 수 있습니다 : D, 농담, 자세한 답변에 대해 대단히 감사합니다.
Mohamed Hajr

1
그러나 Message ()를 어떻게 설정합니까?
reverie_ss


xml 코드를 "@android : color / white"로 업데이트하십시오
musterjunk

가로 막대를 얻으려면 다음을 사용하십시오. ProgressBar progressBar = new ProgressBar (youractivity.this, null, android.R.attr.progressBarStyleHorizontal); progressBar.setIndeterminate (true);
taranjeetsapra

44

당신은 사용할 수 있습니다 AlertDialogProgressDialog에 대한 코드 아래를 참조하십시오 ProgressDialog. 이 기능은 진행 대화 상자를 표시 할 때마다 호출해야합니다.

암호:

    public void setProgressDialog() {

    int llPadding = 30;
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.HORIZONTAL);
    ll.setPadding(llPadding, llPadding, llPadding, llPadding);
    ll.setGravity(Gravity.CENTER);
    LinearLayout.LayoutParams llParam = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    ll.setLayoutParams(llParam);

    ProgressBar progressBar = new ProgressBar(this);
    progressBar.setIndeterminate(true);
    progressBar.setPadding(0, 0, llPadding, 0);
    progressBar.setLayoutParams(llParam);

    llParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    TextView tvText = new TextView(this);
    tvText.setText("Loading ...");
    tvText.setTextColor(Color.parseColor("#000000"));
    tvText.setTextSize(20);
    tvText.setLayoutParams(llParam);

    ll.addView(progressBar);
    ll.addView(tvText);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setCancelable(true);
    builder.setView(ll);

    AlertDialog dialog = builder.create();
    dialog.show();
    Window window = dialog.getWindow();
    if (window != null) {
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        layoutParams.copyFrom(dialog.getWindow().getAttributes());
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        dialog.getWindow().setAttributes(layoutParams);
    }
}

산출:

여기에 이미지 설명을 입력하십시오


해제하는 방법?
Jay Dangar

1
BaseActivity와 같은 하나의 기본 클래스를 만든 다음이 코드를 추가 한 후 하나의 메소드 해제 대화 상자를 추가하십시오.하지만이를 위해서는 전역 적으로 'AlertDialog dialog'객체를 정의해야합니다.
Kishan Donga

그런 다음 숨기기 대화 상자 메서드 내에서 dialog.dismiss () 메서드를 호출하면됩니다.
Kishan Donga

1
모든 것이 정상이지만 화면 대화 상자의 아무 곳이나 탭하면 닫힙니다. 서비스 호출이 진행 중이고 고소 당하면 서비스를 닫고 ui가 좋지 않은 UI로 재생할 수 있습니다.
Vivek Kumar

당신은 그것을 취소 할 수는 없지만 장치를 회전하거나 분할 화면을 사용하면 어쨌든 닫히고 사용자는 준비되지 않은 UI와 상호 작용할 수 있습니다. 어쩌면 AlertDialog여기서 사용해서는 안됩니다.
Meow Cat 2012 년

30

이 클래스는 API 레벨 26에서 더 이상 사용되지 않습니다. ProgressDialog는 모달 대화 상자이므로 사용자가 앱과 상호 작용할 수 없습니다. 이 클래스를 사용하는 대신 앱의 UI에 포함 할 수있는 ProgressBar와 같은 진행률 표시기를 사용해야합니다. 또는 알림을 사용하여 사용자에게 작업 진행 상황을 알릴 수 있습니다. 링크

새로운 UI 표준으로 Android O인해 더 이상 사용되지 않습니다.Google


1
"이 클래스는 API 레벨 26에서 더 이상 사용되지 않습니다"는 날짜 대신 사용됩니다. 그들은 더 이상 사용하기를 원하지 않습니다. 예, 새로운 UI 표준 때문이지만 모든 API 수준에 적용됩니다.
creativecreatororor 수도

28
링크가 새로운 UI 표준을 만족 - "이 때문에 구글의 새로운 UI 표준의 안드로이드 O에서 사용되지 않는 것"
아제 S

22
더 이상 사용되지 않는 이유는 사용자 입력을 차단하기 때문입니까? 때로는 Google 엔지니어들이 어떤 종류의 파우더를 코로 골라 내는지 궁금합니다. 입력 컨트롤을 숨기거나 비활성화 한 다음 진행률 표시 줄을 활성화하는 것보다 차단 대화 상자를 사용하는 것이 훨씬 쉽습니다. 구글 측에서 어리석은 생각.
TheRealChx101

@ TheRealChx101 Android UI는 치명적인 오류로 인한 치명적인 오류를 방지하기 위해 사용자가 값 비싼 대안 비용으로 잘못된 자유를 느끼도록 설계되었습니다. 권한이 부여되고 이동 통신사가 Google에 지불 한 금액에 액세스 할 수 있고 액세스 할 수 없다고 말할 때까지 기다립니다.
버려진 카트

3
나는 그들이 모달 대화의 남용을 방지하는 데 더 관심이 있다고 생각합니다 : 때로는 사용자가 전혀 기다릴 필요가 없지만 다른 일을 계속할 수있는 상황에서 사용자가 작업이 끝날 때까지 기다리도록 표시됩니다 불필요하게 기다리게하면 사용자 경험이 저하됩니다. 그럼에도 불구하고 사용자에게는 선택의 여지가 없지만 작업이 완료되기를 기다리는 상황이 많이 있으므로 각 개발자가 자체적으로 구현하는 대신 더 이상 사용되지 않는 표준 방법이 필요하다는 데 동의합니다.
Fran Marzoa

26

진행률 표시 줄에 대한 XML 인터페이스를 디자인하고 AlertDialog 에보기로 전달 한 다음 언제든지 대화 상자를 표시하거나 닫을 수 있습니다.

progress.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:padding="13dp"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ProgressBar
        android:id="@+id/loader"
        android:layout_marginEnd="5dp"
        android:layout_width="45dp"
        android:layout_height="45dp" />
    <TextView
        android:layout_width="wrap_content"
        android:text="Loading..."
        android:textAppearance="?android:textAppearanceSmall"
        android:layout_gravity="center_vertical"
        android:id="@+id/loading_msg"
        android:layout_toEndOf="@+id/loader"
        android:layout_height="wrap_content" />

</LinearLayout>

진행률 대화 상자를 표시하는 코드 코드입니다. 이 코드를 복사하여 조각에 붙여 넣으십시오.

  AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
       private void setDialog(boolean show){
            builder.setView(R.layout.progress);
            Dialog dialog = builder.create();
            if (show)dialog.show();
            else dialog.dismiss();
        }

그런 다음 진행률 대화 상자를 표시 할 때마다 메소드를 호출하고 인수로 true를 전달하여 표시하거나 대화 상자를 닫으려면 false를 전달하십시오.


2
@Alok Rajasukumaran 그것은 당신이 활동을 사용하고있는 것처럼 보입니다, 단순히 this이것을 다음과 같이 바꾸십시오 AlertDialog.Builder builder = new AlertDialog.Builder(this);. 올바른 코드를 복사하고 있는지 확인하십시오.
DevMike01

1
layout_toEndOf하지 않기 때문에 제거 가능LinearLayout
Mark

21

ProgressBar는 매우 간단하고 사용하기 쉽습니다. 간단한 진행 대화 상자와 동일하게 만들려고합니다. 첫 번째 단계는 표시하려는 대화 상자의 xml 레이아웃을 만들 수 있다는 것입니다.

layout_loading_dialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="20dp">
    <ProgressBar
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:gravity="center"
        android:text="Please wait! This may take a moment." />
</LinearLayout>

다음 단계는 AlertBar를 생성하여 ProgressBar와 함께이 레이아웃을 보여줍니다.

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(false); // if you want user to wait for some process to finish,
builder.setView(R.layout.layout_loading_dialog);
AlertDialog dialog = builder.create();

이제 남은 것은 다음과 같은 클릭 이벤트에서이 대화 상자를 표시하고 숨기는 것입니다.

dialog.show(); // to show this dialog
dialog.dismiss(); // to hide this dialog

그리고 그것은 ProgressDialog 대신 ProgressBar를 구현하는 것이 매우 간단하고 쉽다는 것을 알 수 있듯이 작동합니다. 이제 Handler 또는 ASyncTask에서이 대화 상자를 표시 / 해제 할 수 있습니다.


변경하시기 바랍니다 progress_dialog.show();builder.show();. 감사합니다.
Matheus Miranda

2
에 나는 오른쪽에 AlertDialog 객체에 이름을 변경 한 show()/ dismiss(),하지만 난 두지 않은 builder.show()다음을 해제하기 때문에 우리가해야 할 것입니다 dialog.dismiss()종류 이해하기 쉽게 자신의 코드를 간단하게 유지하기 좋아하는 사람을 혼란의 인도 왜냐하면 객체를 builder.show()반환 하기 때문입니다. 그래서 AlertDialog우리는 그와 같이 참조를 저장해야합니다 . 어떤 객체에서는 리턴 하기가 더 쉬우 며, 그 객체를 사용하여 대화 상자를 표시하고 숨길 수 있습니다AlertDialog dialog = builder.show();dialog.dismiss()builder.create()AlertDialog
Syed Naeem

호출 스레드가 기본 UI 스레드가 아닌 경우 "runOnUiThread (new Runnable () {@Override public void run () {dialog.show/dismiss ();}});"를 사용할 수 있습니다. (WebView에서 호출 할 때 유용합니다-shouldoverride 메소드)
SHS

15

예, ProgressDialog는 더 이상 사용되지 않지만 Dialog는 사용되지 않습니다.

진행률 표시 줄 및 로딩 텍스트가 포함 된 고유 한 XML 파일을 대화 상자 객체에 부풀린 다음 show()dismiss()기능을 사용하여 표시하거나 숨길 수 있습니다. 다음은 예입니다 (코 틀린).

ProgressDialog 클래스 :

class ProgressDialog {
companion object {
    fun progressDialog(context: Context): Dialog{
        val dialog = Dialog(context)
        val inflate = LayoutInflater.from(context).inflate(R.layout.progress_dialog, null)
        dialog.setContentView(inflate)
        dialog.setCancelable(false)
        dialog.window!!.setBackgroundDrawable(
                ColorDrawable(Color.TRANSPARENT))
        return dialog
    }
  }
}

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:background="#fff"
android:padding="13dp"
android:layout_height="wrap_content">
<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="100dp"
    android:layout_margin="7dp"
    android:layout_height="100dp"
    android:layout_above="@+id/no_jobs_pickups"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_margin="7dp"
    android:layout_toEndOf="@+id/progressBar"
    android:text="Loading..." />
</RelativeLayout>

귀하의 코드에서 : 그냥 하십시오var dialog = ProgressDialog.progressDialog(context)

표시하려면 : dialog.show()

숨기려고: dialog.dismiss()


11

글쎄, 당신이 정말로 그들의 의지에 반대하고 싶다면, 당신은 여전히 Sweet Alert Dialog를 사용 하거나 직접 만들 수 있습니다.

progress_dialog_layout

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

    <TableRow
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="64dp" >

        <ProgressBar
            android:id="@+id/progressBar2"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />

        <TextView
            android:gravity="center|left"
            android:id="@+id/textView9"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textColor="@color/black"
            android:textSize="18sp"
            android:text="Downloading data. Please wait.." />
    </TableRow>
</RelativeLayout>

자바 코드 :

AlertDialog b;
AlertDialog.Builder dialogBuilder;

public void ShowProgressDialog() {
dialogBuilder = new AlertDialog.Builder(DataDownloadActivity.this);
LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            View dialogView = inflater.inflate(R.layout.progress_dialog_layout, null);
            dialogBuilder.setView(dialogView);
            dialogBuilder.setCancelable(false);
            b = dialogBuilder.create();
            b.show();
        }

        public void HideProgressDialog(){

            b.dismiss();
        }

2
프로덕션 환경에서 SweetAlertDialog에 대한 끔찍한 경험이 있었으며 창마다 누출 될 때 매우 조심하십시오.
Jeremy

나를 위해 HideProgress아무것도하지 않습니다.
Saeed Neamati

1
진행률 대화 상자를 표시하기 위해 라이브러리를 사용해야하는 이유는 무엇입니까?
Khemraj 2019


6

사용자 정의 라이브러리를 가져올 필요는 없습니다.

이 페이지에서 Kishan Donga 가 게시 한 위대한 답변에 대한 Kotlin 버전 AlertDialog이므로 현대를 선호 합니다.

코 틀린 코드 :

fun setProgressDialog(context:Context, message:String):AlertDialog {
    val llPadding = 30
    val ll = LinearLayout(context)
    ll.orientation = LinearLayout.HORIZONTAL
    ll.setPadding(llPadding, llPadding, llPadding, llPadding)
    ll.gravity = Gravity.CENTER
    var llParam = LinearLayout.LayoutParams(
                  LinearLayout.LayoutParams.WRAP_CONTENT,
                  LinearLayout.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    ll.layoutParams = llParam

    val progressBar = ProgressBar(context)
    progressBar.isIndeterminate = true
    progressBar.setPadding(0, 0, llPadding, 0)
    progressBar.layoutParams = llParam

    llParam = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    val tvText = TextView(context)
    tvText.text = message
    tvText.setTextColor(Color.parseColor("#000000"))
    tvText.textSize = 20.toFloat()
    tvText.layoutParams = llParam

    ll.addView(progressBar)
    ll.addView(tvText)

    val builder = AlertDialog.Builder(context)
    builder.setCancelable(true)
    builder.setView(ll)

    val dialog = builder.create()
    val window = dialog.window
    if (window != null) {
        val layoutParams = WindowManager.LayoutParams()
        layoutParams.copyFrom(dialog.window?.attributes)
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT
                dialog.window?.attributes = layoutParams
    }
    return dialog
}

용법:

val dialog = setProgressDialog(this, "Loading..")
dialog.show()

산출:

여기에 이미지 설명을 입력하십시오


조각에서 사용하는 방법? 조각의 맥락은 무엇입니까?
roghayeh hoosseini

문맥해야하므로 일반적으로 조각에 당신이 당신의 현재보기를 얻을 수 있습니다 :view!!.context
알레산드로 Ornano

4

문서 페이지 에서 언급했듯이 대안 ProgressBar 입니다. ProgressDialog의 모습은을 배치하여 복제 할 수 ProgressBarAlertDialog .

여전히 사용할 수는 있지만 Android에서는 사용하지 않기 때문에 더 이상 사용되지 않습니다. 따라서을에 삽입하는 것과 같은 다른 방법으로 문제를 해결하는 것을 고려해야 ProgressBar합니다 Layout.


@PeterHaddad 내 프로젝트의 api 28에서 "정상적으로"작동하며 하위 api와 동일합니다. 지원 중단이 제안 하듯이 더 이상 지원되지 않으며 앞으로는 작동하지 않을 수 있습니다.
DMonkey

3

ProgressDialog API 레벨 26에서 더 이상 사용되지 않습니다.

"Deprecated" 새로운 것으로 교체되는 기능이나 요소를 말합니다.

ProgressDialog는 모달 대화 상자로, 사용자가 앱과 상호 작용하지 못하게합니다. 이 클래스를 사용하는 대신 ProgressBar앱의 UI에 포함 할 수 있는 진행률 표시기를 사용해야합니다 .

이점

나는 개인적으로 ProgressBar그 둘보다 우위에 있다고 말할 것 입니다. ProgressBar작업 진행을 나타내는 사용자 인터페이스 요소입니다. 진행률 표시 줄을 중단없이 표시 합니다. 앱의 사용자 인터페이스에 진행률 표시 줄을 표시하십시오.


2

https://github.com/Q115/DelayedProgressDialog 에서 DelayedProgressDialog를 사용합니다. 합니다. 필요한 경우 지연의 이점을 추가하여 ProgressDialog와 동일하게 수행합니다.

그것을 사용하는 것은 Android O 이전의 ProgressDialog와 유사합니다.

DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");

2

내가 쓴 이 수업을 사용할 수 있습니다 . 기본 기능 만 제공합니다. 완전한 기능을 갖춘 ProgressDialog를 원한다면이 경량 라이브러리 를 사용하십시오 .

그레들 설정

module / build.gradle에 다음 종속성을 추가하십시오.

compile 'com.lmntrx.android.library.livin.missme:missme:0.1.5'

사용 방법?

사용법은 원래 ProgressDialog와 유사합니다.

ProgressDialog progressDialog = new 
progressDialog(YourActivity.this);
progressDialog.setMessage("Please wait");
progressDialog.setCancelable(false);
progressDialog.show();
progressDialog.dismiss();

NB : 활동을 무시해야합니다.onBackPressed()

Java8 구현 :

@Override
public void onBackPressed() {
    progressDialog.onBackPressed(
            () -> {
                super.onBackPressed();
                return null;
            }
    );
}

코 틀린 구현 :

override fun onBackPressed() {
   progressDialog.onBackPressed { super.onBackPressed() }
}

1

안내서 가 도움 이 될 수 있습니다.

일반적으로 지표가있는 사용자 정의 AlertDialogs를 선호합니다. 앱보기 사용자 정의와 같은 문제를 해결합니다.


1

다른 사람들에게 도움이 될 수 있습니다.

많은 인기있는 앱들은 네트워크 요청, 파일 로딩 등과 같은 것들의 진행 상황을 보여주기 위해 다른 접근 방식을 가지고 있습니다. UI / UX의 관점에서 불확실한 기간이 있습니다. 인기있는 많은 앱 (Facebook, Linkedin 등)이 베어 본 UI 디스플레이를 먼저 표시하여이 문제를 해결했습니다. 그런 다음로드 된 컨텐츠가 화면에 점차적으로 채워집니다.

이 문제를 해결하기 위해 앱에 쉬머 를 사용했습니다 .

다른 사람들에게 도움이 될 좋은 기사 가 있습니다.


0

진행률 대화 상자에서 사용자는 어떤 종류의 작업도 수행 할 수 없습니다. 진행률 대화 상자 동안 모든 백그라운드 프로세스가 중지됩니다. 따라서 진행률 대화 상자 대신 사용자 진행률 표시 줄을 사용하는 것이 좋습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.