1

我创建了小型代码编辑器应用程序。问题是,更改扩展名不会更改特定单词的颜色。我使用字符串数组资源文件来识别特定单词。并添加通用类以使用另存为对话框进行扩展。在普通类中,我在下面使用时遇到问题,

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

如果有人可以向我解释问题是什么或正确的方法是什么。这对我很有帮助。

4

0 回答 0