изменить определенный цвет слова при вводе в текстовом редакторе или MultiAutoCompleteTextView с расширением файла - PullRequest
0 голосов
/ 28 ноября 2018

Я создаю небольшое приложение-редактор кода. Проблема в том, что изменение расширения не приводит к изменению цвета определенных слов. Я использую файл ресурсов строкового массива для определения конкретного слова.а также добавьте класс Common, чтобы получить расширение, используя диалоговое окно save as.В общем классе у меня возникла проблема с использованием ниже,

public static String currentExtention;

Ошибка исключения нулевой точки. Затем я установил для него значение, например «txt».Но теперь проблема не меняет цвет, когда я меняю расширение.Мои классы приведены ниже.

public class Common {
    public static String currentExtention="txt";
    public static void setCurrentExtention(String extention)
    {
       currentExtention=extention;
    }

    public static String getCurrentExtention()
    {
       return currentExtention;
    }
} 

Я изменяю тип данных, используя FileSaveDialog class.using

Common.setCurrentExtention(extention );

расширение, заданные значения получаются пользователем.это работа и передача Основная деятельность по исправлению расширения.В моем классе деятельности ниже

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_file);

    txtnumberView = (TextView) findViewById(R.id.numberViewText);
    edtTextView = (MultiAutoCompleteTextView) findViewById(R.id.edtTextView);
    relativeLayout = (RelativeLayout) findViewById(R.id.layout_root);
    helper = new TextViewUndoRedo(edtTextView);
    context = NewFileActivity.this;
    fileSaveDialog = new FileSaveDialog(context);
    findTextDialog = new FindTextDialog(context);
    autoCompleteText = new AutoCompleteText(context);
    autoChangeNumberTxtView=new AutoChangeNumberTxtView(context,edtTextView,txtnumberView);

     switch (Common.getCurrentExtention()) {
        case "html":
            dataType = getResources().getStringArray(R.array.html);
            break;
        case "txt":
            dataType = getResources().getStringArray(R.array.txt);
            break;
    }
    regex = new StringBuilder("\\b(");
    for (String word : dataType) {
        regex.append(Pattern.quote(word));
        regex.append("|");
    }
    regex.setLength(regex.length() - 1); // delete last added "|"
    regex.append(")\\b");
    edtTextView.addTextChangedListener(new TextWatcher() {
        ColorScheme keywords = new ColorScheme(

                Pattern.compile(regex.toString()),
                Color.CYAN
        );

        ColorScheme numbers = new ColorScheme(
                Pattern.compile("(\\b(\\d*[.]?\\d+)\\b)"),
                Color.BLUE
        );

        final ColorScheme[] schemes = {keywords, numbers};

        void removeSpans(Editable e, Class<? extends CharacterStyle> type) {
            CharacterStyle[] spans = e.getSpans(0, e.length(), type);
            for (CharacterStyle span : spans) {
                e.removeSpan(span);
            }
        }

        class ColorScheme {
            final Pattern pattern;
            final int color;

            ColorScheme(Pattern pattern, int color) {
                this.pattern = pattern;
                this.color = color;
            }
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            autoChangeNumberTxtView.autoOnchange();
            textInType();


        }

        @Override
        public void afterTextChanged(Editable editable) {

                removeSpans(editable, ForegroundColorSpan.class);
                for (ColorScheme scheme : schemes) {
                    for (Matcher m = scheme.pattern.matcher(editable); m.find(); ) {
                        editable.setSpan(new ForegroundColorSpan(scheme.color),
                                m.start(),
                                m.end(),
                                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                    }


            }
        }

    });

Для дальнейшего развития я использую MultiAutoCompleteTextView вместо EditText.Я думаю, что проблема там.

  switch (Common.getCurrentExtention()) {
        case "html":
            dataType = getResources().getStringArray(R.array.html);
            break;
        case "txt":
            dataType = getResources().getStringArray(R.array.txt);
            break;
    }
    regex = new StringBuilder("\\b(");
    for (String word : dataType) {
        regex.append(Pattern.quote(word));
        regex.append("|");
    }
    regex.setLength(regex.length() - 1); // delete last added "|"
    regex.append(")\\b");
    edtTextView.addTextChangedListener(new TextWatcher() {
        ColorScheme keywords = new ColorScheme(

                Pattern.compile(regex.toString()),
                Color.CYAN
        );

        ColorScheme numbers = new ColorScheme(
                Pattern.compile("(\\b(\\d*[.]?\\d+)\\b)"),
                Color.BLUE
        );

        final ColorScheme[] schemes = {keywords, numbers};

        void removeSpans(Editable e, Class<? extends CharacterStyle> type) {
            CharacterStyle[] spans = e.getSpans(0, e.length(), type);
            for (CharacterStyle span : spans) {
                e.removeSpan(span);
            }
        }

        class ColorScheme {
            final Pattern pattern;
            final int color;

            ColorScheme(Pattern pattern, int color) {
                this.pattern = pattern;
                this.color = color;
            }
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void afterTextChanged(Editable editable) {

                removeSpans(editable, ForegroundColorSpan.class);
                for (ColorScheme scheme : schemes) {
                    for (Matcher m = scheme.pattern.matcher(editable); m.find(); ) {
                        editable.setSpan(new ForegroundColorSpan(scheme.color),
                                m.start(),
                                m.end(),
                                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                    }

Это не сбой, а отображение logcat ниже.когда я изменяю расширение файла.

E/ViewRootImpl: sendUserActionEvent() mView == null
E/ViewRootImpl: sendUserActionEvent() mView == null

Если кто-то может объяснить мне, в чем проблема или как правильно сделать это. Это будет очень полезно для меня.

...