Ayuda para hacer un editor de textos simple


#1

Hola, veréis, estoy haciendo un juego para una tableta android y me he topado con un problema a la hora de introducir los nombres de los jugadores.
No me ha hecho falta ni la librería ketay ni nada especial para llamar al teclado android, lo hago así y funciona

boolean keyboard = false;

void setup() {
  fullScreen();
  textSize (40 * displayDensity);
  fill(0);
}    

void draw() {
  background(255);
  text(key, width/2-40, height/2);
  text(keyCode, width/2, height/2);
  text(int(key), width/2+80, height/2);
}

//void keyPressed() {
 void keyTyped() { 
  background(200, 50, 30);  
}

void mousePressed() {
  if (!keyboard) {
    openKeyboard();
    keyboard = true;
  } else {
    closeKeyboard();
    keyboard = false;
  }
}

Pero ni con keyPressed() ni con keyTyped() consigo distinguir las mayúsculas y mucho menos la ñ

Alguien me puede orientar

Gracias


#2

En qué momento necesitas distinguir si son mayúsculas, minúsculas o ñ? Qué intentas hacer?


#3

Hola! Nos puedes decir contra cual Android API estas ejecutando tu app? Ademas nos indicas la version del modo Android que estas utilizando y la version de Processing? Estas corriendo esto en el simulador on en un telefono? En cual? Relacionado con la ñ, estas configurando tu teclado al español en Processing o lo configuraste a travez del menu de configuraciones y personalizaciones de Android? Me estoy refieriendo al menu de seleccion de lenguage nativo de Android? Este último detalle es importante para reproducir el problema.

Relacionado con lo de las letras mayúsculas y minúsculas, te refieres a que la tecla CAPS o SHIFT no funcionan en tu caso? Yo no veo como estas testeando las letras en tu codigo. Depronto lo que necesitas es esto?

Kf


#4

Hola, no me puedo creer que he estado un mes entero sin mirar esto. En fin, disculpar…

Veras haimoid, la secuencia que he puesto en el primer post creo que la he probado de todas las formas posibles. Detecto las mayúsculas pero no detecto después la letra que pulso. Por ejemplo quiero poner la letra “a” en mayusculas, Si bloqueo las mayúsculas se imprimen caracteres raros y pasa lo mismo si lo hago utilizando la tecla sift.

Kfrajer, mañana pongo la versión de android y de procesing porque no lo tengo aquí, pero lo que trato es de que pulsando sobre un recuadro con el prefijo nombre, el usuario pueda introducir un texto con su nombre para luego guardarlo con los puntos obtenidos. Bien utilizando un popup (en windows se como hacerlo porque esta publicado pero NO en android) o bien en una capa PGraphics.

Mañana las versiones pero ahora las gracias por interesaros

Gracias


#5

processing versión 3-4 (64) y android 5.1.1 subre una samsung galaxi SM-T330
No utilizo el simulador porque no he sido capaz de cargarlo

Gracias


#6

Con este programa en Linux

void draw() {}
void keyPressed() {
  background(0);
  text((int)key, 20, 20);
  text((int)keyCode, 20, 40);
}

muestra:

a      -> key    97, keyCode 65
shift  -> key 65535, keyCode 16
A      -> key    65, keyCode 65

Qué te aparece en Android al teclear a y A, lo mismo en los dos casos?

Y cuando pulsas ñ no te aparace nada?


#7

Studio.ProcessingTogether.com/sp/pad/export/ro.9cfU11egvzT6G


#8

Hola
Hamoid, la respuesta de mi android a la pulsación de las teclas son:
tecla a -> key = a keyCode = 29 int(key) = 97
shift -> key = rectangulo tachado keyCode = 59 int(key) = 65535
A con shift -> key = rectangulo tachado keyCode = 59 int(key) = 65535
A con shift fijado -> key = rectangulo tachado keyCode = 59 int(key) = 65535
tecla ñ -> key = nada keyCode = nada int(key) = nada
otros ejemplos
tecla d -> key = d keyCode = 32 int(key) = 100
D con shift -> key = rectangulo tachado keyCode = 59 int(key) = 65535

Observa que después de pulsar shift ya no responde nada a cualquier pulsación de tecla
En linux si tienes el teclado normal del ordenador no creo que pase lo mismo, creo que el problema es el teclado de pantalla del android.

GoToLoop, interesante la referencia pero no termino de entender la utilidad
No lo he compilado par android porque hay que implementar también la llamada al teclado pero la respuesta a la tecla “a” es 65, a shift es 16 y manteniendo pulsada la tecla sift + a responde de nuevo 65, lo que no me aporta es la suma de ambas. En los titulos aparece como código respuesta a la pulsación de varias teclas, pero no termino de ver como funciona. Seguiré intentando desglosarlo a ver si lo entiendo Gracias de todas formas

Si fuera el caso de hacerlo en windows, utilizaría esta utilidad
https://blog.jorgeivanmeza.com/2012/02/utilizando-dialogos-en-processing-para-solicitarmostrar-informacion-al-usuario/
Es java y a lo mejor alguien sabe como compilarla para android

Gracias


#9

Parece que el javax.swing.JOptionPane que mencione como solución a compilar, no sirve para android.
He probado la biblioteca de apwidgets.*; pero en processing 3.4 no se reconoce PWidgetContainer ni los demás derivados.

Me esta funcionando lo siguiente que extraje de aquí:
https://forum.processing.org/two/discussion/26349/android-input-box

// ANDROID ACTIVITY LIFECYCLE'S FUNCTIONS:
 
@ Override 
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
}
 
@ Override 
  public void onStart() {
  super.onStart();
  act = this.getActivity();
  mC= act.getApplicationContext();
  act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
 
  edit = new EditText(mC);
  edit.setLayoutParams (
    new RelativeLayout.LayoutParams (
    RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT
    )
    );
  edit.setHint("Pulsa aqui para escribir ....");
  edit.setTextColor(Color.rgb(0, 0, 0));
  edit.setHintTextColor(Color.rgb(170, 170, 170));  
  edit.setBackgroundColor(Color.WHITE);      // edit.getBackground().setAlpha(255);  
  edit.getLayoutParams().width = 14*width/26;  
  edit.getLayoutParams().height = height/17; 
 // edit.setX(psetx);
 // edit.setY(psety);
  edit.requestFocus();
  
    edit.setInputType(android.text.InputType.TYPE_CLASS_TEXT); 

  edit.setOnKeyListener(
    new View.OnKeyListener() {
    @ Override
      public boolean onKey(View v, int keyCode, KeyEvent event) {
        
      if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode()== KeyEvent.KEYCODE_ENTER)
        { // cerrar teclado
        InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
        hideInputBox();
        return true;
      }
      return false;
    }
  }
  );
 
  fl = (FrameLayout)act.findViewById(R.id.content);
  fl.addView(edit);
  
  android.view.inputmethod.InputMethodManager imm = (android.view.inputmethod.InputMethodManager) getActivity().getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
  imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
}
 
@ Override 
  public void onResume() {
  super.onResume();
  act = this.getActivity();
  mC= act.getApplicationContext();
  act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
 
@ Override 
  public void onPause() {
  super.onPause();
}
 
@ Override 
  public void onStop() {
  super.onStop();
}

@ Override 
  public void onDestroy() {
  super.onDestroy();
}

bien, esto crea un actividad paralela al arrancar que llamo con las siguientes funciones showInputBox() y hideInputBox() :

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.*;   //View;

import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.LinearLayout;  
import android.widget.EditText;

import android.graphics.Color;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.view.View.OnKeyListener;
import android.view.View;
import android.view.KeyEvent;

import android.view.ViewGroup.LayoutParams;
import android.view.Gravity;
import android.R;
import android.widget.Toast;
import android.os.Looper;
/// dialogo alert
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;

String alertMessage = "";



Activity act;
Context mC;
 
FrameLayout fl;
EditText edit; // texto editable

String txt;
int xbut, ybut, wbut = 110, hbut = 35;

boolean pressed;

void setup() {
  fullScreen();
  //orientation(PORTRAIT);//LANDSCAPE);
  background(0, 0, 255);
  
 pressed = false;
 pressed = true;
  xbut = width/10;
  ybut = height/6;
  
 Looper.prepare(); // varios runables en cola
 hideInputBox() ;
 
}
 
void draw() {
    inputButton(xbut, ybut, wbut, hbut);
}

void inputButton (int x, int y, float w, float h) {
  textSize(20);
  stroke(127);
  fill(130, 0, 0);
  rect(x, y, w, h);
  fill(255);
  text("Input", x + 30, y + 25);
}

void showInputBox() {
  int pasetx  = width/3;
  int pasety = height/6;

  background(0, 0, 255);
 edit.setX(pasetx);
 edit.setY(pasety);
  edit.getText().clear();
  act.runOnUiThread(
    new Runnable() { 
    public void run() {
      edit.setVisibility(View.VISIBLE);
      edit.requestFocus();
    }
  }
  );
   pressed = true;
}
void hideInputBox() {
  background(0, 0, 255);
  if (pressed){
  String txt = edit.getText().toString();
  setMessage(txt);
  createAlert();
   }
  act.runOnUiThread(
    new Runnable() {
    public void run() {
      edit.setVisibility(View.GONE);
    }
  }
  );
   pressed = false;
}

void createAlert() {
  act.runOnUiThread(new Runnable() {
    //@ Override
      public void run() {
      AlertDialog.Builder builder = new AlertDialog.Builder(act);
      AlertDialog alertDialog = builder.create();
      alertDialog.setTitle("El texto dice:");
      alertDialog.setMessage(getMessage());
      alertDialog.setButton (DialogInterface.BUTTON_POSITIVE,"OK", new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, int which) {
              println(" cliqueado el OK button");
           }
       });
       alertDialog.setButton (DialogInterface.BUTTON_NEGATIVE,"Cancel", new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, int which) {
              println(" cliqueado el Cancel button");
           }
       });
       
       alertDialog.show();
     }
});
};

void setMessage(String mess){
 
  alertMessage = mess;
}
 
String getMessage(){
 
  return alertMessage;
}


void mousePressed() {
  if (mouseX >= xbut && mouseX <= xbut + wbut &&  mouseY >= ybut && mouseY <= ybut + hbut) { 
  // if (pressed == false) { showInputBox();}
  }
}

Con esto se resuelve la entrada de texto INCLUSO CON LA EÑE que como veréis lo presento en un “alert” que aparece al pulsar “intro” una vez relleno el cuadro de diálogo, con lo que podría ir fichando los nombre de los jugadores sin problema.

PERO … al ser un actividad que se ejecuta en paralelo, cuando comienza la ejecución del sketch se aparece el teclado y no consigo evitarlo . Tengo localizada la rutina que se encarga de ello pero soy incapaz de aislarla porque necesita la referencia de la v, “la instancia del view que inicia la entrada” que no doy con ella
http://www.hermosaprogramacion.com/2016/03/edittext-android/

// Ocultar teclado virtual
InputMethodManager imm =
        (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);

El caso es que soy incapaz de ver la relación entre la activity y la pantalla que manejo desde processing. TODOS LOS DIAS INTENTO AVANZAR EN COMPRENDERLO pero me agota …
No se podría tratar el EditText desde una subrutina no onStart de la activity igual que se hace con el AlertDialog.Builder ???

En fin, a alguien se le ocurre algo ¿?