Bir yükleme / ilerleme göstergesi göstermenin en iyi yolu?


149

Uygulama sunucudan yanıt beklerken bir yükleme çarkını göstermenin en iyi yolu nedir?

Bu programlı olarak yapılabilir mi? Yük döndürücüyü xml dosyasına eklememe gerek kalmaması için mi?

Yanıtlar:


294

ProgressDialog , Android Oreo'da kullanımdan kaldırılmıştır. Kullanım ProgressBar yerine

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

VEYA

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

Daha fazlasını buradan okuyun.

Bu arada, Spinner'ın Android'de farklı bir anlamı var. (HTML'deki seçme açılır menüsü gibidir)


1
Android Geliştirici web sitesinden: STYLE_SPINNER Dairesel, dönen bir ilerleme çubuğuna sahip bir ProgressDialog oluşturur.
Eric Engel

36
Bu işe yarıyor, ancak bunu test ettiğimde, dışındaki ekrana dokunarak veya Geri düğmesine basarak iletişim kutusunu kapatabilirdim . Bir çağrı ekleyerek bunu düzelttim progress.setCancelable(false);.
Sam

1
Alt yorum için teşekkürler. Çıldırıyordum çünkü bir saat boyunca "spinner" ı çalıştırmaya çalışıyordum.
Can Poyrazoğlu

harika, şimdi ilerleme diyaloğunu kullanabilirim
Faysal


17

ProgressDialog, API Seviye 26 https://developer.android.com/reference/android/app/ProgressDialog.html'den bu yana kullanımdan kaldırıldı

Düzenime bir ProgressBar ekliyorum

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

ve görünürlüğünü .GONE olarak değiştirin | .Kullanım durumuna göre GÖRÜNÜR.

    progressBar_cyclic.visibility = View.VISIBLE

Emin değilim, ancak progressBar görünmez hale getirdikten sonra her zaman arka planda çalışıyor mu (yalnızca kullanıcı arayüzünden gizleniyor mu)?
Shambhu

16

Kullanım ProgressDialog

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

görüntü açıklamasını buraya girin

Ancak bu, bugün (2013) bir anti model olarak kabul edilmektedir: http://www.youtube.com/watch?v=pEGWcMTxs3I


12
@artworkad シ Peki bunun hangi yönü kötü olarak değerlendiriliyor - kabul edilen yanıt aynı anti-modele bir örnek mi? Ve bunun yerine ne yapılması önerilir? Birden çok UX sorunu hakkında site dışı bir videoya bağlantı vermek, bu yanıtı gerçekten iyileştirmez.
LarsH


10

Aslında bir sunucudan yanıt bekliyorsanız, bunun programlı olarak yapılması gerekir . Bir ilerleme diyaloğu oluşturabilir ve onu kapatabilirsiniz, ancak yine de bu "android yolu" değildir.

Şu anda önerilen yöntem bir DialogFragment kullanmaktır :

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

Ardından etkinliğinizde Parça yöneticinizi ayarlarsınız ve sunucu bekleme başladığında iletişim kutusunu gösterirsiniz :

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

Sunucunuz tamamlandığında yanıt verdiğinde, onu kapatacaksınız:

myInstance.dismiss()

İlerleme iletişim kutusunun niteliklere bağlı olarak bir döndürücü veya ilerleme çubuğu olduğunu unutmayın, api kılavuzunda daha fazlasını okuyun


ProgressDialog.show (Bağlam bağlamı, CharSequence başlığı, CharSequence mesajı); Title parametresini boş dize olarak geçirmek başlığı kaldırır: ProgressDialog.show (bağlam, "", "Yükleniyor ..");
Rajendra

1
Güzel bir örnek, yine de geri düğmesini kullanmam mümkündü. Bunun dlgAlert değişkeninizden kaynaklandığını düşünüyorum (ve bu btw'den nereden geliyor? :)). Her neyse - dialogfragment'ı genişlettiğiniz için, setCancelable (false) 'ı çağırabilirsiniz ve çalışacaktır.
Lasse

Sunucu bir yanıt döndürdüğünde belirsiz bir zamanda parça işlemlerini gerçekleştirmek aptalca görünmüyor. Örneğin, yanıt geri geldiğinde, parçayı barındıran etkinlik yanlış durumda olabilir. Herhangi bir çözüm?
Jonas

Android.support.v4.app.DialogFragment'ı içe aktardığınızdan emin olun, android.app.DialogFragment'ı değil, yoksa getSupportFragmentManager'ı kullanamazsınız (bkz. Stackoverflow.com/questions/27514338/… )
StCleezy


6

Bunu böyle yaptım, böylece bir seferde yalnızca bir ilerleme iletişim kutusu açılabilir. Suraj Bajaj'ın cevabına dayanarak

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

Ben de kullanmak zorundaydım

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.