एंड्रॉइड स्पलैशस्क्रीन


79

मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जो मूल रूप से एप्लिकेशन की शुरुआत में बहुत से डेटा डाउनलोड करता है और इसे सूची एक्टिविटी में प्रदर्शित करता है। जो मैं करने की योजना बना रहा हूं वह डेटा लोड होने तक एक स्पलैश स्क्रीन दिखा रहा है।

अब तक मेरे सभी प्रयास व्यर्थ नहीं हैं। मैंने औरdev.org का उल्लेख विधियों का प्रयास किया, लेकिन मेरी समस्या यह है कि मुख्य गतिविधि शुरू होनी चाहिए, लेकिन जब तक मैं अपनी सूची सक्रियता को पॉप्युलेट नहीं करता तब तक स्पलैश स्क्रीन दिखाई देनी चाहिए। तो संक्षेप में मुझे निम्नलिखित चरणों से गुज़रना होगा:

  1. मेरी मुख्य गतिविधि शुरू करें।
  2. स्पलैश स्क्रीन दिखाएं।
  3. पृष्ठभूमि में प्रक्रिया को जारी रखें।
  4. पूरा होने पर स्प्लैशस्क्रीन से बाहर निकलें और मुख्य सूची दिखाएं।

आशा है कि आप समझ में यह कैसा है ....

  0

किसी y भी एक प्रगति बार लोड नहीं है, भले ही मैं करने की कोशिश की व्याख्या कर सकते इसे मेरी मुख्य सूची के ऑनक्रेट फ़ंक्शन में बनाएं और शुरू करें ... और मेरी प्रक्रिया समाप्त होने के बाद इसे खारिज कर दें ... यहां तक ​​कि यह काम नहीं कर रहा है ... मेरा मतलब है कि वहां कोई है ny डिफ़ॉल्ट पद्धति मुझे अनुवर्ती करने की आवश्यकता है ... जैसे ऑनस्टार्ट() या कुछ में प्रगति पट्टी शुरू करना ?? 30 dec. 092009-12-30 11:11:21

  0

क्या आपने कोशिश की है कि http://stackoverflow.com/questions/2222890/how-to-make-a-splash- स्क्रीन- स्क्रीन-visible-when-app-starts में स्वीकृत उत्तर क्या है? संपादित करें: ठीक है, स्वीकृत उत्तर थोडा ही है .. 03 aug. 112011-08-03 19:37:06

  0

इसे देखें http://www.gadgetsaint.com/android/create-video-splash-screen-android/ 21 jan. 172017-01-21 21:44:45

89

समस्या सबसे अधिक संभावना है कि आप सभी के रूप में ही धागे में स्प्लैश स्क्रीन (के Dialog ऐसे ProgressDialog के रूप में मुझे लगता है किसी प्रकार का) द्वारा चलाए जा रहे है काम किया जा रहा है। यह स्प्लैश स्क्रीन को अद्यतन होने से रोक देगा, जो इसे स्क्रीन पर प्रदर्शित होने से भी रोक सकता है। आपको स्प्लैश स्क्रीन प्रदर्शित करने की आवश्यकता है, अपने सभी डेटा डाउनलोड करने के लिए AsyncTask का एक उदाहरण बंद करें, फिर कार्य पूरा हो जाने के बाद स्पलैश स्क्रीन छुपाएं।

तो आपकी गतिविधि की ऑनक्रेट() विधि बस एक प्रोग्रेसडिअलॉग बनाएंगी और इसे दिखाएगी। फिर AsyncTask बनाएं और इसे शुरू करें। मैं AsyncTask को आपकी मुख्य गतिविधि का एक आंतरिक वर्ग बना दूंगा, इसलिए यह आपके गतिविधि में कुछ चर में डाउनलोड किए गए डेटा को संग्रहीत कर सकता है और प्रोग्रेसडिअलॉग को ऑनपोस्टएक्सक्यूट() विधि में बंद कर सकता है।

सुनिश्चित नहीं हैं कि सिर्फ कोड दिखाए बिना अब और विस्तृत करने के लिए कैसे है, तो यहाँ यह है:

public class MyActivity extends Activity { 
    private ProgressDialog pd = null; 
    private Object data = null; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Show the ProgressDialog on this thread 
     this.pd = ProgressDialog.show(this, "Working..", "Downloading Data...", true, false); 

     // Start a new thread that will download all the data 
     new DownloadTask().execute("Any parameters my download task needs here"); 
    } 

    private class DownloadTask extends AsyncTask<String, Void, Object> { 
     protected Object doInBackground(String... args) { 
      Log.i("MyApp", "Background thread starting"); 

      // This is where you would do all the work of downloading your data 

      return "replace this with your data object"; 
     } 

     protected void onPostExecute(Object result) { 
      // Pass the result data back to the main activity 
      MyActivity.this.data = result; 

      if (MyActivity.this.pd != null) { 
       MyActivity.this.pd.dismiss(); 
      } 
     } 
    }  
} 

जाहिर है वहाँ कुछ टुकड़े तुम वहाँ में भरने की जरूरत है, लेकिन इस कोड चलाने के लिए और आप एक अच्छे देना चाहिए शुरुआती बिंदु (मुझे कोड त्रुटि होने पर क्षमा करें, मेरे पास एंड्रॉइड एसडीके तक पहुंच नहीं है क्योंकि मैं इसे वर्तमान में टाइप कर रहा हूं)।

Android में AsyncTasks के विषय पर कुछ और अच्छी पढ़ाई here और here मिल सकती है।

  0

"डेटा के साथ प्रतिस्थापित करें" ऑब्जेक्ट "? मेरे पास मेरे दो कार्य हैं जिन्हें मैं asynctask में लोड करना चाहता हूं जैसे आपने कहा लेकिन मुझे नहीं पता कि मुझे वापस आने का क्या अनुमान है। मैंने शून्य वापस करने की कोशिश की लेकिन ऐप दुर्घटनाग्रस्त हो गया। 13 feb. 122012-02-13 23:26:37

  0

AsyncTask <स्ट्रिंग, शून्य, ऑब्जेक्ट> जहां ऑब्जेक्ट उस डेटा प्रकार का प्रतिनिधित्व करता है जिसे आप वापस करना चाहते हैं। यहां "AsyncTask के जेनेरिक प्रकार" अनुभाग देखें: http://developer.android.com/reference/android/os/AsyncTask.html 14 feb. 122012-02-14 00:14:33

  0

यह पुराना है, मुझे पता है, लेकिन मैंने इसे लागू करने का प्रयास किया है और 'प्रोग्रेसडिअलॉग' (इन मेरा मामला एक नियमित संवाद जो लेआउट लोड करता है) कभी नहीं दिखाया जाता है। मैं केवल इसे देखता हूं यदि मैं 'onPostExecute' में '.dismiss()' पर टिप्पणी करता हूं। पहली स्क्रीन जो मैं देखता हूं वह अभी भी 'माईएक्टिविटी' थीम है। इसके बाद यह सीधे 'R.layout.main' पर जाता है। 21 jan. 142014-01-21 21:33:46

  0

@Kevin_TA अगर .dismiss() इसे प्रदर्शित नहीं कर रहा है, तो आपका AsyncTask तुरंत समाप्त हो रहा है। जिस विधि को मैंने रेखांकित किया है वह एक स्प्लैश स्क्रीन प्रदर्शित करने के लिए है जो दिखाता है कि कुछ लंबे समय तक चलने वाले स्टार्टअप कार्य चलते हैं। 22 jan. 142014-01-22 16:39:38

  0

@mbaird यह तुरंत समाप्त नहीं हो रहा है।मेरे पास वास्तव में एक पृष्ठभूमि प्रक्रिया है जो पूरा होने में 2-3 सेकंड लगती है। हालांकि, किसी कारण से, यूआई पर कुछ भी अपडेट नहीं किया जाता है जब तक असिंक नहीं किया जाता है, इस प्रकार उद्देश्य को हराया जाता है। 22 jan. 142014-01-22 19:15:29

  0

@Kevin_TA तथ्य यह है कि .dismiss() कॉल तुरंत बंद कर रहा है, और .dismiss() कॉल पर पोस्ट होता है PostExecute() मुझे बताता है कि आप AsyncTask के रूप में अपनी पृष्ठभूमि प्रक्रिया नहीं चला रहे हैं। आपको यह सुनिश्चित करने की ज़रूरत है कि doInBackground() विधि आपकी पृष्ठभूमि प्रक्रिया पूरी होने तक वापस नहीं आती है। 23 jan. 142014-01-23 16:39:07

  0

क्या प्रोग्रेसडिअलॉग बॉक्स की बजाय पूर्ण स्क्रीन छवि (ड्रॉबल्स से) दिखाने का कोई तरीका है? 19 jul. 142014-07-19 09:28:26


58

सिर्फ संदर्भ के लिए इस का सबसे अच्छा तरीका मैं एक स्प्लैश स्क्रीन बनाने के लिए पाया है: http://android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

मैं काफी कुछ समय के लिए इस लिए खोज रहा था, एंड्रोइड्स से डॉक्स .. आप उन काले स्क्रीन से बचने के लिए चाहते हैं, प्रथम, द्वितीय से अपने मुख्य गतिविधि के लिए विषय ... टाडा, splashscreen के रूप में इस विषय सेट

<resources> 
    <style name="Theme.Shelves" parent="android:Theme"> 
     <item name="android:windowBackground">@drawable/background_shelf</item> 
     <item name="android:windowNoTitle">true</item> 
    </style> 
</resources> 

और: तुम इतनी windowBackground के साथ एक विषय बनाने के लिए की जरूरत है।

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item android:drawable="@color/black"> 
    </item> 
    <item> 
     <bitmap 
      android:gravity="center" 
      android:src="@drawable/logo" 
      android:tileMode="disabled" > 
     </bitmap> 
    </item> 
</layer-list> 
:

आप एक जटिल पृष्ठभूमि और न सिर्फ एक छवि है कि आप को भरने के लिए ड्रॉएबल उपयोग कर सकते हैं फैला हो जाएगा चाहते हैं, यहाँ एक परत-सूची है कि लोगो एक काले रंग की पृष्ठभूमि के साथ केंद्रित रखेंगे का एक उदाहरण है

+1

यह लिंक मर चुका है, लेकिन पृष्ठ सामग्री और स्रोत कोड archive.org पर उपलब्ध है: http://web.archive.org/web/20101113015720/http://developer.android.com/resources/articles/window- बीजी-speed.html 27 oct. 122012-10-27 01:30:49

  0

@Spoonface धन्यवाद, मैंने लिंक अपडेट किया। 13 nov. 122012-11-13 19:01:49

  0

क्या एंड्रॉइड के लिए एक ड्रायबल के बजाय layout.xml का उपयोग करने का कोई तरीका है: windowBackground? ऐसा करने की कोशिश करते समय मुझे दुर्घटना हो जाती है, लेकिन मुझे आश्चर्य है कि कोई कामकाज है या नहीं। 22 jan. 142014-01-22 19:12:44

  0

@ केविन_TA कोई नहीं है। लेकिन आप Drawables का उपयोग कर सकते हैं ताकि यदि आप स्क्रीन के बीच में लोगो रखना चाहते हैं तो आपको एक परत-सूची को खींचने योग्य और अपनी छवियों को स्थानांतरित करने के लिए गुरुत्वाकर्षण का उपयोग करना चाहिए। मैं एक उदाहरण के साथ जवाब अद्यतन करेंगे। 23 jan. 142014-01-23 14:44:08

  0

@Ranaan थीम समाधान मेरे लिए काम करता है, लेकिन मुझे थीम में लेयर-लिस्ट को कैसे कनेक्ट करना चाहिए? 08 apr. 142014-04-08 08:13:35

+1

@ डेको आइटम नाम = "एंड्रॉइड: विंडोबैकग्राउंड" या तो एक निश्चित रंग या छवि या एक एक्सएमएल ड्रायबल हो सकता है जैसे आपके res/drawable फ़ोल्डर में रखी गई परत-सूची। आप यहां Drawables के बारे में पढ़ सकते हैं: http://developer.android.com/guide/topics/resources/drawable-resource.html 08 apr. 142014-04-08 09:32:28

  0

@Ranaan मैंने कोशिश की, लेकिन मेरा ऐप अपवाद के साथ शुरू में क्रैश हो गया: बाइनरी एक्सएमएल फ़ाइल लाइन # 18: <bitmap> के लिए एक मान्य स्रोत विशेषता 08 apr. 142014-04-08 12:24:53

  0

ठीक है, आप बिटमैप src में क्या आपूर्ति कर रहे हैं? यह एक छवि होनी चाहिए जो उपलब्ध है। (आपको एक नया प्रश्न खोलना चाहिए) 08 apr. 142014-04-08 12:47:20

  0

@ राणान आप सही हैं, मैंने किया: http://stackoverflow.com/questions/22940232/android-splash-screen-how-to-make-it-centered 08 apr. 142014-04-08 14:34:57

  0

यह है सही उत्तर ! अच्छा काम! 31 mar. 152015-03-31 16:39:11

  0

यह स्वीकार्य उत्तर होना चाहिए! कई बिंदुओं से यह अन्य समाधानों की तुलना में अधिक अनुकूल है। 18 feb. 162016-02-18 11:13:02

  0

हाँ असली स्प्लैश स्क्रीन है। अनेक अनेक धन्यवाद 16 apr. 162016-04-16 17:34:45


1
  1. मेरी मुख्य गतिविधि शुरू करें।
  2. स्पलैश स्क्रीन दिखाएं।
  3. पृष्ठभूमि में प्रक्रिया को जारी रखें।
  4. पूरा होने पर स्प्लैशस्क्रीन से बाहर निकलें और मुख्य सूची दिखाएं।

मैंने इस तरह से प्रयास किया, लेकिन समस्या यह है; स्प्लैश स्क्रीन गतिविधि शुरू करने से पहले यह मुख्य गतिविधि दिखाएगा।

मैं इसे इस तरह बनाया:

  1. प्रारंभ स्प्लैश स्क्रीन
  2. जब प्रक्रिया पूरा हो जाता है, "मुख्य गतिविधि"
  3. वापस बटन को संभालने के लिए मत भूलना, तो यह बंद हो जाना चाहिए शुरू मुख्य गतिविधि में ऐप आईएसटी दबाया जाएगा। अन्यथा स्प्लैश स्क्रीन (लूप)

मेरी समस्या यह है कि मेनू-बटन दबाकर "स्पलैश स्क्रीन गतिविधि का मेनू दिखाएं" को अक्षम करने का तरीका है।

संपादित करें:

शो मेनू अक्षम:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // getMenuInflater().inflate(R.menu.activity_main, menu); 
    return false; 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) {  
    // return super.onMenuItemSelected(featureId, item); 
    return false; 
} 

1

स्प्लैश स्क्रीन उदाहरण:

public class MainActivity extends Activity { 
    private ImageView splashImageView; 
    boolean splashloading = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     splashImageView = new ImageView(this); 
     splashImageView.setScaleType(ScaleType.FIT_XY); 
     splashImageView.setImageResource(R.drawable.ic_launcher); 
     setContentView(splashImageView); 
     splashloading = true; 
     Handler h = new Handler(); 
     h.postDelayed(new Runnable() { 
      public void run() { 
       splashloading = false; 
       setContentView(R.layout.activity_main); 
      } 

     }, 3000); 

    } 

}