基本的に、アプリケーション自体の開始時に大量のデータをダウンロードし、ListActivityに表示するアプリケーションを開発しています。私がやろうとしているのは、データがロードされるまでスプラッシュ画面を表示することです。
今まで私の試みはすべて無駄でした。 anddev.orgのメソッドを試してみましたが、私の問題は、メインアクティビティが開始されるはずですが、ListActivityを設定するまでスプラッシュスクリーンが表示されることです。要するに、次の手順を実行する必要があります。
あなたはそれがどのようなものか理解してほしい...
問題は、実行中のすべての作業と同じスレッドでスプラッシュ画面(何らかの種類の Dialog など ProgressDialog と仮定)を実行している可能性が高いです。これにより、スプラッシュ画面のビューが更新されなくなり、画面に表示されることさえなくなります。スプラッシュ画面を表示し、 AsyncTask のインスタンスを開始してすべてのデータをダウンロードし、タスクが完了したらスプラッシュ画面を非表示にする必要があります。
そのため、アクティビティの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にアクセスできません現在これを入力しています)。
参考までに、これはスプラッシュスクリーンを作成するために見つけた最良の方法です。 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>
そして、このテーマをメインアクティビティのテーマとして設定します...多田、最初の1秒からのスプラッシュスクリーン。
塗りつぶすために引き伸ばされる画像だけでなく、複雑な背景が必要な場合は、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;
}