लोडिंग / प्रगति संकेतक दिखाने का सबसे अच्छा तरीका?


146

लोडिंग स्पिनर दिखाने का सबसे अच्छा तरीका क्या है जबकि ऐप सर्वर से प्रतिक्रिया के लिए इंतजार कर रहा है?

क्या यह प्रोग्रामिक रूप से किया जा सकता है? ताकि मुझे xml फ़ाइल में लोड स्पिनर जोड़ने की आवश्यकता न हो?

जवाबों:


293

ProgressDialog को Android Oreo से हटा दिया गया है। इसके बजाय प्रोग्रेसबार का उपयोग करें

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

और पढ़ें यहाँ

वैसे, एंड्रॉइड में स्पिनर का एक अलग अर्थ है। (यह HTML में चुनिंदा ड्रॉपडाउन की तरह है)


1
Android डेवलपर वेबसाइट से: STYLE_SPINNER एक वृत्ताकार, कताई प्रगति पट्टी के साथ एक ProgressDialog बनाता है।
टीकिलमैन

34
यह काम करता है, लेकिन जब मैंने इसका परीक्षण किया, तो मैं इसके बाहर स्क्रीन को छूकर या बैक बटन दबाकर संवाद को खारिज कर सकता था । मैंने इसमें कॉल जोड़कर इसे ठीक किया progress.setCancelable(false);
सैम

1
नीचे टिप्पणी के लिए धन्यवाद। मैं पागल हो रहा था क्योंकि मैं एक घंटे तक काम करने के लिए 'स्पिनर' लाने की कोशिश कर रहा था।
कर सकते हैं Poyrazoğlu

शानदार, अब मैं प्रगति संवाद का उपयोग कर सकता हूं
फैसल


17

API Level 26 https://developer.android.com/reference/android/app/ProgressDialog.html के बाद से ProgressDialog पदावनत हो गया है

मैं अपने लेआउट में एक 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

निश्चित नहीं है, लेकिन क्या यह अदृश्य होने के बाद प्रगतिबेर हमेशा पृष्ठभूमि में चलता है (बस यूआई से छिपा हुआ है)?
शम्भू

16

उपयोग ProgressDialog

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

यहाँ छवि विवरण दर्ज करें

हालाँकि यह आज (2013) का एक विरोधी पैटर्न माना जाता है: http://www.youtube.com/watch?v=pEGWcMTxs3I


12
@ कार्टवर्कड what तो इसके किस पहलू को बुरा माना जाता है - क्या स्वीकृत उत्तर उसी विरोधी पैटर्न का एक उदाहरण है? और इसके बजाय क्या करने की सिफारिश की गई है? कई यूएक्स मुद्दों के बारे में ऑफसाइट वीडियो से जुड़ने से वास्तव में इस जवाब में सुधार नहीं होता है।
लार्स


9

वास्तव में यदि आप किसी सर्वर से प्रतिक्रिया की प्रतीक्षा कर रहे हैं तो इसे प्रोग्रामेटिक रूप से किया जाना चाहिए । आप एक प्रगति संवाद बना सकते हैं और इसे खारिज कर सकते हैं, लेकिन फिर वह "एंड्रॉइड वे" नहीं है।

वर्तमान में अनुशंसित विधि एक 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;
    }
}

फिर आपकी गतिविधि में आप अपना फ्रैगमेंट मैनेजर सेट करते हैं और सर्वर के शुरू होने के बाद एक बार डायलॉग दिखाते हैं :

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

एक बार जब आपका सर्वर पूरा जवाब दे देता है तो आप इसे खारिज कर देंगे:

myInstance.dismiss()

याद रखें कि प्रगतिदल एक स्पिनर है या विशेषताओं के आधार पर प्रगति करने वाला है, एपीआई गाइड पर अधिक पढ़ें


ProgressDialog.show (संदर्भ प्रसंग, CharSequence शीर्षक, CharSequence message); खाली स्ट्रिंग के रूप में शीर्षक पैरामीटर को पास करने से शीर्षक हटा दिया जाता है: प्रोग्रेसडायलॉग.शो (संदर्भ, "", "लोड हो रहा है ..");
राजेंद्र

1
ठीक उदाहरण, हालांकि मेरे लिए बैक बटन का उपयोग करना अभी भी संभव था। मुझे लगता है कि यह आपके वैरिएबल dlgAlert की वजह से है (और यह btw कहां से आ रहा है? :))। वैसे भी - जब से आप डायलॉगफ्रैगमेंट का विस्तार कर रहे हैं, आप बस सेटैन्सेबल (झूठे) को कॉल कर सकते हैं और यह काम करेगा।
लास

एक अनिश्चित समय पर टुकड़ा लेनदेन करना जब सर्वर प्रतिक्रिया देता है तो यह मूर्खतापूर्ण प्रतीत नहीं होता है। उदाहरण के लिए, जब प्रतिक्रिया वापस आती है, तो टुकड़ा को होस्ट करने वाली गतिविधि गलत स्थिति में हो सकती है। कोई भी समाधान?
जोनास

सुनिश्चित करें कि आप android.support.v4.app.DialogFragment का आयात कर रहे हैं और android.app.DialogFragment का उपयोग नहीं कर रहे हैं, या आप getSupportFragmentManager का उपयोग नहीं कर सकते हैं (देखें stackoverflow.com/questions/275144/8 )
StCleezy


6

यह मैंने ऐसा किया है ताकि एक समय में केवल एक ही प्रगति संवाद खुला रह सके। सूरज बजाज के जवाब के आधार पर

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.