Android的SplashScreen
我正在开发一个应用程序,它基本上在应用程序本身开始时下载了大量数据,并将其显示在ListActivity中。 我打算做的是显示一个闪屏直到数据加载。
直到现在我所有的尝试都是徒劳的。 我试过anddev.org提到的方法,但我的问题是主要的活动应该开始,但飞溅屏幕应该是可见的,直到我填充我的ListActivity。 所以总之我要经过以下步骤:
- 开始我的主要活动。
- 显示启animation面。
- 继续在后台运行进程。
- 处理完成后退出Splashscreen并显示主列表。
希望你明白它是什么样的….
这个问题很可能是你正在运行初始屏幕(某种对话框,比如我所假设的ProgressDialog ),它与所有正在执行的工作在同一个线程中运行。 这将保持启animation面的视图不被更新,这可以防止它被显示在屏幕上。 您需要显示启animation面,启动AsyncTask的实例以下载所有数据,然后在任务完成后隐藏启animation面。
所以你的Activity的onCreate()方法只会创build一个ProgressDialog并显示它。 然后创buildAsyncTask并启动它。 我将使AsyncTask成为主Activity的内部类,因此它可以将已下载的数据存储到Activity中的某个variables中,并在其onPostExecute()方法中closuresProgressDialog。
不知道如何详细说明,而不显示代码,所以这里是:
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,因为我input这个目前)。
在这里和这里可以find更多关于Android中AsyncTasks的主题。
仅供参考,这是我发现做闪屏的最佳方式: http : //android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html
我一直在寻找这个从androids文档的相当长一段时间..如果你想避免这些黑屏,你需要创build一个与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,从第一秒的splashscreen。
如果你想要一个复杂的背景,而不只是一个图像,将被拉伸填充,你可以使用Drawables,这里是一个层次列表的例子,将保持中心黑色背景的标志:
<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>
闪屏示例:
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); } }
- 开始我的主要活动。
- 显示启animation面。
- 继续在后台运行进程。
- 处理完成后退出Splashscreen并显示主列表。
我试过这种方法,但问题是, 它将在启动启animation面活动之前显示主要活动。
我这样做了:
- 启动Splash屏幕
- 当进程完成时,启动“主要活动”
- 不要忘记处理后退button,所以它应该closures应用程序ist将在主要活动中按下。 否则会回到启animation面(循环)
我的问题是如何禁用“显示启animation面活动的菜单”按下菜单button。
编辑:
禁用显示菜单:
@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; }
- 通过代码将宽度设置为用于TextView的wrap_content
- 如何在使用attr / selectableItemBackground作为背景时修改纹波颜色?
- 在android中编辑文本格式的信用卡
- 在Android WebView中播放Youtube HTML5embedded式video
- onMeasure自定义视图说明
- Android:如何创buildNexus10的Android模拟器?
- 这个应用程序没有configurationAndroid密钥散列。 – 使用Facebook SDK进行login
- 已经使用id 0pipe理GoogleApiClient在FRAGMENT中
- 查找和纠正大堆大小的原因