2013-05-24 5 views
0

Я реализовал экран заставки двумя разными способами, используя активность, отличную от основной деятельности, и используя диалог в основном действии.Android Splash screen

При использовании активности наблюдается заметная задержка при переключении с всплеска на основную активность, которая выглядит не очень хорошо. Итак, я попытался использовать Dialogs. Код будет вставлен ниже. Он просто показывает заставку и остается там. Это не отклоняет диалог и не показывает основной макет.

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 имеет listview со строковыми массивами. Пожалуйста, дайте мне знать, почему список не заполнен.

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

} 
+0

я предлагаю вам использовать обработчик для заставки – Raghunandan

+0

посмотреть Http://stackoverflow.com/questions/5025734/how-to-implement-splash-screen-in-android?rq=1 –

+0

вы можете сделать, как предложено @ ρяσѕρєя K., но ваш doInBackground() ничего не делает. Таким образом, нет задержек, и ваш диалог немедленно отклоняется. Я предлагаю вам немного задержки, чтобы пользователь мог увидеть отклоненный диалог. – Raghunandan

ответ

3

вероятно onPostExecute метод не называется так просто поставить @Override перед тем onPostExecute, чтобы убедиться, что вы Переопределение метода AsyncTask onPostExecute как:

@Override 
protected void onPostExecute(Void result) { 
    super.onPostExecute(result); 
    Log.i("dismiss dialog............", ""); 
    if(splashDialog.isShowing()) 
     splashDialog.dismiss(); 
    } 
+1

не задерживается, поэтому диалог сразу же будет уволен? doinbackground() ничего не делает – Raghunandan

+0

@ Raghunandan: как вы можете видеть вопрос OP говорит, что Dialog не закрывается, а не показывает, поэтому мой ответ соответствует вопросу. спасибо за предложение –

+0

yup вы правы насчет вопроса и ответ отправлен. согласились. + 1 – Raghunandan