
आपका स्वागत है!
इस पोस्ट में मैं ऐसे Android UI तत्व के बारे में बात करना चाहता हूं जैसे कि
ProgressDialog और आम तौर पर एप्लिकेशन में प्रगति प्रदर्शित करने के विषय, संभावित कार्यान्वयन और समस्याओं के बारे में।
कटौती के तहत आपको विषय पर कुछ विचार मिलेंगे + काफी कोड। शायद, जिस विषय के बारे में मैं बात करूंगा, वह कई लोगों को स्पष्ट लग सकता है, लेकिन मेरकेट के अनुप्रयोगों में समान "समाधान" को देखते हुए, सब कुछ स्पष्ट रूप से इतना स्पष्ट नहीं है। साथ ही, इस विषय पर आपके विचार या सर्वोत्तम अभ्यास को सुनने के लिए मेरी रुचि होगी।
समस्या या समाधान # ०
ProgressDialog - Android का मूल तत्व, किसी कार्य की प्रगति को प्रदर्शित करने के लिए एक अत्यंत लोकप्रिय उपकरण है। ProgressDialog + AsyncTask के कार्यान्वयन का एक कोषेर उदाहरण
यहां mike114
हब उपयोगकर्ता से लिया जा सकता
है ।
सबकुछ ठीक हो जाएगा, लेकिन एक महत्वपूर्ण कमी है: प्रोग्रेसडायलॉग
मोडल है । यानी इसके संचालन के दौरान, उपयोगकर्ता UI के साथ बातचीत करने में सक्षम नहीं है। हां, कभी-कभी यह उचित होता है, खासकर जब केवल वैकल्पिक विकल्प नहीं होते हैं, उदाहरण के लिए, प्रारंभिक लॉगऑन के साथ, लेकिन कई स्थितियों में यह उचित नहीं है, क्योंकि उपयोगकर्ता को ऑपरेशन के अंत की प्रतीक्षा करता है, हालांकि वह कुछ अधिक उपयोगी हो सकता है।
कई उदाहरण हैं, यहां बग्रीमोव
उपयोगकर्ता प्रगति दिखाने के लिए प्रोग्रेसडायलॉग का उपयोग करता है जबकि सामग्री सर्वर से लोड की जा रही है। उसी समय, यदि किसी कारण से यह इतनी जल्दी नहीं होता है, तो उपयोगकर्ता तब तक इंतजार करने के लिए बाध्य होगा जब तक कि कुछ उसके पास वापस नहीं आ जाता है, हालांकि इसके बजाय वह कई समानांतर कार्यों को शुरू कर सकता है और जबकि लोड हो रहा है, पहले से डाउनलोड किए गए पढ़ें।
नोट: ProgressDialog एक कपटी तत्व है, जैसा कि यह बहुत परिचित है और परिणामस्वरूप, एंड्रॉइड उपयोगकर्ताओं के लिए समझ में आता है कि वे सबसे अधिक संभावना आपको इसके अनुचित उपयोग को माफ कर देंगे।समाधान नंबर 1। कुछ भी मत दिखाओ
पेशेवरों:- इस तरह के निर्णय के परिणामस्वरूप, उपयोगकर्ता किसी भी तरह से अवरुद्ध नहीं होता है और वह जो चाहे कर सकता है। यहाँ, उपयोगकर्ता असभ्य पृष्ठभूमि में सूची के लिए चित्रों को लोड करता है।
विपक्ष:- उपयोगकर्ता हमेशा अंधेरे में रहता है, उसे नहीं पता होता है कि कुछ और किया जा रहा है या नहीं, और यह पर्याप्त कष्टप्रद हो सकता है।
- इसके लिए और ProgressDialog के बिना सभी बाद के फैसले, इसमें काम का एक जटिल तर्क शामिल है, क्योंकि अब कार्य के निष्पादन के दौरान उपयोगकर्ता अवरुद्ध ProgressDialog की तुलना में बहुत अधिक कार्य कर सकता है, फिर इसे पूर्ववर्ती के पूरा होने से पहले कार्य को फिर से शुरू करने के लिए, अतिरिक्त रूप से ध्यान में रखना आवश्यक होगा।
कुछ स्थितियों में, यह एक सामान्य समाधान हो सकता है, उदाहरण के लिए, यदि आप अपने आईसीक्यू-जैसे क्लाइंट को लिख रहे हैं, तो यह वार्ताकार की स्थिति को डाउनलोड करने के लिए प्रगति दिखाने का कोई मतलब नहीं है, यह ऑपरेशन उपयोगकर्ता के लिए पारदर्शी हो सकता है।
यानी निष्कर्ष निकाला जा सकता है: प्रगति प्रदर्शित करते समय मुहावरे पर न जाएं, यदि उपयोगकर्ता को ऑपरेशन करने की प्रक्रिया के बारे में जानकारी की आवश्यकता नहीं है, तो प्रगति प्रदर्शन छोड़ा जा सकता है।
निर्णय संख्या 2। ProgressBar का उपयोग करें
प्रोग्रेसबार - एंड्रॉइड का मूल घटक, जो आपको सीधे व्यू पर निष्पादन की प्रगति को प्रदर्शित करने की अनुमति देता है।
कुछ पाने के लिए:

यह एक नियमित xml संसाधन बनाने और उसमें एक ProgressBar को परिभाषित करने के लिए पर्याप्त है:
<ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/progressBarStyleInverse" android:layout_alignParentRight="true"/>
इसके अलावा, इस प्रगति पट्टी का उपयोग लेआउट के अंदर अन्य सभी घटकों की तरह किया जा सकता है:
... progressBar = (ProgressBar) findViewById(R.id.progress_bar); progressBar.setVisibility(View.VISIBLE); ...
एंड्रॉइड मार्केट में इस समाधान का उपयोग किया जाता है, यदि इंस्टॉलेशन / अपडेट के दौरान आप इंस्टॉल किए गए एप्लिकेशन की सूची में जाते हैं, तो आप वर्तमान कार्यों की प्रगति देख सकते हैं।
अक्सर, समान प्रकार के बहुत सारे तत्वों को लोड करते समय एक समान दृष्टिकोण का उपयोग किया जाता है, पहले वे एक प्रोग्रेसबेर के साथ खाली फॉर्म प्रदर्शित करते हैं, और फिर उन्हें डाउनलोड के दौरान सामग्री के साथ भरते हैं।
पेशेवरों:- फिर, वह उपयोगकर्ता को ब्लॉक नहीं करता है।
- और यह भी, पहले समाधान की तुलना में, यह प्रगति को दर्शाता है, अर्थात। उपयोगकर्ता जानता है कि कुछ हो रहा है।
विपक्ष:- यह स्क्रीन पर एक स्थान रखता है, और मोबाइल उपकरणों पर प्रत्येक "स्क्रैप" उपयोगी सतह सोने के वजन में मूल्यवान है। बेशक, आप इसे छिपा सकते हैं जब कोई प्रगति नहीं होती है, लेकिन फिर यूआई तर्क का उल्लंघन किया जाएगा, जिसमें प्रत्येक तत्व अपनी जगह लेता है।
- स्थिति में एक और माइनस, क्योंकि चूंकि यह प्रगति स्क्रीन से जुड़ी हुई है, इसलिए यह हमेशा स्पष्ट नहीं होता है कि यदि आप दूसरी स्क्रीन पर स्विच करते हैं, तो क्या करना है, अर्थात्। उपयोगकर्ता को कुछ दिखाएँ या नहीं और सबसे महत्वपूर्ण बात यह है कि कहाँ।
- और एक और माइनस यह है कि प्रगति पट्टी की स्थिति अवचेतन रूप से उस तत्व से जुड़ी होती है जिसके बगल में यह स्थित है, अर्थात। आपको इंटरफ़ेस के माध्यम से और भी अधिक सावधानी से सोचने की आवश्यकता है ताकि अंत में यह गलत धारणाएं न हों कि एक विशिष्ट तत्व को अब अपडेट किया जा रहा है, हालांकि वास्तव में पूरी स्क्रीन को अपडेट किया जा रहा है।
- सभी गैर-प्रोग्रेसडियल सॉल्यूशंस के सामान्य माइनस: काम के तर्क की जटिलता (समाधान नंबर 1 देखें)।
निर्णय संख्या 3। सूचना क्षेत्र के अंदर प्रोग्रेसबार का उपयोग करें
यह समाधान एंड्रॉइड मार्केट में भी उपयोग किया जाता है, जब उपयोगकर्ता एप्लिकेशन की स्थापना शुरू करता है, तो एक अलग प्रगति को अधिसूचना क्षेत्र में जोड़ा जाता है, जिससे उपयोगकर्ता को वर्तमान स्थिति की परवाह किए बिना वहां जाने की अनुमति मिलती है।
सूचना क्षेत्र में एक ProgressBar जोड़ने के लिए, आपको पहले एक XML संसाधन बनाने की आवश्यकता है, उदाहरण के लिए, यह:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingLeft="5dip" android:paddingRight="5dip"> <TextView android:id="@+id/text_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:textColor="@android:color/black" android:textStyle="bold" /> <ProgressBar android:id="@+id/status_progress" android:layout_width="fill_parent" android:layout_height="20dip" android:layout_centerVertical="true" android:progressDrawable="@android:drawable/progress_horizontal" android:indeterminate="false" android:indeterminateOnly="false" /> </RelativeLayout>
अगला, अधिसूचना क्षेत्र में एक नया लेआउट जोड़ें:
final Intent intent = new Intent(this, Main.class); final PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
बनाई गई प्रगति पट्टी के साथ काम करने के लिए, आप निम्नलिखित कोड का उपयोग कर सकते हैं:
नतीजतन, अधिसूचना क्षेत्र में सेल इस तरह दिखाई देगा:
पेशेवरों:- फिर से हम उपयोगकर्ता को ब्लॉक नहीं करते हैं।
- जैसा कि निर्णय संख्या 2 में है, प्रगति दिखाई गई है और उपयोगकर्ता को पता है कि कुछ हो रहा है।
- यह समाधान प्रोग्राम विंडो से बंधा नहीं है, अर्थात। इसे किसी भी विंडो से एक्सेस किया जा सकता है, जबकि विंडोज़ को स्वयं बदलने की आवश्यकता नहीं है।
- प्रगति दिखाने के लिए किसी अतिरिक्त विंडो स्थान की आवश्यकता नहीं है।
विपक्ष:- अधिसूचना क्षेत्र में अधिसूचना के प्रदर्शन के बाद पूरा हो गया है (केवल खुद को पूरा नहीं करता है, लेकिन केवल संदेश जो दिखाई दिया है), प्रगति दिखाई नहीं दे रही है, अर्थात्। उपयोगकर्ता को पता नहीं है कि कुछ हो रहा है या नहीं। इसका मतलब है कि उसे समय-समय पर वहां देखना होगा, जो बहुत सुविधाजनक नहीं हो सकता है।
- यह समाधान पर्याप्त सहज नहीं है।
- सभी गैर-प्रोग्रेसडियल सॉल्यूशंस के सामान्य माइनस: काम के तर्क की जटिलता (समाधान नंबर 1 देखें)।
निर्णय संख्या 4। एप्लिकेशन के टाइटल बार के अंदर प्रोग्रेसबार का उपयोग करें
इस समाधान का उपयोग कई उत्पादों में किया जाता है, उदाहरण के लिए,
गर्डर में ।
लागू करने के लिए, आपको सामग्री के साथ एक लेआउट बनाने की आवश्यकता है, मेरे मामले में यह केवल एक प्रगति है:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ProgressBar android:id="@+id/status_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/progressBarStyleSmallTitle" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:indeterminateOnly="true" android:visibility="invisible"/> </RelativeLayout>
और
ऑनक्रैट विधि में
, हमारे लेआउट के साथ मौजूदा टाइटल बार को अनुकूलित करें:
Window window = getWindow(); window.requestFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main);
अंत में, यह इस तरह दिखना चाहिए:

यह उदाहरण रियर कस्टम लेआउट के लिए डिज़ाइन किया गया है, अर्थात इस लेआउट में परिभाषित सभी सामग्री शीर्षक पट्टी पर जाएगी, अर्थात न केवल एक प्रोग्रेसबार, बल्कि यदि आपको इसकी आवश्यकता है, तो एक सरल विकल्प है:
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main); setProgressBarIndeterminateVisibility(true);
पेशेवरों:- फिर से हम उपयोगकर्ता को ब्लॉक नहीं करते हैं।
- निर्णय संख्या 3 के विपरीत, प्रगति हमेशा ध्यान देने योग्य होती है।
- जैसा कि निर्णय संख्या 2 और नंबर 3 में है, प्रगति दिखाई गई है और उपयोगकर्ता को पता है कि कुछ हो रहा है।
- प्रगति दिखाने के लिए किसी अतिरिक्त विंडो स्थान की आवश्यकता नहीं है।
विपक्ष:- प्रगति एक खिड़की से बंधा हुआ है, और यदि आपको इसे अलग-अलग खिड़कियों के बीच दिखाने की आवश्यकता है, तो आपको इसे अलग से प्रदान करना होगा।
- शीर्षक पट्टी सूचना क्षेत्र में ऊंचाई से नीच है और इसलिए इसमें कम जानकारी शामिल है, अन्यथा यह खराब रूप से अलग हो जाएगा।
- इस तरह का एक समाधान केवल शैलियों के एक मानक सेट के साथ खिताब के लिए उपयुक्त है। यानी TabHost के अंदर गतिविधि पर इसे संलग्न नहीं किया जा सकता है।
- सभी गैर-प्रोग्रेसडियल सॉल्यूशंस के सामान्य माइनस: काम के तर्क की जटिलता (समाधान नंबर 1 देखें)।
निर्णय संख्या 5। सभी समाधान का उपयोग करें
मेरी राय में, यह सबसे अच्छा समाधान है!
आपको केवल एक चीज का उपयोग करने की आवश्यकता नहीं है, यह सब समस्या के हल होने पर निर्भर करता है, यह कितना अच्छा लगता है। कभी-कभी यह कुछ भी नहीं दिखाने के लिए सबसे अच्छा है, कभी-कभी एक प्रोग्रेसियलॉग, कभी-कभी प्रोग्रेसबार की भिन्नता, और कभी-कभी कुछ और। मैं दोहराता हूं, यह
सब कार्य पर निर्भर करता है ।
एक निष्कर्ष के बजाय
यदि आप कोई निर्णय लेते हैं, तो विकास की सादगी के विचार से आगे न बढ़ें और अपने आप को उन निर्णयों तक सीमित न रखें जिन्हें आप जानते हैं, जानें। उपयोगकर्ताओं के बारे में सोचें कि वे कैसे अधिक सुविधाजनक और समझने योग्य होंगे, और वे निश्चित रूप से इसकी सराहना करेंगे।
यदि आप यहां प्रस्तुत समाधानों के अलावा अन्य समाधानों का उपयोग करते हैं, तो कृपया हमें उनके बारे में बताएं, मुझे लगता है कि कई Android डेवलपर्स ऐसे उदाहरणों में रुचि लेंगे।