Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Parametros en actividad Android

Iniciado por NullPointerException, 18 de Abril de 2013, 09:20:32 PM

« anterior - próximo »

NullPointerException

Hola, aqui vuelvo otra vez cargado de preguntas xD.

Veamos, tengo una actividad que me construye un puzle, y esa actividad se encarga de dibujarlo y llevarlo a cabo. El problema es que tengo varios puzles, y por tanto, dependiendo de qué puzle sea, necesito unos parámetros u otros.

Por ejemplo, el puzle 1 tiene 4 casillas, el segundo tiene 8 y el tercero unos 10.

Por ese motivo, necesito saber qué puzle tengo que construir, y en teoria necesitaría un parámetro al crear el activity, entonces me gustaria saber si algun experto puede ayudarme. Por lo pronto he pensado en estas alternativas:

1. Añadir un parametro int en el onCreate que me diga el puzle que és (creo que esto no se puede ni de coña).

2. Crear un método auxiliar que inicialize las variables, aunque no se como podría llamarlo. Hay que decir una cosa importante, y es que la actividad se crea con otra, es decir, lanzo un "Intent" y lo empiezo. No sé si se podría llamar al método despues de empezar el Intent.

Posiblemente haya otra forma, pero no la conozco por ahora. Si alguien sabe del tema y puede ayudarme se lo agradecería mucho.

bnl

#1
Yo he hecho algo similar en varios juegos.
Para pasar parametros a una actividad usa el intent. A la hora de iniciar la actividad desde otra le pasas al intent los parametros que necesites. Luego en la actividad lees los parametros del intent  e inicializas el puzzle.

Ej intent.putExtra("nivel", 1);
y luego lo lees
nivel = getIntent().getIntExtra("nivel", 1);

Le puedes pasar todo lo que necesites, pero creo que es mejor que le pases solo el indice del puzzle (un identificador) y luego leas los datos del nivel de un fichero (ya sea de la carpeta assets o values (esto ultimo es mas eficiente)). Si en el futuro quieres cambiar la configuracion de un nivel solo tienes que tocar el fichero donde lo parametrizas y no tienes que tocar codigo.
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

NullPointerException

Cita de: bnl en 18 de Abril de 2013, 09:45:54 PM
Yo he hecho algo similar en varios juegos.
Para pasar parametros a una actividad usa el intent. A la hora de iniciar la actividad desde otra le pasas al intent los parametros que necesites. Luego en la actividad lees los parametros del intent  e inicializas el puzzle.

Ej intent.putExtra("nivel", 1);
y luego lo lees
nivel = getIntent().getIntExtra("nivel", 1);

Le puedes pasar todo lo que necesites, pero creo que es mejor que le pases solo el indice del puzzle (un identificador) y luego leas los datos del nivel de un fichero (ya sea de la carpeta assets o values (esto ultimo es mas eficiente)). Si en el futuro quieres cambiar la configuracion de un nivel solo tienes que tocar el fichero donde lo parametrizas y no tienes que tocar codigo.

mmm... Pensaba en construir los puzzles en un fichero de texto donde diga el numero de casillas y luego los datos de cada casilla, pero ahora que dices lo de values como seria? Se podría hacer alguna especie de fichero xml donde te guarden los datos y leerlo?

bnl

Efectivamente. Es un xml.
Podrias guardar un array de cadenas cada elemento es un nivel y los diferentes valores los separas por ejemplo por ; y luego haces un split
Tambien podrias tener varios arrays, uno por cada valor que quieras guardar y asi te ahorras el split

Un ejemplo de un juego que hice donde guardo en un array en un xml unos colores. Luego al leerlo tengo una array de cadenas cada una conteniendo un color.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="colores">
        <item>#000000</item>
        <item>#ffffff</item>
        <item>#ff0000</item>
        <item>#00ff00</item>
        <item>#0000ff</item>
        <item>#ffff00</item>
        <item>#ff00ff</item>
        <item>#00ffff</item>
    </string-array>
</resources>
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

NullPointerException

#4
Y en un string array, supongo que no puede haber otro string array como hijo no?

Y otra pregunta: Como accedería a estos datis si, por ejemplo, tengo puesto por nombre puzles.xml?


bnl

Tienes que habituarte a googlear un poco.

La solucion:
String[] colores = getResources().getStringArray(R.array.colores);
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

NullPointerException

No, si yo googleo pero hay veces que no lo encuentro, auqnue la solucion a este problema la encontre ayer xD.

Ahora estoy liado con el Canvas buscando como leer los toques que se hacen en pantalla.

NullPointerException

Vale, volvemos a tener problemas:

Tengo un layout con 2 partes: Una con botones y textviews y el otro con un canvas.

Quiero poner un cronometro que vaya contando los segundos que van transcurriendo. Vale, así que decidí hacerlo en un thread. Pero que pasa? Que quiero que este thread se ejecute en bucle, y cuando pongo el bucle la pantalla se queda en negro, pero el thread va funcionando. Evidentemente quiero que se dibuje el canvas y la interfaz mientras que el thread vaya contando los segundos y se muestren en el textview.

Aqui la pieza de codigo:

private long starttime;
private long s,m,h;
private long sr,mr;
private boolean stopped,running;
private PuzzleScreen ps;

public Crono(PuzzleScreen puzzlescreen)
{
running=false;
ps=puzzlescreen;
}

public void setRunning(boolean b){ running=b; }

public void start()
{
starttime=System.currentTimeMillis();
stopped=false;
}

public void stop()
{
stopped=true;
}


public String getTimeElapsed()
{
String sret="";
if(h!=0) sret+=h+":";
sret+=String.format("%02d", m)+":";
sret+=String.format("%02d", s);

return sret;
}

public String getTimeRemaining()
{
String sret="";
sret+=String.format("%02d", Math.abs(m-mr))+":";
sret+=String.format("%02d", Math.abs(s-sr));
return sret;
}

@Override
public void run() {
while(running){
if(!stopped)
{
long elapsed=System.currentTimeMillis()-starttime;

s=elapsed/1000;
m=s/60;
h=m/60;

ps.setTime(getTimeElapsed());
}
}
}


Hay algo que deberia hacer con el bucle?

YaW

Si haces un thread a pelo se congela el thread de la interfaz. Tienes que usar un AsyncTask.

NullPointerException

#9
Gracias :) Me ha sido de mucha utilidad tu consejo  :)

Ahora hay otro porblema: Cuando paro el reloj y lo vuelvo a reanudar, no se para en realidad, sino que se reanuda justo donde iria aun si no hubiera parado.

Por ejemplo, si lo paro en el segundo 5, y lo dejo durante 10 más parado, se reanuda en el momento 15 en vez del 5 como deberia ser.

YaW

Normal porque tienes mal el contador ;)

Estás teniendo en cuenta el tiempo del sistema y el tiempo inicial, pero el tiempo inicial es el mismo siempre independientemente de que pauses o no. Tienes que cambiar esa lógica, la forma más sencilla que veo sería volver a inicializar el starttime cuando despauses.

Ejemplo: http://stackoverflow.com/questions/10971346/stop-watch-android-pause-then-start-and-begin-from-where-it-left-off

bnl

Esto se hablo en algun hilo si no recuerdo mal. Creo que varios pegamos el codigo de nuestras clases cronometro.
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

bnl

Para tener un poco organizado el foro tambien es buena idea crear un hilo por asunto y no desvirtuar otros hilos que hablan de otros temas
Asi si alguien tiene una duda similar encontrara mas facilmente la informacion.

Saludos
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

NullPointerException

Cita de: YaW en 22 de Abril de 2013, 08:44:35 AM
Normal porque tienes mal el contador ;)

Estás teniendo en cuenta el tiempo del sistema y el tiempo inicial, pero el tiempo inicial es el mismo siempre independientemente de que pauses o no. Tienes que cambiar esa lógica, la forma más sencilla que veo sería volver a inicializar el starttime cuando despauses.

Ejemplo: http://stackoverflow.com/questions/10971346/stop-watch-android-pause-then-start-and-begin-from-where-it-left-off

Al final lo conseguí resolver afortunada mente. Gracias por la ayuda  :)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.