C プログラムを表示するアプリを開発しています。データベースに保存され、文字列として取得され、textview に渡されるテキストに単純な配色を与えたいと考えていました。
私が書いたコードは、緑色をヘッダー ファイルの宣言と括弧に割り当て、青色を数値に割り当て、printf、scanf...赤色を int、char、float などのデータ型に割り当てます。
ただし、非常に非効率的です。この配色を適用する前に、私のアプリは textview アクティビティを即座に表示していました。今では、プログラムの長さに応じて最大 4 ~ 5 秒かかるため、パフォーマンスが非常に低下します。
それは、一度に 1 つのキーワードを取り、その特定のキーワードのみを探して textview の完全なテキストを繰り返し、その色を変更し、テキストを再度設定します。したがって、文字列配列で 29 個のキーワード (つまり、keywordsgreen、keywordsblue、keywordsred) を定義したため、テキストビュー全体のテキストを 29 回トラバースします。
アクティビティの onCreate 関数には、次のコードが含まれています。
textView = (TextView) findViewById(R.id.textView1);
textView.setText(programtext);
textView.setBackgroundColor(0xFFE6E6E6);
//The problem stars here
String [] keywordsgreen={"#define","#include","stdio.h","conio.h","stdlib.h","math.h","graphics.h","string.h","malloc.h","time.h","{","}","(",")","<",">","&","while ","for "};
for(String y:keywordsgreen)
{
fontcolor(y,0xff21610B);
}
String [] keywordsred={"%d","%f","%c","%s","int ","char ","float","typedef","struct ","void "};
for(String y:keywordsred)
{
fontcolor(y,0xFFB40404);
}
String [] keywordsblue={"printf","scanf","\n","getch","0","1","2","3","4","5","6","7","8","9"};
for(String y:keywordsblue)
{
fontcolor(y,0xFF00056f);
}
fontcolor 関数は次のとおりです。
private void fontcolor(String text,int color)
{
Spannable raw=new SpannableString(textView.getText());
int index=TextUtils.indexOf(raw, text);
while (index >= 0)
{
raw.setSpan(new ForegroundColorSpan(color), index, index + text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
index=TextUtils.indexOf(raw, text, index + text.length());
}
textView.setText(raw);
}