2012-10-23 15 views
7

ビューをそのアクティビティに切り替える前に、バックグラウンドで新しいアクティビティを読み込むことはできますか?アクティビティをバックグラウンドで読み込んだ後に表示する

たとえば、スラッシュスクリーンアクティビティを呼び出して、スプラッシュ画面を表示したいとします。このスプラッシュ画面が表示されている間、次のアクティビティがロードされ、ロードが完了すると(onCreate()が終了したとき)スプラッシュ画面アクティビティが終了し、新しいアクティビティが表示されます。

私は新しいアクティビティにスプラッシュ画面を表示し、スプラッシュイメージを削除する前にすべてのデータをロードするために非同期タスクを使用することをお勧めします...しかし、私もそのアプローチに固執しています。アクティビティは、まずかなりの量のデータをロードしなければならず、その後、そのデータに基づいてGUI要素を動的に追加する必要があります。 GUIが完全にロードされたら、私はスプラッシュ画面を削除したい。問題は、doInBackground()からUIスレッドに触れることができないことです。 doInBackgroundからUIを更新できない場合、スプラッシュ画面の下に自分のアクティビティを作成するにはどうすればよいですか?私はonProgressUpdate()がUIスレッドにアクセスできることを知っていますが、実装する方法を理解できません。

アイデア?ありがとうございました!

答えて

5

コードの例がないので、読み込んでいるデータの種類や、データに基づいてUIを動的に設定する方法はわかりませんが、できます。その結果、答えは少し一般的に聞こえるかもしれません。

最初に、2つのレイアウトxmlファイルを定義します.1つはスプラッシュ画面用、もう1つは「メイン」アクティビティ用です。あなたの非同期で

setContentView(R.layout.splash_screen); 

: だからあなたは/res/layout/splash_screen.xmlで終わるとあなたのonCreate()で

を/res/layout/main.xmlよ、splash_screenレイアウトをロードタスクを実行するには、実行する必要のあるデータをロードし、そのデータをすべての種類のデータ構造に保存します。私は例えばStringのLinkedListを使うつもりです。

private class MyTask extends AsyncTask<Uri, Integer, List<String>> { 

    @Override 
    protected List<String> doInBackground(Uri... params) { 
     List<String> myList = new LinkedList<String>(); 
     // load up the list with data you are trying to get 
     myList.add("foo"); 
     myList.add("bar"); 
     // whatever you return here will be passed in as a parameter to the onPostExecute() 
     return myList; 
    } 

    @Override 
    protected void onPostExecute(List<String> result) { 
     setContentView(R.layout.main2); 
     // set layout elements with data that from the result 
     TextView myTextView = (TextView) findViewById(R.id.some_label); 
     myTextView.setText(result.get(0)); 
     // or just call some function you defined in your activity instead 
    } 
} 

だから、基本的には、2つの異なるレイアウトファイルを持っているとsplash_screenレイアウトを使用し、負荷にデータを非同期タスクを使用して、ユーザーが定義し、いくつかのデータ構造にそれを保存し、あなたのUI要素をロードするために、そのデータ構造を使用しますsetContentView()を使用してメインレイアウトに戻ると、onPostExecute()に戻ります。

特別なメモ: 上記のコードを使用すると、スプラッシュ画面が再び表示され、画面を回転するとすべてのデータが再度読み込まれます。それを避けたい場合は、onSaveInstanceState()を使用して、必要なデータをoutBundleに保存し、そのデータをonCreateのsavedInstanceStateバンドルに読み込んで、UI要素をバックアップしてください。回転を処理する方法についてもっと知りたい場合は、別のスレッドが必要です(または単に検索することができます)。

+0

コードを共有できないNDAに署名したため、私はコードを提供できません。申し訳ありません。私は一般的に話すことができます。私は基本的に条件に応じてxmlをロードしています。そのxmlファイルは、表示する必要のある画像とその画像に結びついている情報を教えてくれます。返されたイメージのリストから動的にイメージビューを作成し、ビューに追加します。すべての画像が読み込まれるまでに2-3秒かかるので、すべてが読み込まれて対話できる状態になるまでスプラッシュを表示します。 – romamnmlst

+0

その場合、上記のdoInBackground()関数でXMLファイルを解析し、ImageViewを作成して画像ソースを設定し、doInBackground()関数からImageViewのリストを返すことができると思います。 onPostExecute()関数は、ImageViewsのリストを取得し、setContentView()の後にビュー階層に追加します。 onPostExecute()で行うことはメインスレッドで実行されるため、ここからUI要素を変更できます。 – hiBrianLee

+0

優秀、私はそのショットを与え、それがどのように動作するかを見てください。ありがとうございました! (それはしばらく時間がかかるかもしれませんが、うまくいけば、私は戻ってきて、あなたの答えを受け入れたものとしてマークしてください) – romamnmlst

1

あなたの問題を解決するソリューションの1つは、スプラッシュ画面とコンテンツを表示するために1つのアクティビティを使用することです。 setContentView()メソッドはいつでも呼び出すことができるので(onCreate()メソッドだけでなく)、別々のXMLファイルに必要なすべてのビューを定義し、切り替えようとしているときにsetContentView()に関連IDを渡します。

ビューとスプラッシュ画面で1つのレイアウトを使用したり、属性の表示/非表示を切り替えることもできます。あなたのデータが読み込まれているときに、あなたのスプラッシュ画面にsetVisibilityが表示され、ルートビューは見えないままです。ロードが完了したら、逆の方法で行います。

関連する問題