tocar - El cursor no aparece en Editfield en Blackberry
quitar coordenadas pantalla android (1)
Es un poco tonto que haya tanto trabajo solo para dibujar correctamente un fondo rectangular redondeado en un EditField
, pero parece que otros también han tenido este problema
Solución uno
Si adapta la respuesta de Peter Strange a esa pregunta, su código podría parecerse al MobEditField
publicado a continuación. EditField
clase anónima EditField
en una clase separada, ya que se agregó mucho código. Si realmente quieres, puedes mantener el código como una clase anónima (lo que creo que es realmente malo para la legibilidad).
private class MobEditField extends EditField {
private boolean _drawFocus = false;
public MobEditField() {
super("", "", 11, EditField.NO_NEWLINE|EditField.FILTER_NUMERIC|EditField.FOCUSABLE);
}
protected void paint(Graphics graphics) {
if (!_drawFocus) {
int oldColor = graphics.getColor();
graphics.setColor(Color.WHITE);
graphics.fillRoundRect(0, 0, getWidth() - (getWidth() / 10), getHeight(), 5, 5);
graphics.setColor(Color.BLACK);
graphics.drawText(getText(), 0, 0);
graphics.setColor(oldColor);
}
super.paint(graphics);
}
protected void drawFocus(Graphics graphics, boolean on) {
_drawFocus = on;
super.drawFocus(graphics, on);
_drawFocus = false;
}
protected void onFocus( int direction ) {
super.onFocus( direction );
invalidate();
}
protected void onUnfocus() {
super.onUnfocus();
invalidate();
}
}
entonces simplemente lo haces:
ef_mob = new MobEditField();
Toma nota de algunas cosas:
- No llame a
ef_mob.getText()
desde el métodoef_mob.getText()
de la clase anónima. Solo llame agetText()
. No sé cómo compiló el código original. - Lo mejor es que, al anular el método
paint()
, guarde el color inicial del objetoGraphics
(o alfa, o lo que sea que cambie) y luego reinícielo al final. - Los
onFocus()
yonUnfocus()
se anulan para forzar el repintado - El método
paint()
simplemente permite asuper.paint()
hacer todo el trabajo cuando el campo está enfocado. Dependiendo de cómo desee que se vea su campo, es posible que deba ajustarlo un poco.
Solución dos
Otra alternativa que funcionó para mí es aprovechar el método paintBackground()
indocumentado que tiene EditField
. Por supuesto, siempre hay inconvenientes en el uso de métodos no documentados. Entonces, lo ofrezco solo como una opción:
ef_mob = new EditField("", "", 11, EditField.NO_NEWLINE|EditField.FILTER_NUMERIC|EditField.FOCUSABLE) {
protected void paint(Graphics graphics) {
int oldColor = graphics.getColor();
graphics.setColor(Color.BLACK);
graphics.drawText(getText(), 0, 0);
graphics.setColor(oldColor);
super.paint(graphics);
}
protected void paintBackground(Graphics g) {
int oldColor = g.getColor();
g.setColor(Color.WHITE);
g.fillRoundRect(0, 0, getWidth()-(getWidth()/10), getHeight(), 5, 5);
g.setColor(oldColor);
}
};
Aquí, moví la llamada a fillRoundRect()
de paint()
y hacia paintBackground()
.
El cursor no aparece en Editfield ..
Lo siguiente es el código ...
ef_mob = new EditField("", "", 11, EditField.NO_NEWLINE|EditField.FILTER_NUMERIC|EditField.FOCUSABLE) {
protected void paint(Graphics graphics) {
graphics.setColor(Color.WHITE);
// graphics.drawRoundRect(0, 0, getWidth()-(getWidth()/10), getHeight(), 5, 5);
graphics.fillRoundRect(0, 0, getWidth()-(getWidth()/10), getHeight(), 5, 5);
graphics.setColor(Color.BLACK);
graphics.drawText(ef_mob.getText(), 0, 0);
super.paint(graphics);
}
};
¿Cuál es el problema?