[AYUDA] deletrear con imagenes

104 views
Skip to first unread message

.:Chano:.

unread,
Dec 21, 2012, 3:21:10 AM12/21/12
to android...@googlegroups.com
Bueno mi duda es algo simple

Dentro de mi layout tengo un EditText y 2 ImageView

en el EditText introduzco cualquier palabra y en los 2 ImageView que tengo se deben de mostrar imagenes de acuerdo a la letra, se como mandar a llamar la palabra del EditText mi problema surge al momento de querer llamar letra por letra por ejemplo:

si introduzco la palabra "CASA" deberia de recorrer la palabra y mostrar en los 2 ImageView la imagen de acuerdo a la letra entonces se mostraria C (imagen C) despues A (Imagen A)...etc

el problema es que no puedo realizar el proceso de buscar letra por letra, lo he intentado con un for pero solo reconoce la ultima letra, tambien intente hacer un tipo de retardo(delay) pero no funciono

el codigo:
public class deletreo extends Activity {

protected TextView tv;
protected EditText etxt;
protected ImageView img,img2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        tv = new TextView(this);
        setContentView(R.layout.deletreo);
        
        
        etxt = (EditText)findViewById(R.id.text);
        Button btn = (Button)findViewById(R.id.btn7);
        
        btn.setOnClickListener(new OnClickListener() {
     public void onClick(View v) {
    
     Handler myHandler = new Handler();
     myHandler.postDelayed(mMyRunnable, 1000);
     letra();
}
     });
        
    }//fin bundle
    
    private Runnable mMyRunnable = new Runnable()
    {
        public void run()
        {
         letra();
        }
     };
     
     private void letra() {

      String t = etxt.getText().toString();
int numero = t.length();
@SuppressWarnings("unused")
String[] array;
array = new String[numero];

for(int j=0; j<t.length();j++){
//array[j]=t+".";
//j++;
if(t.charAt(j) == 'a'){
img = (ImageView)findViewById(R.id.img);
img.setImageResource(R.drawable.aa);
img2 = (ImageView)findViewById(R.id.img2);
img2.setImageResource(R.drawable.image_1);
}

if(t.charAt(j) == 'b'){
img = (ImageView)findViewById(R.id.img);
img.setImageResource(R.drawable.bb);
img2 = (ImageView)findViewById(R.id.img2);
img2.setImageResource(R.drawable.image_2);
}

aqui lo que hago es mostrar las imagenes (este proceso lo hace bien) el problema esta dentro del for ya que no puedo hacer que haga un retardo y vaya letra por letra para asi realizar el metodo de "deletreo" ahi es mi problema alguna idea de como poder solucionar este problema? Gracias!

.::Javier::.

unread,
Dec 29, 2012, 12:14:48 PM12/29/12
to android...@googlegroups.com
Disculpa por la tardanza, ya está como autorizada la cuenta para que no vuelva a ocurrir.

¿Ya lo has solucionado?

Saludos

.:Chano:.

unread,
Jan 1, 2013, 5:15:20 PM1/1/13
to android...@googlegroups.com
No te preocupes, yo espere paciente y no aun no he logrado resolverlo, lo he intentado con los thread.sleep y con handler pero aun asi no me funciona

he descubierto que con el handler solo hace una pausa por cierta cantidad de segundos y despues ejecuta mi metodo letra(); y solo me envia la ultima letra

.::Javier::.

unread,
Jan 2, 2013, 5:03:58 AM1/2/13
to android...@googlegroups.com
Si, creo que hablas del método postDelayed(milis) del objeto handler, pero aún no he entendido bien lo que necesitas, a ver si luego lo puedo leer con más tiempo, porque al principio creía que querías hacer algo como un editText que tenga autocompletado pero creo que no es eso.

La tardanza de publicar tu mensaje era porque al crearse la cuenta esta no tiene el estado de autorizado sino el de moderado y con tanto trabajo y estos días de navidades pues me he despistado, pero ya está autorizada y algunas otras que no lo estaban también.

Saludos

.:Chano:.

unread,
Jan 2, 2013, 1:25:17 PM1/2/13
to android...@googlegroups.com
No te preocupes por eso, estaré al pendiente de eso

Y lo que necesito es lo siguiente:

Dentro del edittext escribo una palabra (ejemplo: "hola")

Al momento de darle clic al botón quiero que en los 2 ImageView me imprima las imágenes de cada letra, ejemplo:
H - 2 imágenes .... y delay(2seg)
O - 2 imágenes .... y delay (2seg)
L - 2 imágenes ....y delay (2seg)
A - 2 imágenes .... y del ay (2seg)

Y que se repetía el ciclo for no se si me explique bien, saludos

.::Javier::.

unread,
Jan 2, 2013, 3:31:51 PM1/2/13
to android...@googlegroups.com
Has probado así for(int j=0; j<=t.length();j++){

en vez de así ?  for(int j=0; j<t.length();j++){

.:Chano:.

unread,
Jan 2, 2013, 3:40:36 PM1/2/13
to android...@googlegroups.com
Si lo ye probado de hecho mi problema no es en el ciclo for sino que no me hace las paysas que necesito

Necesito que me muestre letra por letra y lo unico que hace es mostrarme la ultima letra de la palabra

.::Javier::.

unread,
Jan 2, 2013, 3:45:47 PM1/2/13
to android...@googlegroups.com
Estás haciendo delay de letra y letra debería de llamarse solo una vez, así que podrías cambiar el postDelayed(runnable, milis) por el post(runnable).

Y dentro del runnable haces el delay.

Creo que te quedaría mejor si dentro del for en vez de usar los condicionales if usas un swith case, no sé si me explico.


.::Javier::.

unread,
Jan 2, 2013, 3:51:00 PM1/2/13
to android...@googlegroups.com
Creo que este approach es tu solución o por lo menos una idea >>  http://stackoverflow.com/a/14053287

.::Javier::.

unread,
Jan 2, 2013, 3:54:10 PM1/2/13
to android...@googlegroups.com
Esto lo puedes poner en el onCreate :

img = (ImageView)findViewById(R.id.img); y el img2

.::Javier::.

unread,
Jan 2, 2013, 3:58:48 PM1/2/13
to android...@googlegroups.com
También si añades un par de breakpoints y depuras puedes ver que es lo que ocurre y lo que no.

.:Chano:.

unread,
Jan 2, 2013, 4:40:39 PM1/2/13
to android...@googlegroups.com
Si he intentado el runnable de igual forma y hace lo mismo el del switch también lo he pensado solo que no he tenido una idea clara aunque ya se mas o menos como

.:Chano:.

unread,
Jan 2, 2013, 4:41:50 PM1/2/13
to android...@googlegroups.com
Y como podría hacer que se cambiara de acuerdo a la letra? O creo que estoy confundido

.::Javier::.

unread,
Jan 3, 2013, 9:18:24 PM1/3/13
to android...@googlegroups.com
Creo que es esto lo que quieres:

package android.hispano.imagedelay;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity {
TextView tv;
EditText etxt;
Button btn;
ImageView img1,img2;
protected Handler myHandler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        tv = new TextView(this);
        setContentView(R.layout.activity_main);
        
        
        etxt = (EditText)findViewById(R.id.editText1);
        btn = (Button)findViewById(R.id.button1);
        
        btn.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    myHandler = new Handler();
    myHandler.post(mMyRunnable);
   
}
    });
    }//fin bundle
    
    private Runnable mMyRunnable = new Runnable() {
        public void run() {
        letra();
        }
     };
  
     private Runnable runnableB = new Runnable() {
         public void run() {
        img1.setImageResource(R.drawable.b1);
      img2.setImageResource(R.drawable.b2);
         }
      };
     
     
     
     private void letra() {
 
      String texto = etxt.getText().toString();
      img1 = (ImageView)findViewById(R.id.imageView1);
      img2 = (ImageView)findViewById(R.id.imageView2);
 
  for(int j=0; j<texto.length();j++){

  switch (texto.charAt(j)) {
case 'a':
  img1.setImageResource(R.drawable.a1);
  img2.setImageResource(R.drawable.a2);
break;
case 'b':
    myHandler.postDelayed(runnableB, 2000);
break;

default:
break;
}
  }
      }
}

.::Javier::.

unread,
Jan 3, 2013, 9:22:54 PM1/3/13
to android...@googlegroups.com
Adjunto el proyecto. Es solo una idea. 

Nota que estabas llamando a letra() dos veces.
ImageDelay.zip

.:Chano:.

unread,
Jan 4, 2013, 2:35:49 PM1/4/13
to android...@googlegroups.com
he revisado el codigo y efectivamente realiza el delay, muchas gracias, pero me he encontrado con otro problema y no se porque lo hace si la sintaxis esta perfecta
Ejemplo:
 public void letra(){
   
  img = (ImageView)findViewById(R.id.img);
img2 = (ImageView)findViewById(R.id.img2);
     
    String t = etxt.getText().toString();
int p = t.length();
   
    for( int j = 0 ; j < p-t.length() ; j++)
    {
   
    switch(t.charAt(j))
    {
   
case 'A':
    case 'a':
    img.setImageResource(R.drawable.aa);
img2.setImageResource(R.drawable.image_1);
    myHandler.postDelayed(runnableA, 2000);
break;
    case 'B':
    case 'b':
    img.setImageResource(R.drawable.bb);
    img2.setImageResource(R.drawable.image_2);
    myHandler.postDelayed(runnableB, 2000);
break;
tengo todas las letras (A-Z) pero al momento de poner "hola" solo me envia la letra A, osea, la ultima letra y de ahi se va a la primer letra y regresa a la ultima (H - A) nunca muestra las letra de la mitad

.:Chano:.

unread,
Jan 4, 2013, 4:26:30 PM1/4/13
to android...@googlegroups.com

He usado parte de tu codigo y agradezco el haber ayudado, pero no funciona del todo bien, ahora tengo este codigo (adjunto) y no realiza bien la secuencia he logrado hacer que realice un poco del ciclo, pero no de la manera correcta :( 
codigo.txt

.::Javier::.

unread,
Jan 4, 2013, 8:54:29 PM1/4/13
to android...@googlegroups.com
Yo de ti primero intentaría simplificar el código, mucho código (a mi gusto).

Como veo que la imagen es la misma para minúsculas que para mayúsculas podrías hacer esto:

String original = etxt.getText().toString();
String t = original.toLowerCase();

Y así cambias esto

case 'A':
case 'a':

por esto:

case 'a':

o lo contrario con .toUpperCase()

.::Javier::.

unread,
Jan 4, 2013, 9:10:06 PM1/4/13
to android...@googlegroups.com
Es que tienes 27 métodos iguales, lo único que cambia es el id de la imagen.

Utiliza un HasMap o algo similar donde puedas almacenar objetos por clave y valor (key, value)

que sería por ejemplo ('a', '26')

y luego en el switch haces algo así:

img2.setImageResource(R.drawable.image_+mapa.getKey('a');


.::Javier::.

unread,
Jan 4, 2013, 9:12:40 PM1/4/13
to android...@googlegroups.com
Bueno el 26 sería la Y, aunque sería el 25 si A fuera 0 pero es 1, de todas formas en Java ambas son válidas.

.:Chano:.

unread,
Jan 4, 2013, 10:58:40 PM1/4/13
to android...@googlegroups.com
Si de hecho son 27 metodos por las letras y después de ejecutar el código que puse realiza los delay pero me muestra la ultima letra de la palabra ingresada y de ahi ejecuta las letras en forma aleatoria

.:Chano:.

unread,
Jan 7, 2013, 4:36:00 PM1/7/13
to android...@googlegroups.com
Alguna sugerencia al último problema que resulto? No he podido solucionarlo :(

.:Chano:.

unread,
Jan 30, 2013, 1:52:11 PM1/30/13
to android...@googlegroups.com
Bueno, les hago una pregunta de nuevo les subo la clase ya que gracias a ustedes he podido realizar los retardos, el problema es el siguiente:

En el EditText introduzco la palabra "hola" (ejemplo) y al presionar el boton comienza a ejecutar la actividad y las clases que se encuentran en el codigo mi problema va cuando se ejecuta el codigo y comienza el recorrido de la palabra

al comenzar el recorrido junto con el Switch la imagenes comienzan aparecer, el problema aqui es que comienza con la ultima letra ("a" de la palabra hola) y de ahi sigue con la letra "h", "l" y "o" aqui esta mi problema ya que no realiza el recorrido de manera correcta sino que lo realiza de manera alfabetica y no se la razon :( 

alguna posible solucion?

gracias!
deletreo.java

.:Chano:.

unread,
Feb 26, 2013, 3:05:32 PM2/26/13
to android...@googlegroups.com
Este es el ultimo codigo que he hecho! alguna solicion?
deletreo.java

.:Chano:.

unread,
Jun 14, 2013, 12:58:01 AM6/14/13
to android...@googlegroups.com
Despues de un buen tiempo volvere a publicar aqui, he retomado el codigo que habia intentado hacer hace tiempo, pero sigo teniendo el mismo problema, siempre se muestra la ultima imagen sin esperar o hacer las pausas entre las letras, ya modifique el codigo de acuerdo a que envie letra por letra y tenga algo de tiempo de diferencia pero aun asi no occurre, les dejo la clase 
deletreo.java

.::Javier::.

unread,
Jun 14, 2013, 6:00:38 AM6/14/13
to android...@googlegroups.com
else if(c.equals("e") || c.equals("E")){

Esto lo puedes reducir así:

else if(c.equals("e")){

Si al original le haces esto:

original.toLowerCase()


o viceversa, como más te guste.

Si me envías los recursos mejor para hacer pruebas.

Saludos

emanuelF

unread,
Jun 14, 2013, 7:25:37 AM6/14/13
to android...@googlegroups.com
y c.equalsIgnoreCase("E") hace lo mismo sin necesidad del toLowerCase


--
Has recibido este mensaje porque estás suscrito al grupo "Android-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a android-hispa...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a android...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/android-hispano.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 



--
Emanuel Friedrich - Casi licenciado en Sistemas... :)
Cel: 3754-495887

Haya paz

.:Chano:.

unread,
Jun 14, 2013, 12:38:50 PM6/14/13
to android...@googlegroups.com
te envio los recursos por la noche, ahorita no cuento con ellos, gracias! y si se que puedo simplificarlo con lowercase o ignorecase, cuestion de percepcion :D

.::Javier::.

unread,
Jun 14, 2013, 7:42:23 PM6/14/13
to android...@googlegroups.com
Yo lo decía más que nada por eliminar código, no me explicaría bien, de esa manera sería casi lo mismo que como está.

Saludos

emanuelF

unread,
Jun 16, 2013, 4:07:10 PM6/16/13
to android...@googlegroups.com
cambia en en metodo onCreate el listener para el Button

        btn.setOnClickListener(new OnClickListener(){
 
            @Override
            public void onClick(View arg0) {
                myHandler = new Handler();
                mMyRunnable.run();
                myHandler.postDelayed(mMyRunnable, 2000);
            }
        });

si es que tu problema es que no se ejecutan las acciones cada x milisegundos... que segun entiendo es eso.

Y para la proxima te recomiendo gist para postear codigo. Se hace dificil bajar un archivo o leer codigo por correo

.:Chano:.

unread,
Jun 23, 2013, 2:35:44 AM6/23/13
to android...@googlegroups.com
Javier te adjunto el codigo y los recursos, y he probado lo que me decia emanuel pero sigue reaccionando diferente a lo esperado :/
letras.rar
Reply all
Reply to author
Forward
0 new messages