【问题标题】:Using Java Prettify for Android app syntax highlighting使用 Java Prettify 进行 Android 应用语法高亮
【发布时间】:2014-04-03 04:48:56
【问题描述】:

我需要将语法高亮功能集成到我的 Android 应用程序中。我尝试使用 Java Prettify(https://code.google.com/p/java-prettify),但未能集成它。该应用程序正在崩溃。而且由于我的 avd 不工作,所以我无法从 logcat 获取有关崩溃的信息。

我正在关注此信息:https://code.google.com/p/java-prettify/wiki/UseTheParserAlone

到目前为止我的代码:

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import prettify.PrettifyParser;
import syntaxhighlight.ParseResult;
import syntaxhighlight.Parser;

public class PrettifyHighlighter {
Map<String, String> COLORS = buildColorsMap();
String FONT_PATTERN = "<font color=\"#%s\">%s</font>";
Parser parser = new PrettifyParser();

public String highlight(String fileExtension, String sourceCode) {
    StringBuilder highlighted = new StringBuilder();
    List<ParseResult> results = parser.parse(fileExtension, sourceCode);
    for(ParseResult result : results){
        String type = result.getStyleKeys().get(0);
        String content = sourceCode.substring(result.getOffset(), result.getOffset() + result.getLength());
        highlighted.append(String.format(FONT_PATTERN, getColor(type), content));
    }
    return highlighted.toString();
}

private String getColor(String type){
    return COLORS.containsKey(type) ? COLORS.get(type) : COLORS.get("pln");
}

private static Map<String, String> buildColorsMap() {
    Map<String, String> map = new HashMap<String, String>();
    map.put("typ", "87cefa");
    map.put("kwd", "00ff00");
    map.put("lit", "ffff00");
    map.put("com", "999999");
    map.put("str", "ff4500");
    map.put("pun", "eeeeee");
    map.put("pln", "ffffff");
    return map;
}

}

在调试时,我发现当我评论该行时: Parser parser = new PrettifyParser();

和它的相关行,没有应用程序崩溃。 我用谷歌搜索但没有得到解决方案。

我的日志:

03-02 07:57:12.300: E/AndroidRuntime(1245): FATAL EXCEPTION: main
03-02 07:57:12.300: E/AndroidRuntime(1245): Process: com.himanshujaju.codeit, PID: 1245
03-02 07:57:12.300: E/AndroidRuntime(1245): java.lang.NoClassDefFoundError: prettify.PrettifyParser
03-02 07:57:12.300: E/AndroidRuntime(1245):     at com.himanshujaju.codeit.PrettifyHighlighter.<init>(PrettifyHighlighter.java:14)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at com.himanshujaju.codeit.codeArea$Run.onPostExecute(codeArea.java:193)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at com.himanshujaju.codeit.codeArea$Run.onPostExecute(codeArea.java:1)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at android.os.AsyncTask.finish(AsyncTask.java:632)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at android.os.Handler.dispatchMessage(Handler.java:102)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at android.os.Looper.loop(Looper.java:137)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at android.app.ActivityThread.main(ActivityThread.java:4998)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at java.lang.reflect.Method.invokeNative(Native Method)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at java.lang.reflect.Method.invoke(Method.java:515)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
03-02 07:57:12.300: E/AndroidRuntime(1245):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 这是一个java库,有些类在android上是不存在的(例如:swing.*)。你可以试试code.google.com/p/android-codepad
  • stackoverflow.com/a/19787125/1340797 ...这是我看到这种突出显示方法的地方。
  • 请发帖logcat查找原因。
  • 我在我的问题中发布了 avd 没有开始。它永远卡在android加载屏幕上。它也无法识别我的 micromax a116i。
  • avd 很慢,需要等待启动(创建小屏avd 可能更好)。如果您使用设备,请确保已安装驱动程序。请谷歌如何做到这一点。没有 logcat,我帮不了你。

标签: java android syntax highlighting prettify


【解决方案1】:

我试过你的代码,效果很好。

  PrettifyHighlighter highlighter = new PrettifyHighlighter();
  String code = "for (int i = 0; i < 5; i++){System.out.println(i);}";
  String highlighted = highlighter.highlight("java", code);
  textView1.setText(Html.fromHtml(highlighted));

这是模拟器上的输出Textview

对于NoClassDefFoundError 异常,看起来eclipse 在构建时没有导出jar 库。试试this answer

【讨论】:

  • 很抱歉评论这个问题为时已晚,但它给出了字符串作为输出。换句话说,它并不打算编写代码......有什么办法可以保留缩进
猜你喜欢
  • 2021-09-08
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 2011-04-11
相关资源
最近更新 更多