[英]Android Splash screen
我已經通過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;
}
}
}
該代碼顯示初始屏幕,但不顯示列表,它顯示空白列表。 但是activity_main包含文本視圖時正在運行(mainactivity是從Activity而不是ListActivity擴展的)。 現在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;
}
}
大概onPostExecute
不叫方法,因此只是把@Override
之前onPostExecute
,以確保您要重寫的AsyncTask onPostExecute方法為:
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.i("dismiss dialog............", "");
if(splashDialog.isShowing())
splashDialog.dismiss();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.