ProgressDialog sudah tidak digunakan lagi. Apa alternatif yang digunakan?


Jawaban:


196

Ya, API level 26itu sudah usang. Sebagai gantinya, Anda bisa menggunakannyaprogressBar .

Untuk membuatnya secara terprogram:

Pertama, dapatkan referensi ke tata letak root

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

atau

RelativeLayout layout = findViewById(this);

Kemudian tambahkan bilah progres

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

Untuk menampilkan bilah progres

progressBar.setVisibility(View.VISIBLE);

Untuk menyembunyikan bilah progres

progressBar.setVisibility(View.GONE);

Untuk menonaktifkan interaksi pengguna, Anda hanya perlu menambahkan kode berikut

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

Untuk mendapatkan kembali interaksi pengguna Anda hanya perlu menambahkan kode berikut

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

Hanya untuk referensi di masa mendatang, ubah android.R.attr.progressBarStyleSmallke android.R.attr.progressBarStyleHorizontal.

Kode di bawah ini hanya berfungsi di atas API level 21

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

Untuk membuatnya melalui 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"/>

Dalam aktivitas Anda

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

Menampilkan / menyembunyikan bilah kemajuan adalah sama

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

Berikut ini contoh gambar tampilannya:

Untuk lebih jelasnya:
1. Referensi satu
2. Referensi Dua


Ini seperti Anda telah menggunakan ini dan Anda pergi seperti ya akhirnya dialog kemajuan sudah usang, jadi saya dapat menunjukkan potensi saya kepada dunia: D, hanya bercanda, terima kasih banyak atas jawaban terinci itu.
Mohamed Hajr

1
tetapi bagaimana mengaturMessage () untuk itu?
reverie_ss


perbarui kode xml ke "@android: color / white"
musterjunk

Untuk mendapatkan Bilah horizontal, harap gunakan: ProgressBar progressBar = ProgressBar baru (youractivity.this, null, android.R.attr.progressBarStyleHorizontal); progressBar.setIndeterminate (true);
taranjeetsapra

45

Anda dapat menggunakan AlertDialogsebagai ProgressDialogmerujuk kode di bawah ini untuk ProgressDialog. Fungsi ini perlu Anda panggil setiap kali Anda menampilkan dialog progres.

Kode:

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

Keluaran:

masukkan deskripsi gambar di sini


Bagaimana cara menghilangkannya?
Jay Dangar

1
buat satu kelas dasar seperti BaseActivity lalu setelah menambahkan kode ini, tambahkan juga satu metode singkirkan dialog tetapi untuk itu, Anda perlu mendefinisikan objek 'AlertDialog dialog' secara global
Kishan Donga

lalu cukup panggil metode dialog.dismiss () di dalam metode dialog sembunyikan Anda.
Kishan Donga

1
Semuanya baik-baik saja tetapi saat mengetuk di mana saja pada dialog layar diberhentikan. Panggilan layanan sedang berlangsung dan suer dapat mengabaikannya dan bermain dengan ui yang tidak baik benar. Setiap Solusi?
Vivek Kumar

Anda dapat mengaturnya agar tidak dapat dibatalkan, tetapi memutar perangkat atau menggunakan layar terbagi akan tetap ditolak dan pengguna dapat berinteraksi dengan UI yang tidak siap. Mungkin AlertDialogsebaiknya tidak digunakan di sini.
Meow Cat 2012

30

Kelas ini sudah tidak digunakan lagi di API level 26. ProgressDialog adalah dialog modal, yang mencegah pengguna berinteraksi dengan aplikasi. Alih-alih menggunakan kelas ini, Anda harus menggunakan indikator progres seperti ProgressBar, yang dapat disematkan di UI aplikasi Anda. Atau, Anda dapat menggunakan notifikasi untuk memberi tahu pengguna tentang perkembangan tugas. tautan

Sudah usang Android Okarena Googlestandar UI baru


1
"Kelas ini sudah tidak digunakan lagi di API level 26" digunakan sebagai ganti tanggal. Mereka tidak ingin Anda menggunakannya lagi. Ya, itu karena standar UI baru, tetapi mereka berlaku untuk setiap tingkat API ...
creativecreatorormaybenot

28
"Sudah tidak digunakan lagi di Android O karena standar UI baru Google" - tautan harap standar UI baru
Ajay S

22
Dan alasan untuk mencabutnya adalah karena memblokir input pengguna? Terkadang saya bertanya-tanya bubuk apa yang insinyur Google mendengus. Jauh lebih mudah menggunakan dialog pemblokiran daripada harus menyembunyikan / menonaktifkan kontrol input dan kemudian mengaktifkan progressbar. Berpikir bodoh di pihak Google.
TheRealChx101

@ TheRealChx101 UI Android dirancang untuk membuat pengguna merasakan kebebasan palsu dengan mengorbankan solusi mahal untuk mencegah kesalahan fatal yang diakibatkannya. Tunggu sampai Anda masuk ke izin dan apa yang dibayar operator Google untuk mengatakan Anda bisa dan tidak bisa mengakses.
Abandoned Cart

3
Saya kira mereka lebih tertarik untuk mencegah penyalahgunaan dialog modal: kadang-kadang mereka ditampilkan untuk membuat pengguna menunggu akhir operasi dalam situasi di mana pengguna tidak perlu menunggu sama sekali, tetapi dapat terus melakukan hal-hal lain , sehingga membuat mereka menunggu tanpa perlu menurunkan pengalaman pengguna. Sekalipun demikian, ada banyak keadaan di mana tidak ada pilihan bagi pengguna tetapi menunggu operasi selesai, jadi saya setuju bahwa harus ada metode standar yang tidak usang untuk kasus-kasus ini alih-alih memaksa setiap pengembang menerapkan sendiri.
Fran Marzoa

26

Anda cukup mendesain antarmuka xml untuk progressbar Anda dan meneruskannya sebagai tampilan ke AlertDialog, lalu tampilkan atau abaikan dialog kapan pun Anda mau.

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>

Kode kode yang menampilkan dialog progres. Cukup salin kode ini dan rekatkan fragmen Anda.

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

Kemudian panggil metode tersebut kapan saja Anda ingin menampilkan progressdialog dan berikan true sebagai argumen untuk menunjukkannya atau salah untuk mengabaikan dialog.


2
@Alok Rajasukumaran tampaknya Anda menggunakan aktivitas, cukup gantikan dengan this, sehingga terlihat seperti ini. AlertDialog.Builder builder = new AlertDialog.Builder(this);Pastikan Anda menyalin kode yang benar.
DevMike01

1
layout_toEndOfdapat dihapus karena bukan untukLinearLayout
Tandai

21

ProgressBar sangat sederhana dan mudah digunakan, saya bermaksud membuat ini sama dengan dialog progres sederhana. Langkah pertama adalah Anda dapat membuat tata letak xml dari dialog yang ingin Anda tampilkan, katakanlah kita beri nama tata letak ini

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>

Langkah selanjutnya adalah membuat AlertDialog yang akan menampilkan tata letak ini dengan 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();

sekarang yang tersisa hanyalah menampilkan dan menyembunyikan dialog ini di acara klik kami seperti ini

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

dan itu saja, itu harus bekerja, seperti yang Anda lihat itu sangat sederhana dan mudah untuk mengimplementasikan ProgressBar, bukan ProgressDialog. sekarang Anda dapat menampilkan / mengabaikan kotak dialog ini di Handler atau ASyncTask, tergantung kebutuhan Anda


Tolong, ubah progress_dialog.show();ke builder.show();. Terima kasih.
Matheus Miranda

2
Saya telah mengubah nama ke objek AlertDialog kanan pada, show()/ dismiss(), tapi saya tidak meletakkan builder.show()karena kemudian untuk mengabaikannya kita harus melakukan dialog.dismiss()yang agak membingungkan bagi seseorang yang suka menjaga kode mereka sederhana dan mudah dimengerti, dan juga karena builder.show()mengembalikan AlertDialogobjek, dan kita harus menyimpan referensi itu seperti AlertDialog dialog = builder.show();kemudian lakukan dialog.dismiss(), lebih mudah untuk builder.create()kembali pada beberapa AlertDialogobjek, dan kemudian menggunakan objek itu untuk menampilkan dan menyembunyikan dialog
Syed Naeem

Kami dapat menggunakan "runOnUiThread (new Runnable () {@Override public void run () {dialog.show/dismiss ();}});", jika utas panggilan bukan Utas UI Utama. (berguna ketika kita gunakan untuk memanggil dari WebView - metode shouldoverride.)
SHS

15

Ya, ProgressDialog sudah usang tetapi Dialog tidak.

Anda dapat mengembang file XML Anda sendiri (berisi bilah kemajuan dan memuat teks) ke objek dialog Anda dan kemudian menampilkan atau menyembunyikannya menggunakan show()dan dismiss()fungsi. Berikut ini sebuah contoh (Kotlin):

Kelas 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>

Dalam kode Anda : Lakukan sajavar dialog = ProgressDialog.progressDialog(context)

Memperlihatkan: dialog.show()

Untuk menyembunyikan: dialog.dismiss()


11

Nah, jika Anda benar-benar ingin bertentangan dengan kehendak mereka, Anda masih dapat menggunakan Sweet Alert Dialog atau membuatnya sendiri.

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>

Kode Java:

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
Saya memiliki pengalaman mengerikan dengan SweetAlertDialog dalam pengaturan produksi, sangat berhati-hati karena bocor dari jendela ke jendela.
Jeremy

bagi saya HideProgresstidak melakukan apa-apa.
Saeed Neamati

1
Mengapa menggunakan perpustakaan hanya untuk menunjukkan dialog progres?
Khemraj


6

Anda tidak perlu mengimpor perpustakaan khusus apa pun.

Saya lebih suka menggunakan yang modern AlertDialogjadi ini adalah versi Kotlin untuk jawaban hebat yang diposting oleh Kishan Donga di halaman ini.

Kode Kotlin:

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
}

Pemakaian:

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

Keluaran:

masukkan deskripsi gambar di sini


bagaimana cara menggunakannya dalam fragmen? apa konteks dalam fragmen?
roghayeh hosseini

Biasanya dalam fragmen Anda, Anda bisa mendapatkan tampilan Anda saat ini, jadi konteksnya seharusnya:view!!.context
Alessandro Ornano

4

Seperti yang disebutkan pada halaman dokumentasi , alternatifnya adalah ProgressBar . ProgressDialogTampilan dapat direplikasi dengan menempatkan ProgressBarke dalam AlertDialog.

Anda masih dapat menggunakannya, tetapi Android tidak ingin Anda menggunakannya, itu sebabnya itu sudah usang. Jadi Anda harus mempertimbangkan untuk menyelesaikan masalah Anda dengan cara lain, seperti menanamkan ProgressBarke dalam masalah Anda Layout.


@ PeterHaddad Ia bekerja "normal" di api 28 di proyek saya dan sama seperti di apis yang lebih rendah. Seperti yang disarankan penghentian, itu tidak lagi didukung dan mungkin tidak berfungsi di masa depan.
DMonkey

3

ProgressDialog sudah tidak digunakan lagi di API level 26.

"Deprecated" mengacu pada fungsi atau elemen yang sedang dalam proses digantikan oleh yang lebih baru.

ProgressDialog adalah dialog modal, yang mencegah pengguna berinteraksi dengan aplikasi. Alih-alih menggunakan kelas ini, Anda harus menggunakan indikator progres seperti ProgressBar, yang dapat disematkan di UI aplikasi Anda.

Keuntungan

Saya pribadi akan mengatakan bahwa ProgressBarmemiliki keunggulan atas keduanya. ProgressBaradalah elemen antarmuka pengguna yang menunjukkan kemajuan operasi. Tampilkan bilah progres kepada pengguna dengan cara yang tidak mengganggu . Tampilkan bilah progres di antarmuka pengguna aplikasi Anda.


2

Saya menggunakan DelayedProgressDialog dari https://github.com/Q115/DelayedProgressDialog Ia melakukan hal yang sama seperti ProgressDialog dengan manfaat tambahan dari penundaan jika perlu.

Menggunakannya mirip dengan ProgressDialog sebelum Android O:

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

2

Anda bisa menggunakan kelas yang saya tulis ini. Ini hanya menawarkan fungsi dasar. Jika Anda ingin ProgressDialog berfungsi penuh, maka gunakan perpustakaan ringan ini .

Pengaturan Gradle

Tambahkan dependensi berikut ke module / build.gradle:

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

Bagaimana cara menggunakannya?

Penggunaannya mirip dengan ProgressDialog asli

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

NB : Anda harus mengesampingkan aktivitasonBackPressed()

Implementasi Java8:

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

Implementasi Kotlin:

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

1

Mungkin panduan ini bisa membantu Anda.

Biasanya saya lebih suka membuat AlertDialogs kustom dengan indikator. Ini memecahkan masalah seperti penyesuaian tampilan App.


1

Ini dapat membantu orang lain.

Banyak aplikasi populer memiliki pendekatan berbeda untuk menunjukkan progres apa pun seperti permintaan jaringan, pemuatan file, dll. Memuat spinner tidak menunjukkan seberapa banyak konten yang telah dimuat atau yang tersisa untuk dimuat. Ada periode ketidakpastian yang buruk dalam perspektif UI / UX. Banyak aplikasi populer (Facebook, Linkedin dll) telah mengatasi masalah ini dengan menunjukkan tampilan UI tanpa tulang terlebih dahulu. Kemudian konten yang dimuat secara bertahap diisi di layar.

Saya telah menggunakan shimmer untuk aplikasi saya untuk menyelesaikan masalah ini.

Ada artikel bagus tentang ini yang akan bermanfaat bagi orang lain


0

Dalam dialog progres, pengguna tidak dapat melakukan pekerjaan apa pun. Semua proses latar belakang dihentikan selama dialog progres. Jadi, disarankan untuk progress-bar pengguna alih-alih dialog progres.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.