2011-06-10 16 views
5

मैं एंड्रॉइड सीखने पर काम कर रहा हूं। दस्तावेजों से मैंने अब तक पढ़ा है, मैं यह नहीं समझ सकता कि स्पलैश कैसे दिखाना है दिखाने के लिए देखें (नींद के दौरान स्क्रीन खाली रहती है)। ऐसा प्रतीत होता है कि मुझे मुख्य लेआउट के लिए एक नई गतिविधि शुरू करने की आवश्यकता है, लेकिन यह अपमानजनक लगता है (स्पलैश हमेशा के लिए जाना चाहिए, मैं इसके धागे का पुन: उपयोग करना चाहता हूं)।एंड्रॉइड: स्पलैश स्क्रीन दिखाई नहीं दे रही है, क्यों?

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class Ext3 extends Activity { 

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

     Log.v("Ext3", "starting to sleep"); 

     try { 
      Thread.sleep (5000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     Log.v("Ext3", "done sleeping"); 

     setContentView (R.layout.main); 
    } 

} 

उत्तर

7

मैं अपने स्प्लैश स्क्रीन कभी नहीं दिखाया जाता है क्योंकि आप कभी नहीं यूआई धागा (है कि आप में हैं) यह आकर्षित करने के लिए जब से तुम सिर्फ वहाँ सोने के कुछ नहीं कर रहे एक मौका देने विश्वास करते हैं।

थ्रेड.sleep के बजाय, मैं सुझाव दूंगा कि आप Timer या रीफ्रेश शेड्यूल करने और अपने दृश्य की सामग्री को बदलने के लिए ऐसा कुछ देखें; एक विकल्प AsyncTask शुरू करना होगा जहां आप दृश्य को बदलने से पहले सो सकते हैं जैसा कि आप अभी कर रहे हैं।

सो मत या किसी अन्य तरीके से यूआई धागा ब्लॉक, कि बुरा है ... (ANR कारण बनता है)

+1

http देखें के लिए काम करता है: //www.anddev.org/simple_splash_screen-t811.html इसे पूरा करने के उदाहरणों के उदाहरण के लिए। – levis501

+0

तो जाहिर है कि मेरा दृढ़ विश्वास है कि समारोह को कॉल करने और उसके काम को वापस करने के बीच, गलत है। यह गंभीरता से उस मशीन मॉडल को बुलाता है जिसमें मैंने सवाल किया था। स्पष्ट रूप से धागा मेरे कोड से अधिक करता है। ये कार्य कब और कब हैं? – kasterma

+1

@kasterma - यह गतिविधि गतिविधि जीवन के तहत [गतिविधि दस्तावेज़] (http://developer.android.com/reference/android/app/Activity.html) में और [गतिविधि लाइफसाइकिल प्रबंधित करना] में वर्णित है (http: // क्रियाएँ गाइड के डेवलपर.android.com/guide/topics/fundamentals/activities.html#Lifecycle) अनुभाग। –

1

जब आप sleep ऐसा कहते हैं, आप यूआई धागा अवरुद्ध कर रहे हैं। इसके बजाय, Runnable में दूसरी कॉल setContentView पर रखें, हैंडलर बनाएं, और रननेबल चलाने के लिए हैंडलर की postDelayed विधि का उपयोग करें। कुछ इस तरह:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splash); 
    Runnable endSplash = new Runnable() { 
     @Override 
     public void run() { 
      setContentView (R.layout.main); 
     } 
    } 
    new Handler().postDelayed(endSplash, 5000L); 
} 
+0

@Matthieu द्वारा उत्तर में मेरी टिप्पणी देखें, मैं यूआई थ्रेड में नींद की अपेक्षा करता हूं ताकि किसी और बातचीत को अवरुद्ध कर सकें। लेकिन मैं पहले ही लेआउट सेट कर चुका हूं; मेरे मानसिक मॉडल के साथ मुझे अब कुछ भी अवरुद्ध करने में सक्षम नहीं होना चाहिए। – kasterma

+1

लेआउट सेट करना स्वचालित रूप से स्क्रीन को प्रस्तुत नहीं करता है। वह फ्रेमवर्क के भीतर कोड है जो 'ऑनक्रेट' रिटर्न के बाद निष्पादित करता है। चूंकि आप तब तक वापस नहीं आ रहे थे जब तक कि आपने सामग्री दृश्य को _changed_ नहीं किया था, स्प्लैश स्क्रीन को कभी मौका नहीं मिला था। ऐप के लिए पूरा यूआई नींद की अवधि के लिए रुक गया था। –

1

मैं अपने आवेदन में इस कोड की कोशिश की है और उसके काम करने की यह आपकी मदद करेगा होना perfectly.May।

public class SplashScreen extends Activity { 

    /** 
    * The thread to process splash screen events 
    */ 
    private Thread mSplashThread; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Splash screen view 
     setContentView(R.layout.splash); 



     final SplashScreen sPlashScreen = this; 

     // The thread to wait for splash screen events 
     mSplashThread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        synchronized (this) { 
         // Wait given period of time or exit on touch 
         wait(5000); 
        } 
       } catch (InterruptedException ex) { 
       } 

       finish(); 

       // Run next activity 
       Intent intent = new Intent(); 
       intent.setClass(sPlashScreen, MainActivity.class); 
       startActivity(intent); 
       stop(); 
      } 
     }; 

     mSplashThread.start(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     return false; 
    } 

    /** 
    * Processes splash screen touch events 
    */ 
    @Override 
    public boolean onTouchEvent(MotionEvent evt) { 
     if (evt.getAction() == MotionEvent.ACTION_DOWN) { 
      synchronized (mSplashThread) { 
       mSplashThread.notifyAll(); 
      } 
     } 
     return true; 
    } 

} 
+0

एक नई गतिविधि शुरू करना निश्चित रूप से एक नया धागा शुरू करने के बाद और अधिक काम है। – kasterma

+0

@ कस्टरमा - जरूरी नहीं। उस दृष्टिकोण के लिए बहुत कुछ कहना है। यह स्प्लैश स्क्रीन को मुख्य गतिविधि से अलग करता है, एक के लिए। इसके साथ मुख्य समस्या यह है कि एक स्प्लैश स्क्रीन का मुख्य उद्देश्य (मेरे विचार में) समय लेने वाली प्रारंभिकता करना है जो मुख्य दृश्य को तुरंत दिखने से रोक देगा। एक अलग स्पलैश गतिविधि में प्रारंभ करने का मतलब है कि प्रारंभिक डेटा को मुख्य गतिविधि में स्थानांतरित करना है। (एक तरफ, थ्रेड की रन() विधि में बहिष्कृत स्टॉप() विधि को कॉल करना गलत है; मुझे नहीं पता कि लोग ऐसा क्यों करते हैं।) –

0

यह डाल एक बुनियादी स्प्लैश स्क्रीन

public class Splash extends Activity { 

//private ProgressDialog pd = null; 
private final int SPLASH_DISPLAY_LENGTH = 3000; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.splashscreen); 
    //this.pd = ProgressDialog.show(this, "Initializing..", "Initializing Infraline...", true, false); 

    /* New Handler to start the InfralineTabWidget-Activity 
    * and close this Splash-Screen after some seconds.*/ 

    new Handler().postDelayed(new Runnable(){ 
     @Override 
     public void run() { 
     /* Create an Intent that will start the InfralineTabWidget-Activity. */ 
      Intent mainIntent = new Intent(Splash.this,InfralineTabWidget.class); 
      Splash.this.startActivity(mainIntent); 
      Splash.this.finish(); 
     } 
    }, SPLASH_DISPLAY_LENGTH); 

} 

} 

के लिए और अपने AndroidManifest.xml में टुकड़ा

<activity android:name=".Splash" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="orientation|keyboardHidden"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

है उम्मीद है कि यह आप :)

संबंधित मुद्दे