web-dev-qa-db-ja.com

Androidスプラッシュ画面

基本的に、アプリケーション自体の開始時に大量のデータをダウンロードし、ListActivityに表示するアプリケーションを開発しています。私がやろうとしているのは、データがロードされるまでスプラッシュ画面を表示することです。

今まで私の試みはすべて無駄でした。 anddev.orgのメソッドを試してみましたが、私の問題は、メインアクティビティが開始されるはずですが、ListActivityを設定するまでスプラッシュスクリーンが表示されることです。要するに、次の手順を実行する必要があります。

  1. メインアクティビティを開始します。
  2. スプラッシュ画面を表示します。
  3. バックグラウンドでプロセスを実行し続けます。
  4. 処理が完了したらスプラッシュスクリーンを終了し、メインリストを表示します。

あなたはそれがどのようなものか理解してほしい...

80
JaVadid

問題は、実行中のすべての作業と同じスレッドでスプラッシュ画面(何らかの種類の 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にアクセスできません現在これを入力しています)。

AndroidのAsyncTasksの主題に関するより良い読み物は、 here および here にあります。

89
Mark B

参考までに、これはスプラッシュスクリーンを作成するために見つけた最良の方法です。 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>
59
Raanan

スプラッシュスクリーンの例:

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);

    }

}
1
kablu
  1. メインアクティビティを開始します。
  2. スプラッシュ画面を表示します。
  3. バックグラウンドでプロセスを実行し続けます。
  4. 処理が完了したらスプラッシュスクリーンを終了し、メインリストを表示します。

私はこの方法を試しましたが、問題は次のとおりです。スプラッシュスクリーンアクティビティを開始する前にメインアクティビティが表示されます。

私はこのようにしました:

  1. スプラッシュ画面を起動します
  2. プロセスが完了したら、「メインアクティビティ」を開始します
  3. 戻るボタンを処理することを忘れないでください。したがって、メインアクティビティでアプリが押されると閉じます。それ以外の場合は、スプラッシュ画面に戻ります(ループ)

私の問題は、メニューボタンを押して「スプラッシュスクリーンアクティビティのメニューを表示」を無効にする方法です。

編集:

表示メニューを無効にします。

@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
Gabe