80

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

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

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

それがどのようなものか理解していただければ幸いです。

4

5 に答える 5

89

問題は、実行中のすべての作業と同じスレッドでスプラッシュ スクリーン ( 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 にアクセスできません)。現在)。

Android の AsyncTasks に関するその他の優れた資料は、こちらこちらにあります。

于 2009-12-30T19:35:42.147 に答える
61

参考までに、これはスプラッシュ スクリーンを作成するために私が見つけた最良の方法です。

私は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>

そして、このテーマをあなたの主な活動のテーマとして設定してください... 多田、最初の 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>
于 2011-08-14T14:18:52.990 に答える
1
  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;
}
于 2013-02-07T15:03:36.310 に答える