0

メイン アクティビティ以外のアクティビティとメイン アクティビティのダイアログを使用して、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;
    }

}
4

1 に答える 1

3

おそらくonPostExecuteメソッドは呼び出されないので、AsyncTask onPostExecute メソッドを次のようにオーバーライドしていることを確認するために@Override前に置いてください。onPostExecute

@Override
protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    Log.i("dismiss dialog............", "");
    if(splashDialog.isShowing())
        splashDialog.dismiss(); 
  }
于 2013-05-24T06:55:33.067 に答える