1

小さなコード エディター アプリを作成します。問題は、拡張子を変更しても特定の単語の色が変更されないことです。文字列配列リソース ファイルを使用して特定の単語を識別します。また、[名前を付けて保存] ダイアログを使用して拡張機能を取得する Common クラスを追加します。一般的なクラスでは、以下を使用して問題が発生しました。

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 );

拡張機能は、ユーザーが設定値を取得します。それは仕事であり、メインアクティビティを正しい範囲に渡します。私のActivityクラスは以下です

@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);
                    }


            }
        }

    });

今後の開発では、EditText の代わりに MultiAutoCompleteTextView を使用します。そこに問題があると思います。

  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