2012-09-13 16 views
7

Necesito una pantalla de bienvenida para mi aplicación. Intenté crear una actividad que tenía la imagen para mi pantalla de bienvenida; e intenté usar for loop y la clase Timer para introducir un retraso de tiempo. Pero no funcionó de esa manera. ¿Lo estoy haciendo mal? si es así, ¿cuál es el camino correcto?¿La mejor manera de tener una pantalla de bienvenida en una aplicación de Android?

+0

¿Qué no funcionó específicamente sobre el temporizador? Ese enfoque debería funcionar. ¿Puedes pegar tu código? –

+0

posible duplicar http://stackoverflow.com/questions/8642730/splash-screen-in-android-application –

+0

Debería publicar su respuesta si es diferente de la otra pregunta, o eliminar la publicación si es la misma. – Sababado

Respuesta

16

Las soluciones anteriores son buenas, pero ¿qué ocurre si el usuario presiona la tecla de retroceso (y cierra la aplicación) antes de que finalice el retardo de salpicadura? La aplicación probablemente todavía abra la siguiente actividad, que no es realmente fácil de usar.

Es por eso que trabajo con un controlador personalizado y elimino cualquier mensaje pendiente en onDestroy().

public class SplashActivity extends Activity 
{ 
    private final static int MSG_CONTINUE = 1234; 
    private final static long DELAY = 2000; 

    @Override 
    protected void onCreate(Bundle args) 
    { 
     super.onCreate(args); 
     setContentView(R.layout.activity_splash); 

     mHandler.sendEmptyMessageDelayed(MSG_CONTINUE, DELAY); 
    } 

    @Override 
    protected void onDestroy() 
    { 
     mHandler.removeMessages(MSG_CONTINUE);  
     super.onDestroy(); 
    } 

    private void _continue() 
    { 
     startActivity(new Intent(this, SomeOtherActivity.class)); 
     finish(); 
    } 

    private final Handler mHandler = new Handler() 
    { 
     public void handleMessage(android.os.Message msg) 
     { 
      switch(msg.what){ 
       case MSG_CONTINUE: 
        _continue(); 
        break; 
      } 
     } 
    }; 
} 
+0

Creo que OnPause es una mejor opción para la llamada a removeMessages(). Descubrí que onDestroy se llama demasiado tarde en el ciclo de vida y la actividad siguiente aparece después de hacer clic atrás. +1 a pesar de :-) – barry

1

¿Podría simplemente retrasar?

Thread delay = new Thread() { 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
     } 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       startNextActivity(); 
      } 
     }); 
    } 
}; 
3

Prueba este

public class SplashActivity extends Activity { 
    Handler handler; 
    private long timeDelay = 2000; //2 seconds 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.SplashLayout); 
     final Intent i = new Intent(this, Landing.class); 
     handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
       startActivity(i); 
       finish(); 
      } 
     }, timeDelay); 
    }  
} 
1

probar esto,

protected int _splashTime = 15000; 

private Handler handler; 
private Runnable runnable; 

private Context context; 


@Override 
public void onCreate(Bundle savedInstance) 
{ 
    super.onCreate(savedInstance); 
    setContentView(R.layout.splash); 

    final SplashScreen sPlashScreen = this; 

    handler = new Handler(); 

    runnable = new Runnable() { 
     @Override 
      public void run() { 
      try { 
       handler.removeCallbacks(runnable); 
       handler.postDelayed(runnable, _splashTime); 
       } 
      finally { 
       finish(); 
       //start a new activity 

       //mtdCheckLicense(); 
       Intent main = new Intent(); 
       main.setClass(sPlashScreen, YourMainActivity.class); 
       startActivity(main); 
       handler.removeCallbacks(runnable); 

      } 
     } 
    }; 
    handler.postDelayed(runnable, 2000); 
} 

Se salpicará desde hace algún tiempo y poner en marcha la actividad principal. En este código, la pantalla de bienvenida espera 2 segundos y luego inicia la actividad principal.

0

La forma más sencilla que hago para mi cada proyecto es se parece a esto:

public class SplashActivity extends Activity { 
    protected boolean active = true; 
    protected int splashTime = 1000; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.splash_screen); 
     Thread splashTread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        int waited = 0; 
        while(active && (waited < splashTime)) { 
         sleep(100); 
         if(active) { 
          waited += 100; 
         } 
        } 
       } catch(InterruptedException e) { 
        // do nothing 
       } finally { 
        finish(); 
        // Start your Activity here 
       } 
      } 
     }; 
     splashTread.start();  
    } 
//... 
0

Con las soluciones descritas aquí se está perdiendo el tiempo, ya que una pausa en la inicialización para 2-3seconds antes de que continúen .

Prefiero agregar un Splash Screen Layout en la parte superior de mi main_activity.xml. Detecto el primer inicio de la aplicación extendiendo la aplicación. Si Está el primer arranque, muestro mi pantalla de bienvenida mientras que la interfaz de usuario es construir en el fondo ... (Use subprocesos en segundo plano si el ProgressBar se queda!)

//Extend Application to save the value. You could also use getter/setter for this instead of Shared Preferences... 
public class YourApplication extends Application { 

    public static final String YOUR_APP_STARTUP = "APP_FIRST_START"; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     //set SharedPreference value to true 
     SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     SharedPreferences.Editor editor = mPreferences.edit(); 
     editor.putBoolean(YOUR_APP_STARTUP, true); 
     editor.apply();  
     ...  
    } 

Comprobar para su primera apertura en su MainActivity

public class YourMainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //hide actionbar and other menu which could overlay the splash screen 
    getActionBar().hide(); 

    setContentView(R.layout.activity_main); 

    Boolean firstStart = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(TVApplication.YOUR_APP_STARTUP, true); 

    if (firstStart) { 
     //First app start, show splash screen an hide it after 5000ms 
     final RelativeLayout mSplashScreen = (RelativeLayout) findViewById(R.id.splash_screen); 
     mSplashScreen.setVisibility(View.VISIBLE); 
     mSplashScreen.setAlpha(1.0f); 
     final FrameLayout mFrame = (FrameLayout) findViewById(R.id.frame_container); 
     mFrame.setAlpha(0.0f); 

     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Animation fadeOutAnimation = AnimationUtils.loadAnimation(getApplicationContext(), 
         R.anim.fade_out_animation); 
       fadeOutAnimation.setDuration(500); 
       fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() { 

        @Override 
        public void onAnimationStart(Animation animation) { 
         mFrame.setAlpha(1.0f); 
         getActionBar().show(); 
        } 

        @Override 
        public void onAnimationEnd(Animation animation) { 
         mSplashScreen.setVisibility(View.GONE); 
        } 

        @Override 
        public void onAnimationRepeat(Animation animation) { 

        } 
       }); 
       mSplashScreen.startAnimation(fadeOutAnimation); 
      } 
     }, 5000); //<-- time of Splash Screen shown 

    } else { 
     ((RelativeLayout) findViewById(R.id.splash_screen)).setVisibility(View.GONE); 
     getActionBar().show(); 
    } 

Inserte la pantalla SplashScreen en la parte superior de su main.xml. Prefiero RelativeLayout para eso. En el ejemplo, SplashScreen se coloca en un diseño con el Navitgation Drawer, que realmente nos encanta, ¿verdad?

//main_activity.xml 
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

     <!-- The main content view --> 

     <FrameLayout 
      android:id="@+id/frame_container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <!-- The navigation drawer list --> 

     <ListView 
      android:id="@+id/slider_list" 
      android:layout_width="240dp" 
      android:layout_height="match_parent" 
      android:layout_alignParentTop="true" 
      android:layout_gravity="start" 
      android:background="@color/tvtv_background" 
      android:choiceMode="singleChoice" 
      android:divider="@drawable/nav_bar_divider" 
      android:dividerHeight="1dp" 
      android:listSelector="@android:color/transparent" /> 
    </android.support.v4.widget.DrawerLayout> 

    <RelativeLayout 
     android:id="@+id/splash_screen" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:background="@color/tvtv_white" 
     android:visibility="visible" > 

     <ImageView 
      android:id="@+id/splash_screen_logo" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:paddingLeft="50dp" 
      android:paddingRight="50dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/ic_launcher" /> 

     <TextView 
      android:id="@+id/splash_screen_text" 
      style="@style/TVTextBlueContent" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/splash_screen_logo" 
      android:layout_centerHorizontal="true" 
      android:padding="10dp" 
      android:text="Awesome splash shiat" /> 

     <ProgressBar 
      android:id="@+id/splash_screen_loader" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/splash_screen_text" 
      android:layout_centerHorizontal="true" 
      android:clickable="false" 
      android:indeterminate="true" /> 
    </RelativeLayout> 

</RelativeLayout> 
+1

Esto significa que su pantalla de presentación siempre estará en su jerarquía de vistas, aunque no la esté usando. Si desea utilizar este enfoque, mejor use un 'ViewStub' para eso. http://developer.android.com/reference/android/view/ViewStub.html – Jelle

Cuestiones relacionadas