2009-12-30 33 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); 

    } 

}