En esta entrada voy a comenzar una nueva serie de post donde voy a daros consejos de cómo solucionar varios problemas con los que me he encontrado al desarrollar bajo la plataforma Android, mostrando las soluciones que he ido tomando en cada caso. Espero que os sirva para perder menos tiempo que el que he perdido yo para ir superando cada obstáculo.
1) Control de una aplicación Android al pulsar boton HOME o BACK
La única solución de solventar esta tarea de manera correcta es tener presente todo el tiempo el ciclo de actividad que tiene una actividad Android.
Cada vez que el usuario pulsa el teclado se ejecuta el siguiente metodo onKeyDown, que podemos sobreescribir y poder controlar cualquier pulsación.
public boolean backButton = false; public boolean homeButton = false; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { backButton = true; finish(); return true; }else if(keyCode == KeyEvent.KEYCODE_HOME){ homeButton = true; } return super.onKeyDown(keyCode, event); }
Cuando el usuario pulsa el botón HOME o el boton BACK, la actividad entra en modo Pausa por tanto se ejecuta el siguiente método, que puedes controlar de la siguiente manera:
@Override public void onPause(){ super.onPause(); Log.v("TAG", "onPause" ); if(backButton){ //Aquí controlamos el boton BACK }else if(homeButton){ //Aquí controlamos el boton HOME } backButton = false; homeButton = false; }
Esto es muy útil para cantidad de cosas, como por ejemplo apagar la música del juego, grabar el estado actual del juego, etc…Tenemos que tener claro que cuando se vuelva a ejecutar nuevamente el juego, pasará al estado “Resume”, donde debemos recuperar la situación que teníamos antes del Pause.
@Override public void onResume(){ super.onResume(); //Aquí añadiremos la situación a recuperar }
2) Creación de un componente totalmente personalizado.
Aqui os muestro un ejemplo de como podemos crear un boton, asignarle un layout, una fuente, un color, una imagen y todo lo que necesitemos para personalizar nuestros TextView, ImageView, Button y cualquier otra Views.
Typeface tf = Typeface.createFromAsset(this.getAssets(),"font/nombreFuente.ttf"); Button btnEjemplo = new Button(this); //creación boton btnEjemplo.setTextSize(30);//tamaño texto btnEjemplo.setGravity(Gravity.CENTER); //punto de gravedad btnEjemplo.setWidth((int)(250*this.getResources().getDisplayMetrics().density)); //anchura boton dependiente de la resolucion pantalla btnEjemplo.setTextColor(Color.WHITE); //color de texto FrameLayout.LayoutParams layoutParamsEjemplo = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL); //creación de posicionamiento para fijar el nuevo layOut layoutParamsEjemplo.setMargins(0, (int)(40*getResources().getDisplayMetrics().density), 0, 0); //asignación de margenes btnEjemplo.setLayoutParams(layoutParamsEjemplo); //asignación del layOut al boton btnEjemplo.setTypeface(tf); //asignacion de la fuente al boton btnEjemplo.setShadowLayer(3, 0, 0, Color.BLACK); //asignación de la sombra al texto del boton btnEjemplo.setBackgroundDrawable(getResources().getDrawable(R.drawable.NombreImagen)); btnEjemplo.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //pulsacion del boton } });
Buenas!
Soy nueva con Android y Java, pero estoy haciendo una aplicación y tengo un par de problemas: Necesito crear un botón Home y un Back Button en pantalla. El problema es que al parecer me quedo estancada en la actividad, pero no sé cómo solucionarlo.
Había creado un par de clases asociadas a esos botones, pero como te digo, esto no chuta.. 🙁 Paso a la ventana anterior y se acabó! No me deja pulsar los botones de las ventanas anteriores…
Puedes echarme una mano, por favor???
Saludos!
Vale, te hecho una mano. Pero necesito que me des mas detalles y/o que me envies el proyecto. mi mail: eetayo@gmail.com
Hey, buenas!!
Muchísimas gracias por tu ayuda, pero al final lo he solucionado!! 😀
Me temo que ayer, después de horas y horas programando la aplicación, acabé hipersaturada… Había cometido un error de sintaxis con el intent y por eso no funcionaba…
Perdón por las molestias y gracias de nuevo! 🙂
Genial!! Así es como mas se aprende!! Un Saludo!!
Hola muchas gracias por el crear el blog desde aquí tienes un nuevo seguidor. Bueno le iba a consultar una duda por si usted sabría como resolverla viene al hilo del botón back (me indique el camino sino no aprendemos 🙂 ). Tengo en mi PFC una aplicación que tiene varias pantallas y claro la pila va aumentando ya que no elimino ninguna. Mi objetivo es guardar sólo la última pantalla para poder regresar a ella a través del back (esto es por defecto) pero no consigo saber como guardar esa pantalla. Me explico con un ejemplo:
ACTUALMENTE: voy de pantalla 1 -> pantalla 2 -> pantalla 3
tengo en pila las 3 pantallas, con el back voy de la 3 a la 2 y para finalizar a la 1
Objetivo que al llegar a la pantalla 3 desaparezca de la pila la pantalla 1 ya que tengo la 2 en pila
Saludos y gracias de antemano.
Hola Miguel Angel,
Muchas gracias por seguirme.
La verdad que no termino de entender el porque quieres hacer eso, no le veo demasiado sentido el cargarte de la pila la Pantalla1 cuando llegues a la pantalla3. El sistema guarda una referencia de la actividad que apenas tiene consumo sobre el procesamiento global. Solo has de eliminar de la pila la referencia con finish(); cuando pasas de la pantalla3 a la pantalla2
Un Saludo!