로딩 / 진행 표시기를 표시하는 가장 좋은 방법은 무엇입니까?


146

앱이 서버의 응답을 기다리는 동안 로딩 스피너를 표시하는 가장 좋은 방법은 무엇입니까?

프로그래밍 방식으로 수행 할 수 있습니까? xml 파일에로드 스피너를 추가하지 않아도됩니까?

답변:


293

ProgressDialog 는 Android Oreo에서 더 이상 사용되지 않습니다. 대신 ProgressBar 를 사용하십시오.

ProgressDialog progress = new ProgressDialog(this);
progress.setTitle("Loading");
progress.setMessage("Wait while loading...");
progress.setCancelable(false); // disable dismiss by tapping outside of the dialog
progress.show();
// To dismiss the dialog
progress.dismiss();

또는

ProgressDialog.show(this, "Loading", "Wait while loading...");

자세한 내용은 여기를 참조하십시오.

그런데 Spinner 는 Android에서 다른 의미를 갖습니다. (HTML의 선택 드롭 다운과 같습니다)


1
Android 개발자 웹 사이트에서 : STYLE_SPINNER 회전하는 진행률 막대가 원형 인 ProgressDialog를 만듭니다.
Tequilaman

34
이것은 작동하지만 테스트 할 때 외부 화면을 터치하거나 뒤로 버튼을 눌러 대화 상자를 닫을 수 있습니다. 에 전화를 추가하여이 문제를 해결했습니다 progress.setCancelable(false);.
Sam

1
하단 댓글 주셔서 감사합니다. 나는 1 시간 동안 '스피너'를 작동 시키려고해서 미쳤다.
Can Poyrazoğlu

훌륭한, 이제 진행률 대화 상자를 사용할 수 있습니다
Faisal

10
ProgressDialog안드로이드 O가 사용됩니다 developer.android.com/reference/android/app/ProgressDialog.html
이반 Semkin에게

17

API Level 26 이후 ProgressDialog가 더 이상 사용되지 않습니다. https://developer.android.com/reference/android/app/ProgressDialog.html

레이아웃에 ProgressBar를 포함시킵니다

   <ProgressBar
        android:layout_weight="1"
        android:id="@+id/progressBar_cyclic"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="40dp"
        android:minWidth="40dp" />

가시성을 .GONE | 사용 사례에 따라 .VISIBLE.

    progressBar_cyclic.visibility = View.VISIBLE

확실하지 않지만 progressBar는 보이지 않게 한 후에 항상 백그라운드에서 실행됩니까 (UI에서 숨겨져 있습니까)?
Shambhu

16

사용하다 ProgressDialog

ProgressDialog.show(Context context, CharSequence title, CharSequence message);

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

그러나 이것은 오늘날의 안티 패턴으로 간주됩니다 (2013) : http://www.youtube.com/watch?v=pEGWcMTxs3I


12
@artworkad シ 그래서 이것의 어떤 측면이 나쁜 것으로 간주됩니다-받아 들여진 대답은 동일한 안티 패턴의 예입니까? 그리고 대신 권장되는 것은 무엇입니까? 여러 UX 문제에 대한 오프 사이트 비디오에 링크해도이 답변이 개선되지는 않습니다.
LarsH

2
ProgressDialog안드로이드 O가 사용됩니다 developer.android.com/reference/android/app/ProgressDialog.html
이반 Semkin에게

9

당신은 서버에서 응답을 기다리고있는 사실 경우는 해야 프로그래밍 방식으로 수행 합니다. 진행 대화 상자를 만들어 닫을 수 있지만 다시 "Android 방식"이 아닙니다.

현재 권장되는 방법은 DialogFragment 를 사용하는 것입니다 .

public class MySpinnerDialog extends DialogFragment {

    public MySpinnerDialog() {
        // use empty constructors. If something is needed use onCreate's
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {

        _dialog = new ProgressDialog(getActivity());
        this.setStyle(STYLE_NO_TITLE, getTheme()); // You can use styles or inflate a view
        _dialog.setMessage("Spinning.."); // set your messages if not inflated from XML

        _dialog.setCancelable(false);  

        return _dialog;
    }
}

그런 다음 활동에서 Fragment Manager를 설정 하고 서버가 시작되기를 기다리면 대화 상자를 표시 하십시오.

FragmentManager fm = getSupportFragmentManager();
MySpinnerDialog myInstance = new MySpinnerDialog();
}
myInstance.show(fm, "some_tag");

서버가 응답하면 완료됩니다.

myInstance.dismiss()

진행률 대화 상자는 속성에 따라 스피너 또는 진행률 표시 막대 입니다. API 안내서 에서 자세한 내용을 읽으십시오.


ProgressDialog.show (컨텍스트 컨텍스트, CharSequence 제목, CharSequence 메시지); 제목 매개 변수를 빈 문자열로 전달하면 제목이 제거됩니다. ProgressDialog.show (context, "", "Loading ..");
Rajendra

1
좋은 예, 여전히 뒤로 버튼을 사용하는 것이 가능했습니다. 나는 그것이 당신의 변수 dlgAlert 때문이라고 생각합니다 (그리고 btw에서 오는 것은 어디입니까? :)). 어쨌든-대화 상자 조각을 확장하므로 setCancelable (false)을 호출하면 작동합니다.
Lasse

서버가 응답을 반환 할 때 결정적이지 않은 시간에 프래그먼트 트랜잭션을 커밋하는 것은 완벽한 것으로 보이지 않습니다. 예를 들어, 응답이 다시 발생하면 프래그먼트를 호스팅하는 활동이 잘못된 상태에있을 수 있습니다. 어떤 해결책?
조나스

android.app.DialogFragment가 아닌 android.support.v4.app.DialogFragment를 가져 오거나 getSupportFragmentManager를 사용할 수 없는지 확인하십시오 ( stackoverflow.com/questions/27514338/… 참조 )
StCleezy

ProgressDialog안드로이드 O가 사용됩니다 developer.android.com/reference/android/app/ProgressDialog.html
이반 Semkin에게

6

한 번에 하나의 진행률 대화 상자 만 열 수 있도록이 작업을 수행 한 방법입니다. Suraj Bajaj의 답변을 바탕으로

private ProgressDialog progress;



public void showLoadingDialog() {

    if (progress == null) {
        progress = new ProgressDialog(this);
        progress.setTitle(getString(R.string.loading_title));
        progress.setMessage(getString(R.string.loading_message));
    }
    progress.show();
}

public void dismissLoadingDialog() {

    if (progress != null && progress.isShowing()) {
        progress.dismiss();
    }
}

나도 사용해야 했어

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}

1
ProgressDialog안드로이드 O가 사용됩니다 developer.android.com/reference/android/app/ProgressDialog.html
이반 Semkin에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.