小さなコード エディター アプリを作成します。問題は、拡張子を変更しても特定の単語の色が変更されないことです。文字列配列リソース ファイルを使用して特定の単語を識別します。また、[名前を付けて保存] ダイアログを使用して拡張機能を取得する 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
誰かが私に何が問題なのか、これを行う正しい方法は何かを説明できれば、それは私にとって非常に役に立ちます。