Нестабильный пользовательского поля редактирования
Я создал собственное поле для редактирования, потому что я хочу изменить цвет фона.
первый, второй и третий показываются нестабильно, иногда отображаются при фокусировке, исчезают при потере фокусировки.
Я хочу получить результат, подобный третьему изображению, на котором фокусировка и статическое отображение всего поля.
Вот мой Custom_EditField
:
public class Custom_EditField extends EditField {
private int width, row, color;
private boolean isfocus;
Custom_EditField(long style, int width, int row) {
super(style);
this.width = width;
this.row = row;
}
public int getPreferredHeight() {
return Font.getDefault().getHeight() * row;
}
public int getPreferredWidth() {
return width;
}
protected void onFocus(int direction) {
color = Color.GRAY;
isfocus = true;
}
protected void onUnfocus() {
color = Color.GOLD;
isfocus = false;
}
protected void layout(int maxWidth, int maxHeight) {
super.layout(maxWidth,
Math.min(maxHeight, Font.getDefault().getHeight() * row));
super.setExtent(maxWidth,
Math.min(maxHeight, Font.getDefault().getHeight() * row));
}
protected void paint(Graphics graphics) {
int rectHeight = getPreferredHeight();
int rectWidth = getPreferredWidth();
try {
if (isfocus) {
graphics.setBackgroundColor(color);
} else {
graphics.setBackgroundColor(color);
}
color = Color.BLACK;
graphics.setColor(color);
graphics.drawRect(0, 0, rectWidth, rectHeight);
super.paint(graphics);
} finally {
graphics.setColor(color);
}
}
}
2 ответа
Я не уверен на 100%, о какой проблеме вы спрашиваете:
- Как нарисовать свои собственные цвета фона для
EditField
, или же - как исправить проблему исчезновения полей при перемещении фокуса
1) Если это вторая проблема (исчезает), то я думаю, что у вас та же проблема, что и в вашем другом вопросе, с Custom_TopField
кнопки исчезают
Итак, если эти Custom_EditField
объекты создаются менеджером, который расширяет VerticalFieldManager
, но также реализует sublayout()
сам, чтобы выполнить все позиционирования, затем попробуйте решение, которое я предложил в другом вопросе (не расширяйте VerticalFieldManager
Продли Manager
).
2) Если это не сработает, возможно, ваш paint()
метод не срабатывает, когда должен. Попробуйте добавить звонок в invalidate()
в ваших фокус-методах, наряду с вызовом методов суперкласса onFocus()
а также onUnfocus()
:
protected void onFocus(int direction) {
color = Color.GRAY;
isfocus = true;
invalidate();
super.onFocus(direction);
}
protected void onUnfocus() {
color = Color.GOLD;
isfocus = false;
invalidate();
super.onUnfocus();
}
3) И вам может понадобиться реализовать это тоже:
public boolean isFocusable() {
return true;
}
Но сначала проверьте класс менеджера, чтобы убедиться, что это не та же проблема, что и в вашем другом вопросе.
Также...
В этом классе вы основываете высоту поля редактирования на номере строки. Это действительно то, что вы хотите? Строка 0 будет иметь размер 0, и каждая строка после этого будет становиться все выше и выше. Это действительно интерфейс? Обычно у всех полей редактирования строк будет одинаковый размер, и вы просто разметите их с другим смещением y. Скорее всего, этот класс не должен знать, какие row
это было помещено на. Эта информация обычно является ответственностью объекта менеджера.
protected EditField getEditField() {
EditField edit_field = new EditField("", "", 10, EditField.NO_NEWLINE
| BasicEditField.FIELD_VCENTER) {
protected boolean navigationClick(int status, int time) {
}
protected void onFocus(int direction) {
Set the boolean during focus
}
protected void onUnfocus() {
}
protected void paintBackground(Graphics graphics_paint) {
if(that boolean is true)
{
Set your custom background during focus.
}else{
Set your custom background during unfocus.
}
}
protected void paint(Graphics graphics_paint) {
int old_color = graphics_paint.getColor();
try {
if(that boolean is true)
{
Set your custom Font color during any event like focus and click.
}else{
Set your custom background Font color during any event like unfocus.
}
super.paint(graphics_paint);
} finally {
graphics_paint.setColor(old_color);
}
}
public void layout(int width, int height) {
}
};