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 ¿?