Перемещение редактируемого текстового поля скремблирует текст в симуляторе - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу, чтобы пользователь ввел произвольное количество ключевых слов (или ключевых фраз).Для этого у меня есть строка TextFields, по одному на каждое ключевое слово.Я добавляю новый TextField в строку, когда все существующие содержат текст, чтобы пользователь мог ввести другое ключевое слово.

Добавление нового TextField происходит, когда символ добавляется в последний пустой TextField;то есть этот TextField редактируется при добавлении нового TextField.Кроме того, существующие текстовые поля будут перемещаться и изменяться при добавлении нового текстового поля (чтобы освободить место).

Это отлично работает на Android, но в симуляторе это не так.В similator редактируемое TextField перемещается, а редактируемый текст - нет.

Проблема может быть воспроизведена с использованием приведенной ниже формы.

С уважением, Франс.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.codename1.ui.Container;
import com.codename1.ui.Form;
import com.codename1.ui.Label;
import com.codename1.ui.TextArea;
import com.codename1.ui.TextField;
import com.codename1.ui.layouts.BoxLayout;
import com.codename1.ui.layouts.GridLayout;

public class TextFieldRelayoutForm extends Form
{
    public TextFieldRelayoutForm()
    {
        super("TextField relayout", BoxLayout.y());
        add(new Label("Type into the last text field below"));
        Strings strings = new Strings("blabla");
        strings.setStrings(Arrays.asList("one", "two"));
        add(strings);
    }

    public class Strings extends Container
    {
        private final String hint;
        private final Runnable listener;

        public Strings(String hint)
        {
            this(hint, null);
        }

        public Strings(String hint, Runnable listener)
        {
            //TextField.setUseNativeTextInput(false);
            this.hint = hint;
            this.listener = listener;
            addEmptyField();
        }

        public void setStrings(List<String> strings)
        {
            removeAll();
            for (String string : strings)
            {
                addComponent(getTextField(string));
            }
            addEmptyField();
        }

        private TextField getTextField(String text)
        {
            TextField field = new TextField("", hint, 20, TextArea.ANY);
            field.setText(text);
            field.addDataChangedListener((t,i) -> textFieldDataChanged(field));
            return field;
        }

        private void textFieldDataChanged(TextField field)
        {
            if (!hasEmptyField())
            {
                addEmptyField();
            }
            if (listener != null)
            {
                listener.run();
            }
        }

        private boolean hasEmptyField()
        {
            for (int i = getComponentCount() - 1; i >= 0; i--)
            {
                String string = ((TextField)getComponentAt(i)).getText();
                if (string.length() == 0)
                {
                    return true;
                }
            }
            return false;
        }

        private void addEmptyField()
        {
            addComponent(getTextField(""));
            setLayout(new GridLayout(getComponentCount()));
            revalidate();
        }

        public List<String> getStrings()
        {
            List<String> strings = new ArrayList<>();
            for (int i = 0; i < getComponentCount(); i++)
            {
                String string = ((TextField)getComponentAt(i)).getText();
                if (string.length() != 0)
                {
                    strings.add(string);
                }
            }
            return strings;
        }
    }
}

1 Ответ

0 голосов
/ 04 декабря 2018

Редактирование происходит в собственном коде, поэтому при редактировании мы «плавно» размещаем собственное текстовое поле поверх облегченного текстового поля и позволяем вам редактировать.Я процитировал легко, поскольку эта абстракция протекает в некоторых случаях, и это один из них.Вот почему рекомендуется использовать stopEdit / startEditAsync при изменении макетов или информации о текстовых полях.

О подобных проблемах можно прочитать в этом посте https://www.codenameone.com/blog/tip-stop-editing.html

Другой, возможно, лучшей альтернативой будетиспользуйте слушателя действия.Это происходит только после завершения редактирования.Это означает меньше событий, и когда вы вносите изменения, вам не нужно взламывать.Недостатком является то, что пользователю необходимо отказаться от редактирования, чтобы появилось новое поле.

...