Our Country Sites: Argentina|Brazil|Chile|Mexico|Peru

Desaparecen caracteres.

Printer-friendly versionPrinter-friendly versionSend by emailSend by email

Hola, buen día!
Tengo una pantalla con el siguiente código:

    public void pantallaPIN()
    {
        estado = EDO_PIN;
        form = new Form("Usuario");
        textField1 = new TextField("Password: ", "", 12, TextField.PASSWORD | TextField.NON_PREDICTIVE);
        cmdOK = new Command(ok, Command.OK, 1);
        cmdSalir = new Command(salir, Command.OK, 2);
        cmdCambioPTN = new Command("Cambiar PTN",Command.ITEM,3);
        encabezado1 = new ImageItem(null, encabezado, ImageItem.LAYOUT_CENTER, null);
        form.append(encabezado1);
        StringItem strItmUsr=new StringItem("Usr: ", config.getUsr());
        strItmUsr.setLayout(Item.LAYOUT_LEFT);
        form.append(strItmUsr);
        StringItem strItmPTN=new StringItem("PTN: ", config.getPtn());
        strItmPTN.setLayout(Item.LAYOUT_LEFT);
        form.append("\n" + strItmPTN.getLabel() + strItmPTN.getText());
        textField1.setLayout(Item.LAYOUT_LEFT);
        form.append(textField1);
        form.addCommand(cmdOK);
        form.addCommand(cmdSalir);
        form.addCommand(cmdCambioPTN);
        form.setCommandListener(this);        
        display.setCurrentItem(textField1);
        display.setCurrent(form);        
    }

El problema aquí es que al introducir el password sólo se visualiza la captura hasta el tercer carácter, si se continúa capturando el password completo, aún cuando no se visualiza si es posible ingresar a la aplicación.

Éste comportamiento se ha identificado hasta el momento con las letras “l” y “j”. Es decir, si mi contraseña es: nxtlcert01; únicamente se "visualiza" hasta la letra 't' y de allí en adelante desaparecen.

Lo que si he notado es que si realizan otras acciones como borrar el texto para empezar con otra letra, etc. y finalmente se vuelve a introducir la contraseña ya no se manifiesta dicho problema. Está bastante raro el evento.

Me gustaría saber si existe alguna forma de corregir o evitar que se comporte de esta manera, ya que es lo que nos piden para poder certificar la aplicación.

Como información adicional la aplicación corre sobre una Blackberry 8350i con un sistema operativo 5.0.0.1074

Sin más por el momento les agradezco y quedo en espera...

Saludos.

Re: Desaparecen caracteres.

Hola Bryan
Particularmente tu codigo tiene bien la sintaxis: en teoria deberia mostrar los 12 caracteres. Por si acaso prueba reemplazando la linea donde mencionas el TextField por esta:

textField1 = new TextField("Password: ", "", 12, TextField.ANY |  TextField.PASSWORD | TextField.NON_PREDICTIVE);

Aqui le agregamos TextField.ANY donde reforzamos que los caracteres son Texto.

Haz la prueba y avisas si persiste el problema en tu desarrollo blackberry.

PD: Te recomendaria para futuros desarrollos Blackberry la posibilidad que utilices el JDE de blackberry: a mi me ha dado tambien buenos resultados.

Gerardo Chung
Desarrollo Blackberry Senior
Nextel del Peru S.A.

Prueba de seugerencia.

Hola Gerardo,

Antes que nada agradecerte la sugerencia; desafortunadamente persiste el problema.

Saludos.

Re: Prueba de seugerencia.

Hola Bryan
En si la sintaxis esta correcta de la funcion TextField; por ello puede ser antes de que ejecutas la funcion pantallaPIN() se esta ejecutando unas lineas de codigo que producen el comportamiento q describes.

Podrias adjuntar la clase completa donde esta la funcion pantallaPIN()? Puede ser que en alguna parte de se esta haciendo inadvertidamente un override de una interface de la clase Textfield.

Gerardo Chung
Desarrollo Blackberry Senior
Nextel del Peru S.A.

Clase completa

Hola Gerardo,

Disculpa la tardanza, aquí anexo la clase completa. Saludos.

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import com.Actin.Libreria;
import java.util.Calendar;
import java.util.Date;
import com.Actin.ManejadorRegistros;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import java.io.IOException;
import com.Actin.Base64KLR;
import net.rim.device.api.system.LED;
import net.rim.device.api.system.DeviceInfo;

public class ExtraMobile extends MIDlet implements CommandListener
{
    public Display display;
    public Form form, form2, formDetalle;
    public List list;
    public Image esfera,esferan,esferar=null,esferaa=null,esferav=null;
    Image logoActin, encabezado;
    public ImageItem encabezado1;
    public Image imageEncabezado,imageAvisoOk,imageReloj;
    public StringItem strItem;
    public Command cmdOK, cmdCancelar, cmdSalir, cmdMenuP,cmdCambioPTN, cmdMensaje, cmdEnvioSalir, cmdEnvioOk, cmdThumb, cmdVacio;
    public int estado = 0, estadoAnterior = 0, tipoMensaje = 0;
    public TextField textField1, textField2, textFieldNota, txtClave;
    public Calendar cal;
    public String fechaInicial, horaInicial, horaFinal;
   
    public final String titulo = "EXTRA MOBILE";
    public String opcActiv[] = null;
    public String opcMenuP[] = new String[]{"Avisos", "Ruta", "Sincronización"};
    public final String ok = "OK", salir = "SALIR";
    public final int EDO_INICIO = 1, EDO_TELEFONO = 2, EDO_PIN = 4, EDO_MENUP = 5, EDO_MENSAJE = 8, EDO_INICIOACTIVIDADES = 10, EDO_CVEPTN = 36;
    public Libreria libreria;
    public MenuPCanvas pantallaMCanvas;
    public Config config;
    public Data data;
    public CanvasEnvio canvasEnvio;
   
    public ExtraMobile()
    {
        display = Display.getDisplay(this);
        libreria = new Libreria();
        config = new Config();
        data = new Data(this);
        estado = EDO_INICIO;
        try
        {
            esfera = Image.createImage("/img/esfera.png");
            esferan = Image.createImage("/img/esferan.png");
            esferar = Image.createImage("/img/esferar.png");
            esferaa = Image.createImage("/img/esferaa.png");
            esferav = Image.createImage("/img/esferav.png");
            logoActin = Image.createImage("/img/Actin.png");
            encabezado = Image.createImage("/img/LogoExtraC.png");
            imageEncabezado = Image.createImage("/img/enc.png");
            imageAvisoOk = Image.createImage("/img/iconC.png");
            imageReloj = Image.createImage("/img/reloj.png");        
        }
        catch (Exception e)
        {
        }
    }

    public void startApp()
    {
        switch (estado)
        {
            case EDO_INICIO:
                display.setCurrent(new PInicio(this));
                break;
            case EDO_PIN:
                pantallaPIN();
                break;
            default:
                display.setCurrent(display.getCurrent());
        }

    }

    public void destroyApp(boolean unconditional)
    {
    }
   
    public void pauseApp()
    {
    }

    public void commandAction(Command c, Displayable s)
    {
        if (c == cmdOK)
        {
            switch (estado)
            {
                case EDO_TELEFONO:
                    if (textField1.getString().length() < 1 || textField2.getString().length() < 10)
                    {
                        pantallaMensaje("Error. Número inválido. Intente de nuevo", 1);
                        return;
                    }
                    config.setUsr(textField1.getString().trim().replace(' ', '0'));
                    config.setPtn(textField2.getString().trim().replace(' ', '0'));
                    break;
                   
                 case EDO_CVEPTN:
                    pantallaTelefono();
                    break;    
                case EDO_PIN:
                    if (textField1.getString().equals("nxtlcert01"))
                    {
                        if (!inicioActividades())
                        {
                            pantallaInicioActividades();
                        }
                    }
                    else
                    {
                        pantallaMensaje("Password incorrecto", 1);
                    }
                    break;
               
                default:
                    pantallaMenuP();
                    break;
            }
            //FIN cmdOK
        }
        else if (c == cmdMensaje)
        {
            if (tipoMensaje == 0)
            {
                cargaPantallaSalir();
                new FinalizarAplicacion();
                return;
            }
            switch (estadoAnterior)
            {
                case EDO_TELEFONO:
                    pantallaTelefono();
                    break;
                case EDO_PIN:
                    pantallaPIN();
                    break;
            }
        }
        else if (c == cmdSalir)
        {
            cargaPantallaSalir();
            new FinalizarAplicacion();
        }
        else if(c == cmdCambioPTN)
        {
            cargaPantallaCVEPTN();
        }
        else if( c == cmdEnvioSalir )
        {
            canvasEnvio.stop();
            canvasEnvio = null;
            System.gc();
            this.destroyApp(true);
            return;
        }
    }
 
    public void iniciar()
    {
        this.pantallaPIN();
    }

    public void pantallaTelefono()
    {
        estado = EDO_TELEFONO;
        System.out.println("Peux semaforo 05: estoy en pantalla telefono");
        form = new Form("Usuario");
        textField1 = new TextField("Usuario: ", "", 12, TextField.ANY | TextField.NON_PREDICTIVE);
        textField2 = new TextField("PTN: ", "", 10, TextField.NUMERIC | TextField.NON_PREDICTIVE);
        cmdOK = new Command(ok, Command.OK, 1);
        cmdSalir = new Command(salir, Command.EXIT, 2);
        encabezado1 = new ImageItem(null, encabezado, ImageItem.LAYOUT_CENTER, null);
        form.append(encabezado1);
        textField1.setLayout(Item.LAYOUT_LEFT);
        textField2.setLayout(Item.LAYOUT_LEFT);
        form.append(textField1);
        form.append(textField2);
        form.addCommand(cmdOK);
        form.addCommand(cmdSalir);
        form.setCommandListener(this);
        display.setCurrentItem(textField1);
        display.setCurrent(form);
    }
   
     public void cargaPantallaCVEPTN()
     {
        estado = EDO_CVEPTN;
        cmdOK = new Command("OK", Command.OK, 1);
        cmdSalir = new Command("Salir", Command.EXIT, 2);
        form = new Form("Cambiar PTN");
        txtClave = new TextField("Clave de Acceso:", "", 10, TextField.PASSWORD|TextField.NON_PREDICTIVE);
        encabezado1 = new ImageItem(null, encabezado,ImageItem.LAYOUT_CENTER, null);
        form.append(encabezado1);
        txtClave.setLayout(Item.LAYOUT_LEFT);
        form.append(txtClave);
        form.addCommand(cmdOK);
        form.addCommand(cmdSalir);
        form.setCommandListener(this);
        display.setCurrent(form);
        display.setCurrentItem(txtClave);
    }

    public void pantallaPIN()
    {
        estado = EDO_PIN;
        System.out.println("Peux semaforo 14: estoy en pantallaPIN.");
        form = new Form("Usuario");
        textField1 = new TextField("Password: ", "", 12, TextField.ANY | TextField.PASSWORD | TextField.NON_PREDICTIVE);
        cmdOK = new Command(ok, Command.OK, 1);
        cmdSalir = new Command(salir, Command.OK, 2);
        cmdCambioPTN = new Command("Cambiar PTN",Command.ITEM,3);
        encabezado1 = new ImageItem(null, encabezado, ImageItem.LAYOUT_CENTER, null);
        form.append(encabezado1);
        StringItem strItmUsr=new StringItem("Usr: ", "NXTLCERT01");
        strItmUsr.setLayout(Item.LAYOUT_LEFT);
        form.append(strItmUsr);
        StringItem strItmPTN=new StringItem("PTN: ", "5541152502");
        strItmPTN.setLayout(Item.LAYOUT_LEFT);
        form.append("\n" + strItmPTN.getLabel() + strItmPTN.getText());
        textField1.setLayout(Item.LAYOUT_LEFT);
        form.append(textField1);
        form.addCommand(cmdOK);
        form.addCommand(cmdSalir);
        form.addCommand(cmdCambioPTN);
        form.setCommandListener(this);        
        display.setCurrentItem(textField1);
        display.setCurrent(form);        
    }

    public void pantallaMenuP()
    {
        estado = EDO_MENUP;
        list = new List(titulo, List.IMPLICIT, opcMenuP, null);
        cmdOK = new Command(ok, Command.OK, 1);
        cmdSalir = new Command(salir, Command.EXIT, 2);
        list.addCommand(cmdOK);
        list.addCommand(cmdSalir);
        list.setCommandListener(this);
        list.removeCommand(List.SELECT_COMMAND);
        list.setSelectCommand(cmdOK);
        pantallaMCanvas = new MenuPCanvas(this);
        display.setCurrent(pantallaMCanvas);
    }

    public void pantallaInicioActividades()
    {
        estado = EDO_INICIOACTIVIDADES;
        form = new Form("Inicio Actividades");
        cmdOK = new Command(ok, Command.OK, 1);
        fechaInicial = libreria.FormateaFecha(Calendar.getInstance());
        horaInicial = libreria.FormateaHora(Calendar.getInstance());
        horaFinal = horaInicial;
        encabezado1 = new ImageItem(null, encabezado, ImageItem.LAYOUT_CENTER, null);
        form.append(encabezado1);
        form.append("Fecha: " + fechaInicial.substring(0, 2) + "/" + fechaInicial.substring(2, 4) + "/" + fechaInicial.substring(4) + "\n");
        form.append("Hora: " + horaInicial.substring(0, 2) + ":" + horaInicial.substring(2, 4) + ":" + horaInicial.substring(4) + "\n");
        form.addCommand(cmdOK);
        form.setCommandListener(this);
        display.setCurrent(form);
    }
   
    public void pantallaMensaje(String texto, int tipo)
    {
        estadoAnterior = estado;
        tipoMensaje = tipo;
        estado = EDO_MENSAJE;
        form = new Form("Mensaje");
        cmdMensaje = new Command(ok, Command.EXIT, 1);
        encabezado1 = new ImageItem(null, encabezado, ImageItem.LAYOUT_CENTER, null);
        form.append(encabezado1);
        form.append(texto);
        form.addCommand(cmdMensaje);
        form.setCommandListener(this);
        display.setCurrent(form);
    }

    public boolean inicioActividades()
    {
        boolean OK = false;
        String bdFecha = "";
        if (bdFecha.equals(libreria.FormateaFecha(Calendar.getInstance())))
        {
            OK = true;
        }
        return OK;
    }

    public void cargaPantallaSalir()
    {
        form = new Form("Fin Aplicación");
        encabezado1 = new ImageItem(null, encabezado,ImageItem.LAYOUT_CENTER, null);
        form.append(encabezado1);
        form.append("\npor favor espere...");
        display.setCurrent(form);
    }

    private class FinalizarAplicacion extends Thread
    {
        public FinalizarAplicacion()
        {
            start();
        }
        public void run()
        {
            try
            {
                sleep(1000);
            }
            catch(Exception e)
            {
                System.out.println("Error en la espera de FinalizarAplicación: "+e);
            }
            destroyApp(false);
            notifyDestroyed();
        }
    }
}

Re: Clase Completa

Hola Bryan
He revisado tu clase y en teoria ninguna funcion esta modificando el comportamniento del control TextField (realmente raro).

Has una ultima prueba utilizando solamente :
form.append(new TextField("Password", null, 8, TextField.PASSWORD));

Mas bien unas consultas:
- El mismo problema persiste para los otros TextFields que usas?
- Has tenido el mismo problema en otro de tus aplicativos desarrollados, usando las mismas librerias?
- El proyecto solo tiene esa clase o hace uso de otras librerias?

Me avisas ya que habria que hacerle seguimiento al comportamiento de ese control.

Gerardo Chung
Desarrollo Blackberry Senior
Nextel del Peru S.A.

Prueba de seugerencia.

Hola Gerardo,

Aquí reportandome, te comento que he realizado la prueba sin éxito, ya que el problema persiste. Respecto a las inquietudes que me mencionas, efectivamente no sólo me pasa en este TextField, realmente es en todos aquellos en los que ocupo "TextField.PASSWORD" y finalmente en el proyecto no se utilizan mas librerias.

Saludos,

Bryan Santos.
Desarrollo.
Actin México.

Soporte de RIM

Hola Bryan,

Que raro el problema. Veo que la sugerencias de Gerardo, aun que buenas, no han funcionado. Vamos a comunicarnos con RIM para ver cuál puede ser el problema.