我正在开发一个应用程序,它基本上会在应用程序本身的开始处下载大量数据,并将其显示在ListActivity中。我打算做的是显示一个启动屏幕,直到加载数据。
到现在为止,我所有的尝试都是徒劳的。我尝试了anddev.org提到的方法,但是我的问题是主要的Activity应该启动,但在我填充ListActivity之前,初始屏幕应该可见。简而言之,我必须执行以下步骤:
- 开始我的主要活动。
- 显示启动画面。
- 继续在后台运行该过程。
- 处理完成后退出启动画面,并显示主列表。
希望你了解它的样子。
我正在开发一个应用程序,它基本上会在应用程序本身的开始处下载大量数据,并将其显示在ListActivity中。我打算做的是显示一个启动屏幕,直到加载数据。
到现在为止,我所有的尝试都是徒劳的。我尝试了anddev.org提到的方法,但是我的问题是主要的Activity应该启动,但在我填充ListActivity之前,初始屏幕应该可见。简而言之,我必须执行以下步骤:
希望你了解它的样子。
Answers:
问题很可能是您在完成所有工作的同时在同一线程中运行启动屏幕(某种对话框,例如我假设的ProgressDialog)。这将使初始屏幕的视图不会被更新,甚至可以使其不显示在屏幕上。您需要显示初始屏幕,启动AsyncTask的实例以下载所有数据,然后在任务完成后隐藏初始屏幕。
因此,您Activity的onCreate()方法将只创建一个ProgressDialog并显示它。然后创建AsyncTask并启动它。我将AsyncTask设置为主活动的内部类,以便它可以将已下载的数据存储到活动中的某个变量中,并在其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)目前)。
ProgressDialog
(在我的情况下,是一个常规的Dialog加载布局)从未显示。只有在.dismiss()
中删除时,我才能看到它onPostExecute
。我看到的第一个屏幕仍然是MyActivity
主题。之后,它直接进入R.layout.main
。
仅供参考,这是我发现制作初始屏幕的最佳方法:http : //android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html
我在Android文档中搜索了很长时间。如果您想避免黑屏,则需要使用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>
启动画面示例:
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);
}
}
- 开始我的主要活动。
- 显示启动画面。
- 继续在后台运行该过程。
- 处理完成后退出启动画面,并显示主列表。
我尝试过这种方式,但是问题是;在启动初始屏幕活动之前,它将显示主要活动。
我是这样写的:
我的问题是如何通过按菜单按钮禁用“显示启动画面的菜单”。
编辑:
禁用显示菜单:
@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;
}