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?
Respuesta
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;
}
}
};
}
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
¿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();
}
});
}
};
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);
}
}
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.
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();
}
//...
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>
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
- 1. Android: 'Pantalla de bienvenida' una sola vez
- 2. Pantalla de bienvenida al cargar una URL en una vista web en la aplicación de Android
- 3. La mejor manera de tener una aplicación de Android encuesta periódicamente en el fondo
- 4. ¿Cómo mostrar una pantalla de bienvenida de una sola vez?
- 5. ¿Hay alguna manera de mostrar una pantalla de bienvenida para la aplicación WPF?
- 6. [Pantalla de bienvenida] ¿Cómo mostrar una imagen en pantalla completa?
- 7. ¿Cómo hacer una pantalla de bienvenida (pantalla visible cuando se inicia la aplicación)?
- 8. ¿Qué resolución deberían tener mis pantallas de bienvenida de Android?
- 9. Android: ¿cómo diseñar la imagen para la pantalla de bienvenida?
- 10. ¿La mejor manera de tener una superposición de imagen de zoom y panorámica en Android?
- 11. Pantalla de bienvenida al cargar recursos en la aplicación de Android
- 12. Android: video como pantalla de bienvenida
- 13. Android - Animación de desvanecimiento para la pantalla de bienvenida
- 14. Pantalla de bienvenida en Windows
- 15. cómo agregar una imagen de bienvenida en pantalla completa en una aplicación web usando jquerymobile
- 16. pantalla de bienvenida localizada en iPhone
- 17. ¿La mejor manera de versionar una aplicación de rieles?
- 18. Pantalla de bienvenida de Eclipse RCP
- 19. ¿Hay una mejor manera de tener argumentos opcionales en Haskell?
- 20. ¿Cómo puedo agregar una pantalla de bienvenida en C#?
- 21. Cómo acelerar la carga de la pantalla de bienvenida
- 22. ¿La mejor manera de guardar datos en una aplicación Java?
- 23. La mejor manera de autenticar usuarios en una aplicación web
- 24. Tener varios SQLiteOpenhelper en una aplicación Android
- 25. Administración de diseños de Android, debe haber una mejor manera
- 26. La mejor manera de hacer una aplicación de iPhone multilingüe
- 27. ¿Cómo puedo suministrar los 3 tamaños de pantalla de bienvenida para una aplicación de Windows 8?
- 28. Mostrar imagen de la pantalla de bienvenida con ajuste automático
- 29. ¿Cuál es la mejor manera de almacenar datos como 'Favoritos' en una aplicación de Android?
- 30. La mejor manera de lograr la comunicación entre actividades en una aplicación Android TabHost
¿Qué no funcionó específicamente sobre el temporizador? Ese enfoque debería funcionar. ¿Puedes pegar tu código? –
posible duplicar http://stackoverflow.com/questions/8642730/splash-screen-in-android-application –
Debería publicar su respuesta si es diferente de la otra pregunta, o eliminar la publicación si es la misma. – Sababado