我正在开发一个应用程序,它基本上会在应用程序本身的开头下载大量数据并将其显示在ListActivity中。我打算做的是显示一个启动画面,直到数据加载完毕。
直到现在我的所有尝试都是徒劳的。我试过anddev.org提到的方法,但我的问题是主Activity应该开始但是Splash Screen应该是可见的,直到我填充我的ListActivity。所以简而言之,我必须完成以下步骤:
希望你明白它是什么样的......
答案 0 :(得分:89)
问题很可能是你在所有工作的同一个线程中运行启动画面(某种Dialog,例如ProgressDialog我假设)。这将使得启动画面的视图不被更新,这可以防止它甚至被显示到屏幕上。您需要显示启动画面,启动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)我当前打字这个。)
答案 1 :(得分:59)
仅供参考,这是我发现制作启动画面的最佳方式: http://android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html
我正在搜索这个问题很长一段时间,来自orroids docs ..如果你想避免那些黑屏,你需要用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,第一秒的闪屏。
如果你想要一个复杂的背景,而不仅仅是一个可以拉伸填充的图像,你可以使用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>
答案 2 :(得分:1)
- 开始我的主要活动。
- 显示启动画面。
- 继续在后台运行该过程。
- 处理完成后退出启动画面并显示主列表。
醇>
我试过这种方式,但问题是;它将在启动启动画面活动之前显示主要活动。
我是这样做的:
我的问题是如何通过按菜单按钮禁用“显示启动画面活动的菜单”。
修改强>
停用展示菜单:
@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;
}
答案 3 :(得分: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);
}
}
答案 4 :(得分:0)
我知道这个问题已经很老了,OP 可能不再需要它了。但我只想添加这个答案来帮助可能需要它来存档启动画面的人。
实际上,在较新版本的 Android 中(Android Oreo 之后),它已经支持内置启动画面工具。这意味着您不需要创建额外的活动来做到这一点。你只需要一个可绘制的资源文件来展示。
使用这种方式可以更快地显示您的启动画面,并且在初始化后很快就会显示您的内容。但请注意,这仅适用于 Android Oreo 或更高版本。在以前的版本中,它会显示白色而不是启动画面(至少我是这么认为的)。
您的 AppTheme 样式中需要此行:
<item name="android:windowSplashscreenContent">@drawable/YOUR_SPLASH_SCREEN_DRAWABLE</item>
这是一个完整的例子:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<!-- Set your splash screen here, it accept a resource from drawable directory-->
<item name="android:windowSplashscreenContent" tools:targetApi="o">@drawable/splash_screen</item>
</style>
有关此属性的更多信息,请参阅此处的官方参考:https://developer.android.com/reference/android/R.attr#windowSplashscreenContent
正如它所说,它是在 API 级别 26 中添加的。
以及它所说内容的简短摘录:
<块引用>对用作窗口启动画面内容的可绘制对象的引用。此 drawable 将放置在 windowBackground
的顶部,其边界由系统栏插入。如果系统栏不应该插入可绘制对象,请使用全屏主题。
请注意,即使没有在主题上设置启动画面内容,系统仍可能使用主题上的其他属性显示启动画面,例如 windowBackground
。