2009-12-30 66 views
79

我正在開發一個應用程序,它基本上在應用程序本身開始時下載大量數據並將其顯示在ListActivity中。我打算做的是顯示一個閃屏直到數據加載。Android SplashScreen

直到現在,我所有的嘗試都是徒勞的。我試過anddev.org提到的方法,但我的問題是,主要的活動應該開始,但飛濺屏幕應該是可見的,直到我填充我的ListActivity。所以總之我必須經過以下步驟:

  1. 開始我的主要活動。
  2. 顯示啓動畫面。
  3. 繼續在後臺運行進程。
  4. 處理完成並退出主畫面時顯示主畫面。

希望你明白這就像....

+0

任何人能解釋Ÿ甚至一個進度條沒有加載,即使我嘗試在主列表的OnCreate函數中創建並啓動它...並在我的過程結束後關閉它...即使這不起作用...我的意思是有一個ny默認的方法,我需要遵循...就像在OnStart()中啓動進度條或者什麼? – JaVadid 2009-12-30 11:11:21

+0

你嘗試了什麼接受的答案在http://stackoverflow.com/questions/2222890/how-to-make-a-splash-screen-screen-visible-when-app-starts說?編輯:好吧,接受的答案是有點相同.. – noloman 2011-08-03 19:37:06

+0

看看這個http://www.gadgetsaint.com/android/create-video-splash-screen-android/ – ASP 2017-01-21 21:44:45

回答

89

的問題是最有可能的,你是在同一個線程中所有正在運行的啓動畫面(某種DialogProgressDialog我假設)正在完成的工作。這將保持啓動畫面的視圖不被更新,這可以防止它被顯示在屏幕上。您需要顯示啓動畫面,啓動AsyncTask的實例以下載所有數據,然後在任務完成後隱藏啓動畫面。

所以你的Activity的onCreate()方法只會創建一個ProgressDialog並顯示它。然後創建AsyncTask並啓動它。我將使AsyncTask成爲主Activity的內部類,因此它可以將已下載的數據存儲到Activity中的某個變量,並在其onPostExecute()方法中關閉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的主題可以找到一些更好的閱讀herehere

+0

你是什麼意思返回「替換數據對象「?我有兩個功能,我想加載在asynctask中,就像你說的,但我不知道我想要返回什麼。我試圖返回null,但應用程序崩潰。 – Nick 2012-02-13 23:26:37

+0

AsyncTask 其中,Object表示要返回的數據類型。請參閱這裏的「AsyncTask的泛型類型」部分:http://developer.android.com/reference/android/os/AsyncTask.html – 2012-02-14 00:14:33

+0

這是舊的,我知道,但我嘗試過實現這個和'ProgressDialog'(in我的情況是一個普通的加載佈局的對話框)從不顯示。我只看到它,如果我註釋掉'onPostExecute'中的'.dismiss()'。我看到的第一個屏幕仍然是「MyActivity」主題。之後,它直接進入'R.layout.main'。 – 2014-01-21 21:33:46

58

僅作參考,這是我發現做一個閃屏的最佳方式: http://android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

我正在尋找這個相當長的一段,從機器人文檔..如果你想避免那些黑色的屏幕,你需要創建一個主題,windowBackground這樣:

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

並設置這個主題從第一第二的主題爲您的主要活動...... TADA,閃屏。

如果你想有一個複雜的背景,而不是隻是一個形象,將被拉伸以填補你可以使用繪圖資源,這裏是一個層列表,將繼續與黑色背景爲中心的標誌的例子:

<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- bg-speed.html – Spoonface 2012-10-27 01:30:49

+0

@Spoonface謝謝,我更新了鏈接。 – Raanan 2012-11-13 19:01:49

+0

有沒有辦法使用layout.xml來代替android:windowBackground的drawable?我嘗試這樣做時遇到了崩潰,但我想知道是否有解決方法。 – 2014-01-22 19:12:44

1
  1. 開始我的主要活動。
  2. 顯示啓動畫面。
  3. 繼續在後臺運行進程。
  4. 處理完成並退出主畫面時顯示主畫面。

我試過這種方式,但問題是;它將在啓動啓動畫面活動之前顯示主要活動。

我做這樣說:

  1. 啓動閃屏
  2. 當過程被完成後,啓動了「主要活動」
  3. 不要忘了處理後退按鈕,所以它應該關閉應用程序ist將在主要活動中被按下。否則將回到初始屏幕(循環)

我的問題是如何通過按菜單按鈕禁用「顯示啓動畫面活動的菜單」。

編輯:

禁用顯示菜單:

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

    } 

}