Android SplashScreen


79

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

これまで私の試みは無益でした。私はanddev.orgがメソッドを記述しようとしましたが、私の問題は主アクティビティが開始するはずですが、スプラッシュスクリーンはListActivityを埋めるまで表示する必要があります。つまり、私は次のステップを経なければなりません。

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

は問題はあなたがすべてと同じスレッドでスプラッシュ画面(例えば、私が想定しProgressDialogとしてDialogのいくつかの並べ替え)を実行している可能性が最も高い

  0

私がしようと誰もがプログレスバーでもロードされていなくても、Yを説明することができます私のメインリストのOnCreate機能でそれを作成して起動してください...そして、プロセスが終了した後にそれを却下してください...これは動作していません...私はそこにnyのデフォルトの方法論に従う必要があります... OnStart()や何かのプログレスバーを開始するのと同じですか? 30 12月. 092009-12-30 11:11:21

  0

これを確認してくださいhttp://www.gadgetsaint.com/android/create-video-splash-screen-android/ 21 1月. 172017-01-21 21:44:45

89

....あなたはそれがどのようなものであるか理解してほしいです仕事が終わった。これにより、スプラッシュ画面の表示が更新されず、画面に表示されなくなることがあります。スプラッシュ画面を表示し、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に関するより良い情報は、herehereです。ただ、この参照用

  0

あなたが返す "オブジェクト "?私はasynctaskにロードしたい2つの関数を持っていますが、私は何を返すかはわかりません。 nullを返そうとしましたが、アプリがクラッシュしました。 13 2月. 122012-02-13 23:26:37

  0

AsyncTask <String、Void、Object>ここで、Objectは返すデータ型を表します。ここでは、AsyncTaskのジェネリック型のセクションを参照してください:http://developer.android.com/reference/android/os/AsyncTask.html 14 2月. 122012-02-14 00:14:33

  0

これは古いですが、私はこれと 'ProgressDialog'を実装しようとしました(in私の場合、レイアウトを読み込む通常のダイアログ)は決して表示されません。私は 'onPostExecute'の' .dismiss() 'をコメントアウトするだけです。私が見る最初の画面はまだ 'MyActivity'のテーマです。その後、 'R.layout.main'にまっすぐ進みます。 21 1月. 142014-01-21 21:33:46

  0

@Kevin_TA .dismiss()が表示されない場合、AsyncTaskは直ちに終了します。私が概説した方法は、いくつかの長時間実行されている起動タスクが実行されていることを示すスプラッシュ画面を表示するためのものです。 22 1月. 142014-01-22 16:39:38

  0

@mbairdすぐに終了しません。私は実際に完了するのに2〜3秒かかるバックグラウンドプロセスを持っています。しかし何らかの理由で、Asyncが完了するまでUIの何も更新されず、目的が破られます。 22 1月. 142014-01-22 19:15:29

  0

@Kevin_TA .dismiss()コールが直ちにそれを閉じるという事実と、onPostExecute()で.dismiss()コールが発生すると、バックグラウンドプロセスがAsyncTaskとして実行されていないことがわかります。バックグラウンド処理が完了するまでdoInBackground()メソッドが返されないようにする必要があります。 23 1月. 142014-01-23 16:39:07

  0

ProgressDialogボックスの代わりにフルスクリーンイメージ(ドロワーブルから)を表示する方法はありますか? 19 7月. 142014-07-19 09:28:26


58

私はスプラッシュスクリーンを作るために発見された最良の方法です: 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> 

そして、あなたの主な活動のテーマ...多田、第一、第二からスプラッシュスクリーンとしてこのテーマを設定します。

<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> 
:あなたはドローアブルを使用することができ埋めるように引き伸ばされる複雑な背景だけでなく、画像が必要な場合

は、ここで黒の背景に中心ロゴを維持するレイヤーリストの例であります

+1

このリンクは無効ですが、ページのコンテンツとソースコードはarchive.orgにあります:http://web.archive.org/web/20101113015720/http://developer.android.com/resources/articles/window- bg-speed.html 27 10月. 122012-10-27 01:30:49

  0

@Spoonfaceありがとう、私はリンクを更新しました。 13 11月. 122012-11-13 19:01:49

  0

android:drawBackableの代わりにlayout.xmlを使用する方法はありますか?そうしようとするとクラッシュしますが、回避策があるのだろうかと思います。 22 1月. 142014-01-22 19:12:44

  0

@Kevin_TAいいえありません。 Drawablesを使うことができますので、画面の中央にロゴを表示したい場合は、レイヤーリストドロワブルを使用し、重力を使って画像を配置する必要があります。答えを例で更新します。 23 1月. 142014-01-23 14:44:08

  0

@Ranaanテーマの解決策は私には役立ちますが、どのようにレイヤーリストをテーマに関連付ける必要がありますか? 08 4月. 142014-04-08 08:13:35

+1

@deko item name = "android:windowBackground"は固定カラーまたはイメージ、またはres/drawableフォルダに配置されたレイヤリストのようなxml描画可能なものです。 Drawablesについては、http://developer.android.com/guide/topics/resources/drawable-resource.html 08 4月. 142014-04-08 09:32:28

  0

@Ranaanを読んでみることができますが、私のアプリは例外的に起動時にクラッシュします。バイナリXMLファイル行# 18:<bitmap>には有効なsrc属性が必要です 08 4月. 142014-04-08 12:24:53

  0

ビットマップsrcには何を供給していますか?利用可能なイメージでなければなりません。 (あなたは新しい質問を開くべきです) 08 4月. 142014-04-08 12:47:20

  0

@Ranaanあなたは正しいです、私はそうしました:http://stackoverflow.com/questions/22940232/android-splash-screen-how-to-make-it-centered 08 4月. 142014-04-08 14:34:57

  0

これは正解 !よくやった! 31 3月. 152015-03-31 16:39:11

  0

これは受け入れられる回答である必要があります!多くの観点から、これは他のソリューションよりも最適です。 18 2月. 162016-02-18 11:13:02

  0

それは本当のスプラッシュ画面です。ありがとう 16 4月. 162016-04-16 17:34:45


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

私はこの方法を試しましたが、問題があります。スプラッシュ画面のアクティビティを開始する前に主なアクティビティが表示されます。

は、私はそれをこのように作られた:

  1. スタートスプラッシュ画面を
  2. 処理が完了します場合は、「主な活動」それが閉じる必要がありますので
  3. は、[戻る]ボタンを処理することを忘れないでくださいを開始メインアクティビティでApp istが押されます。それ以外の場合はスプラッシュ画面(ループ)に戻る

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

編集:

無効にショーメニュー:

@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

スプラッシュ画面例:

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

    } 

}