Cara terbaik untuk menampilkan indikator pemuatan / kemajuan?

147

Apa cara terbaik untuk menunjukkan pemuatan pemintal saat aplikasi sedang menunggu respons dari server?

Bisakah ini dilakukan secara terprogram? Jadi saya tidak perlu menambahkan load spinner di file xml?

Jochem Gruter
sumber

Jawaban:

293

ProgressDialog tidak digunakan lagi di Android Oreo. Gunakan ProgressBar sebagai gantinya

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();

ATAU

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

Baca lebih lanjut di sini.

Omong-omong, Spinner memiliki makna berbeda di Android. (Ini seperti dropdown pilih dalam HTML)

Suraj Bajaj
sumber
1
Dari situs web Pengembang Android: STYLE_SPINNER Membuat ProgressDialog dengan bilah kemajuan melingkar dan berputar.
Tequilaman
34
Ini berfungsi, tetapi ketika saya menguji ini, saya bisa mengabaikan dialog dengan menyentuh layar di luarnya atau menekan tombol Kembali . Saya memperbaiki ini dengan menambahkan panggilan ke progress.setCancelable(false);.
Sam
1
Terima kasih atas komentarnya. Saya menjadi gila karena saya berusaha membuat 'pemintal' bekerja selama satu jam.
Can Poyrazoğlu
luar biasa, sekarang saya bisa menggunakan dialog kemajuan
Faisal
10
ProgressDialogsudah tidak digunakan lagi di Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
17

ProgressDialog menjadi tidak digunakan lagi sejak API Level 26 https://developer.android.com/reference/android/app/ProgressDialog.html

Saya menyertakan ProgressBar di tata letak saya

   <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" />

dan ubah visibilitasnya menjadi .GONE | . TERLIHAT tergantung pada use case.

    progressBar_cyclic.visibility = View.VISIBLE
Ilker Baltaci
sumber
Tidak yakin, tetapi apakah progressBar selalu berjalan di latar belakang (hanya disembunyikan dari UI) setelah membuatnya tidak terlihat?
Shambhu
16

Menggunakan ProgressDialog

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

masukkan deskripsi gambar di sini

Namun ini dianggap sebagai pola anti hari ini (2013): http://www.youtube.com/watch?v=pEGWcMTxs3I

vasart
sumber
12
@artworkad シ Jadi, aspek apa yang dianggap buruk - apakah jawaban yang diterima merupakan contoh dari anti-pola yang sama? Dan apa yang direkomendasikan untuk dilakukan? Menautkan ke video di luar kantor tentang beberapa masalah UX tidak benar-benar meningkatkan jawaban ini.
LarsH
2
ProgressDialogsudah tidak digunakan lagi di Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
9

Sebenarnya jika Anda menunggu respons dari server, itu harus dilakukan secara terprogram. Anda dapat membuat dialog progres dan mengabaikannya, tetapi sekali lagi itu bukan "cara android".

Saat ini metode yang disarankan adalah menggunakan 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;
    }
}

Kemudian dalam aktivitas Anda, Anda mengatur manajer Fragmen Anda dan menampilkan dialog setelah menunggu server dimulai:

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

Setelah server Anda merespons selesai, Anda akan mengabaikannya:

myInstance.dismiss()

Ingat bahwa progressdialog adalah pemintal atau progressbar tergantung pada atribut, baca lebih lanjut tentang panduan api

quinestor
sumber
ProgressDialog.show (Konteks konteks, judul CharSequence, pesan CharSequence); Melewati parameter judul sebagai string kosong menghapus judul: ProgressDialog.show (konteks, "", "Memuat ..");
Rajendra
1
Contoh yang bagus, meskipun masih mungkin bagi saya untuk menggunakan tombol kembali. Saya pikir itu karena variabel dlgAlert Anda (dan dari mana datangnya btw? :)). Pokoknya - karena Anda sedang memperluas dialogfragment, Anda bisa memanggil setCancelable (false) dan itu akan berfungsi.
Lasse
Melakukan transaksi fragmen pada waktu yang tidak pasti ketika server mengembalikan respons tampaknya tidak bodoh. Misalnya, ketika respons kembali, aktivitas yang menampung fragmen mungkin berada dalam kondisi yang salah. Ada solusi?
Jonas
Pastikan Anda mengimpor android.support.v4.app.DialogFragment dan bukan android.app.DialogFragment, atau Anda tidak dapat menggunakan getSupportFragmentManager (lihat stackoverflow.com/questions/27514338/… )
StCleezy
ProgressDialogsudah tidak digunakan lagi di Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
6

Ini adalah bagaimana saya melakukan ini sehingga hanya satu dialog progres yang dapat dibuka pada suatu waktu. Didasarkan atas jawaban dari 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();
    }
}

Saya juga harus menggunakan

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}
Isaac Zais
sumber
1
ProgressDialogsudah tidak digunakan lagi di Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin