Android स्पलैशस्क्रीन


80

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

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

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

आशा है कि आप समझ गए होंगे कि यह कैसा है ...।


क्या कोई मुझे समझा सकता है कि एक प्रगति पट्टी भी लोड नहीं हो रही है, भले ही मैं इसे बनाने की कोशिश करूं और इसे मेरी मुख्य सूची के ऑनक्रिएट फंक्शन में शुरू करूं ... और मेरी प्रक्रिया पूरी होने के बाद इसे खारिज कर दूं ... यहां तक ​​कि यह काम नहीं कर रहा है ... मैं मतलब कोई डिफ़ॉल्ट कार्यप्रणाली है जिसका मुझे अनुसरण करने की आवश्यकता है ... जैसे OnStart () या कुछ में प्रगति पट्टी शुरू करना ??
JaVadid

क्या आपने कोशिश की कि stackoverflow.com/questions/2222890/… में स्वीकृत उत्तर क्या कहते हैं? संपादित करें: ठीक है, स्वीकृत उत्तर थोड़े ही है ..
noloman

जवाबों:


89

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

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

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

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 SDK तक पहुंच नहीं है क्योंकि मैं यह लिख रहा हूं वर्तमान में)।

Android में AsyncTasks के विषय पर कुछ और अच्छे पढ़ने को यहाँ और यहाँ पाया जा सकता है


"डेटा ऑब्जेक्ट के साथ बदलें" रिटर्न से आपका क्या मतलब है? मेरे अपने दो कार्य हैं जिन्हें मैं आपके कहे अनुसार अभ्रक में लोड करना चाहता हूं, लेकिन मुझे नहीं पता कि मुझे वापस लौटने के लिए क्या चाहिए। मैंने अशक्त लौटने की कोशिश की लेकिन ऐप क्रैश हो गया।
निक

AsyncTask <String, Void, Object> जहाँ ऑब्जेक्ट उस डेटा प्रकार का प्रतिनिधित्व करता है जिसे आप वापस करना चाहते हैं। यहां "AsyncTask के जेनेरिक प्रकार" अनुभाग देखें: developer.android.com/reference/android/os/AsyncTask.html
मार्क बी

यह पुराना है, मुझे पता है, लेकिन मैंने इसे लागू करने की कोशिश की है और ProgressDialog(मेरे मामले में एक नियमित डायलॉग जो एक लेआउट को लोड करता है) कभी नहीं दिखाया गया है। मैं केवल यह देखना है कि अगर मैं बाहर टिप्पणी .dismiss()में onPostExecute। पहली स्क्रीन जो मैं देख रहा हूं वह अभी भी MyActivityथीम है। इसके बाद यह सीधे चला जाता है R.layout.main
केविन_टीए

@Kevin_TA यदि .dismiss () इसे प्रदर्शित नहीं करने का कारण बन रहा है, तो आपका AsyncTask तुरंत समाप्त हो रहा है। मेरे द्वारा उल्लिखित विधि एक स्प्लैश स्क्रीन प्रदर्शित करने के लिए है जो दिखाती है कि कुछ लंबे समय तक चलने वाला स्टार्टअप कार्य चलता है।
मार्क बी

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

61

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

मैं काफी समय से इसे खोज रहा था, एंड्रॉइड डॉक्स से .. यदि आप उन काली स्क्रीन से बचना चाहते हैं, तो आपको विंडोबैक के साथ एक थीम बनाने की आवश्यकता है:

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

और इस विषय को अपनी मुख्य गतिविधि के लिए थीम के रूप में सेट करें ... टाडा, पहले दूसरे से छप।

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

<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
यह लिंक मृत है, लेकिन पेज की सामग्री और स्रोत कोड
आर्काइव.ऑर्ग

क्या एंड्रॉइड के लिए किसी ड्रॉबल के बजाय एक लेआउट.एक्सएमएल का उपयोग करने का एक तरीका है: windowBackground? मुझे ऐसा करने की कोशिश करते समय एक दुर्घटना हो जाती है, लेकिन मुझे आश्चर्य होता है कि क्या कोई हल है।
केविन_टीए

@Kevin_TA नहीं है। लेकिन आप ड्रॉइबल्स का उपयोग कर सकते हैं, इसलिए यदि आप स्क्रीन के बीच में एक लोगो रखना चाहते हैं तो आपको एक लेयर-लिस्ट ड्रा करने योग्य होना चाहिए और अपनी छवियों को स्थान देने के लिए गुरुत्वाकर्षण का उपयोग करना चाहिए। मैं एक उदाहरण के साथ उत्तर को अपडेट करूंगा।
राणायन

1
@ राना थीम समाधान मेरे लिए काम करता है, लेकिन मुझे विषय से परत-सूची कैसे कनेक्ट करनी चाहिए?
डेको

2
@deko आइटम का नाम = "android: windowBackground" या तो एक निश्चित रंग या छवि हो सकती है या आपके रेज / ड्रा करने योग्य फ़ोल्डर में रखी गई लेयर-लिस्ट जैसी xml ड्रॉबल हो सकती है। आप यहाँ
ड्राबल्स के

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

    }

}

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