メイン アクティビティ以外のアクティビティとメイン アクティビティのダイアログを使用して、2 つの異なる方法でスプラッシュ スクリーンを実装しました。
アクティビティを使用すると、スプラッシュからメイン アクティビティへの切り替え中に顕著な遅延が発生し、見栄えがよくありません。そこで、ダイアログを使ってみました。コードは以下に貼り付けます。スプラッシュ画面が表示され、そこにとどまります。ダイアログを閉じてメインレイアウトを表示するのではありません。
package com.example.splashscreen;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.app.Dialog;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
Dialog splashDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
showSplashScreen();
setContentView(R.layout.activity_main);
Log.i("dismiss dialog............ 1", "");
new InitializeTask().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* Shows the splash screen over the full Activity
*/
protected void showSplashScreen() {
splashDialog = new Dialog(this, R.style.SplashScreen);
splashDialog.setContentView(R.layout.splashscreen);
splashDialog.setCancelable(false);
splashDialog.show();
}
final class InitializeTask extends AsyncTask<Void, Void, Void>
{
protected void onPreExecute()
{
}
protected void onPostExecute() { // Dismiss dialog here
Log.i("dismiss dialog............", "");
splashDialog.dismiss();
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
return null;
}
}
}
コードはスプラッシュ画面を表示しますが、リストは表示しません。空のリストが表示されます。ただし、textview が含まれているときの activity_main は機能していました (mainactivity は ListActivity ではなく Activity から拡張されています)。activity_main レイアウトには、文字列配列エントリを含むリストビューが含まれるようになりました。リストが作成されていない理由を誰か教えてください。
package com.ngn.bcma;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.app.Dialog;
import android.app.ListActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
public class MainActivity extends ListActivity {
Dialog splashDialog;
private boolean isSplashShown = false;
public static final String VALUE_KEY = "splashShown";
//ListView mainMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
restoreValue(savedInstanceState);
// mainMenu = getListView();
Log.i("onCreate ................ ", "splash shown : "+isSplashShown);
if (isSplashShown) {
setContentView(R.layout.activity_main);
// Rebuild your UI with your saved state here
// String[] listItems = {"exploring", "android",
// "list", "activities"};
//
// ArrayAdapter adapter = new ArrayAdapter (this
// ,android.R.layout.simple_list_item_1, listItems);
// setListAdapter(adapter);
}
else {
showSplashScreen();
setContentView(R.layout.activity_main);
// Do your heavy loading here on a background thread
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
restoreValue(savedInstanceState);
Log.i("onRestoreInstanceState ................ ", "splash shown : "+isSplashShown);
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.i("onSaveInstanceState ................ ", "splash shown : "+isSplashShown);
outState.putBoolean("VALUE_KEY", isSplashShown); // TODO: move to strings
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
}
private void restoreValue(Bundle savedInstanceState){
if (savedInstanceState != null && savedInstanceState.containsKey(VALUE_KEY))
{
isSplashShown = savedInstanceState.getBoolean(VALUE_KEY);
}
}
/**
* Shows the splash screen over the full Activity
*/
protected void showSplashScreen() {
splashDialog = new Dialog(this, R.style.SplashScreen);
splashDialog.setContentView(R.layout.splashscreen);
splashDialog.setCancelable(false);
splashDialog.show();
isSplashShown = true;
// Set Runnable to remove splash screen just in case
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// new InitializeTask().execute();
removeSplashScreen();
}
}, 2000); // TODO: move to res
}
/**
* Removes the Dialog that displays the splash screen
*/
protected void removeSplashScreen() {
if (splashDialog != null) {
splashDialog.dismiss();
splashDialog = null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}