例えばブログ記事のような長いコンテンツをアプリで表示しようと考えている場合、このコンテンツがどのようにレンダリングされるかを考え、計画する必要があります。テキストビューを使用することは可能ですが、リンク、色、見出しなどの機能を考慮してカスタマイズするのは難しいでしょう。テキストビューは、あまり良い方法ではありません。そのため、2つの選択肢があります:webviewかmarkdownです。

この記事ではmarkdownを見ていきます。ほとんどのMarkdownライブラリは実際にはWebViewから作られていることに注意してください。

(a). tiagohm/MarkdownView

マークダウンのテキストを表示するAndroidライブラリです。

このライブラリはFlexmarkとその拡張機能の一部を使用しています。

このライブラリは以下のことができます。

  • 文字列 "からマークダウンを表示する。
  • アセット`からマークダウンを表示します。
  • マークダウンを URL からレンダリングする。

URLの場合、AsyncTaskを使ってマークダウンをダウンロードするので、アプリがフリーズすることはありません。これらのケースでは、URL、マークダウンテキスト、ファイルパスなどの適切な文字列`を渡すだけでよいのです。

ステップ1: インストール

jitpack でホストされているので、ルートレベルの build.gradle ファイルの allProjects クロージャの下に jitpack を maven の URL として追加する必要があります。

maven { url 'https://jitpack.io' }

次に、アプリレベルの build.gradle ファイルに依存関係を追加します。

implementation 'com.github.tiagohm.MarkdownView:library:0.19.0'

その後、プロジェクトを同期します。

Step 2: MarkdownViewをレイアウトに追加する

次のステップでは、レイアウトにMarkdownViewを追加します。

<br.tiagohm.markdownview.MarkdownView
    android:id="@+id/markdown_view"
    app:escapeHtml="false"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

ステップ3: Markdownの読み込み

Javaを使用している場合、MarkdownViewを参照することから始めます。

mMarkdownView = (MarkdownView)findViewById(R.id.markdown_view);

Kotlinを使用している場合は、Kotlinの構文を使用してビューをインポートするか、あるいはViewBindingを使用した方が良いので、その必要はありません。

どちらにしても、次に進みます。デフォルトのCSSを使うことができます。

mMarkdownView.addStyleSheet(new Github());

または、assetsにある外部CSSを読み込みます。

mMarkdownView.addStyleSheet(ExternalStyleSheet.fromAsset("my_css.css", null))

次に string マークダウンを読み込みます。

mMarkdownView.loadMarkdown("**MarkdownView**");

または assets から markdown をロードします。

mMarkdownView.loadMarkdownFromAsset("markdown1.md");

または、ファイルオブジェクトとしてmarkdownをロードします。例えば、このファイルはファイルシステムから読み込むことができます。

mMarkdownView.loadMarkdownFromFile(new File());

あるいは、オンラインからマークダウンを読み込むこともできます。

mMarkdownView.loadMarkdownFromUrl("url");

以上で完成です。

Step 3: 追加機能

カスタムCSSを使うことができます。Java/Kotlinでプログラム的にCSSを構築するか。

//InternalStyleSheet css = new InternalStyleSheet();
InternalStyleSheet css = new Github();
css.addFontFace("MyFont", "condensed", "italic", "bold", "url('myfont.ttf')");
css.addMedia("screen and (min-width: 1281px)");
css.addRule("h1", "color: orange");
css.endMedia();
css.addRule("h1", "color: green", "font-family: MyFont");
mMarkdownView.addStyleSheet(css);

または、外部ファイルからCSSを読み込みます。

mMarkdownView.addStyleSheet(ExternalStyleSheet.fromAsset("github.css", null);
mMarkdownView.addStyleSheet(ExternalStyleSheet.fromAsset("github2.css", "screen and (min-width: 1281px)");

また、外部のJavascriptファイルを読み込むこともできます。

JavaScript js = new ExternalJavaScript(url, async, defer);
mMarkdownView.addJavascript(js);

このライブラリは機能が豊富です。以下のような特徴があります。

  • [x] ボールド *Text** または __Text__
  • [x] イタリック *Text* または _Text_ * [x] イタリック *Text* または _Text_
  • [x] Strikethrough ~~Text~~ (ストライクスルー)
  • [x] 横罫線 ---
  • [x] 見出し #
  • [x] リンク [alt](url)
  • [x] 画像 ![alt](url)
  • [x] コード
  • [x] ブロッククォート
  • [x] ネストされたブロッククオート
  • [x] リスト
  • [x] テーブル
  • [x] タスクリスト
  • [x] オートリンク
  • [x] 省略形
  • [x] マーク ==テキスト==
  • [x] 下付き文字 H~2~O
  • [x] 上付き文字 10^-10^
  • [x] キーストローク @ctrl+alt+del@
  • [x] MathJax Inline $x = {-b ˶‾᷄ -̫ ‾᷅˵} {-b^2-4ac}. \2a}$
  • [x] MathJax `$x = {-b Ōsqrt{b^2-4ac} ˶ˆ꒳ˆ˵ ) \♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪
  • [x] 脚注
  • [x] 画像のサイズ変更 ![alt](url@100px|auto)
  • [x] シンタックスハイライト(Highlight.jsを使用しています。
  • [x] Emoji (EmojiOne v2) :smile:
  • [x] カスタムCSS
  • [x] Youtube @[youtube](fM-J08X6l_Q)
  • [x] ツイッター
  • [x] JavaScripts
  • [x] Label --DEFAULT-- --SUCCESS--- ----WARNING---- -----DANGER-----
  • [x] ビーン {{フィールド名}}
  • [x] カスタム属性 { #id .class name=value name='value'}
  • [x] カスタム属性を使ったテキストの整列、テキストのサイズ、テキストの色

本ライブラリを使用したMarkdownViewの例を示します。

activity_main.xmlを使用しています。

まず、レイアウトの作成から始めます。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="br.tiagohm.markdownview.app.MainActivity">

    <br.tiagohm.markdownview.MarkdownView
        android:id="@+id/mark_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:escapeHtml="false" />
</LinearLayout>

MainActivity.java`を使用します。

次に、kotlinかjavaでコードを書きます。

package br.tiagohm.markdownview.app;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;

import br.tiagohm.markdownview.MarkdownView;
import br.tiagohm.markdownview.css.InternalStyleSheet;
import br.tiagohm.markdownview.css.styles.Github;

public class MainActivity extends AppCompatActivity {

    private MarkdownView mMarkdownView;
    private InternalStyleSheet mStyle = new Github();

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.change_theme_action:
                break;
        }

        return true;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Cria o bean.
        MyBean myBean = new MyBean();
        myBean.setHello("Olá");
        myBean.setDiasDaSemana(MyBean.DiasDaSemana.DOMINGO);

        mMarkdownView = findViewById(R.id.mark_view);
        mMarkdownView.addStyleSheet(mStyle);
        //http://stackoverflow.com/questions/6370690/media-queries-how-to-target-desktop-tablet-and-mobile
        mStyle.addMedia("screen and (min-width: 320px)");
        mStyle.addRule("h1", "color: green");
        mStyle.endMedia();
        mStyle.addMedia("screen and (min-width: 481px)");
        mStyle.addRule("h1", "color: red");
        mStyle.endMedia();
        mStyle.addMedia("screen and (min-width: 641px)");
        mStyle.addRule("h1", "color: blue");
        mStyle.endMedia();
        mStyle.addMedia("screen and (min-width: 961px)");
        mStyle.addRule("h1", "color: yellow");
        mStyle.endMedia();
        mStyle.addMedia("screen and (min-width: 1025px)");
        mStyle.addRule("h1", "color: gray");
        mStyle.endMedia();
        mStyle.addMedia("screen and (min-width: 1281px)");
        mStyle.addRule("h1", "color: orange");
        mStyle.endMedia();
        mMarkdownView.setBean(myBean);
        mMarkdownView.loadMarkdownFromAsset("markdown1.md");
    }

    public static class MyBean {

        public enum DiasDaSemana {
            DOMINGO,
            SEGUNDA,
            TERCA,
            QUARTA,
            QUINTA,
            SEXTA,
            SABADO
        }

        private String hello;
        private DiasDaSemana diasDaSemana;

        public String getHello() {
            return hello;
        }

        public void setHello(String hello) {
            this.hello = hello;
        }

        public DiasDaSemana getDiasDaSemana() {
            return diasDaSemana;
        }

        public void setDiasDaSemana(DiasDaSemana diasDaSemana) {
            this.diasDaSemana = diasDaSemana;
        }
    }
}

Hereがソースコードのリファレンスです。

リファレンス

このライブラリの詳細はこちらをご覧ください。

(b). falnatsheh/MarkdownView

MarkdownJを使用し、Android webviewを拡張しています。

MarkdownView(Markdown For Android)は、Markdownのテキストやファイル(ローカル/リモート)を整形されたHTMLとして表示したり、CSSを使って出力をスタイリングしたりするためのAndroidライブラリです。

MarkdownView自体はAndroid Webviewを拡張しており、Markdownを解析し(MarkdownJを使用)、出力されたHTMLをビューに表示するために必要なロジックを追加しています。

ステップ1: インストール

jcenterからMarkdownViewをインストールします。

implementation 'us.feras.mdv:markdownview:1.1.0'

Step 2: レイアウトへの追加

XMLレイアウトにMarkdownViewを追加します。

   <us.feras.mdv.MarkdownView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/markdownView" />

Step 3: コードを書く

Javaを使用している場合は、レイアウトのMarkdownViewを参照します。

MarkdownView markdownView = (MarkdownView) findViewById(R.id.markdownView);
markdownView.loadMarkdown("## Hello Markdown");

JavaでもKotlinでも、ビューバインディングやデータバインディングを使用することができます。Kotlinを使用している場合は、Kotlin Syntheticsを使用できます。

MarkdownViewをプログラムで作成することもできます。

  MarkdownView markdownView = new MarkdownView(this);
  setContentView(markdownView);
  markdownView.loadMarkdown("## Hello Markdown");

それでは、MarkdownViewライブラリを使ってローカルにマークダウンを読み込む例を見てみましょう。

MainActivity.java

import us.feras.mdv.MarkdownView;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Window;

public class LocalMarkdownActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MarkdownView webView = new MarkdownView(this);
        setContentView(webView);
        webView.loadMarkdownFile("file:///android_asset/hello.md");
    }
}

**テーマをMarkdownViewに適用する方法***。

例えば、テーマがあり、テーマを表示したいとします。ユーザーが「スピナー」からテーマを選び、そのテーマをMarkdownViewに適用します。

import us.feras.mdv.MarkdownView;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class MarkdownThemesActivity extends AppCompatActivity implements
        OnItemSelectedListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.markdown_themes);
        Spinner themesSpinner = (Spinner) findViewById(R.id.themes_spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                this, R.array.md_themes, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        themesSpinner.setAdapter(adapter);
        themesSpinner.setSelection(0);
        themesSpinner.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos,
            long id) {
        MarkdownView mdv = (MarkdownView) findViewById(R.id.markdownView);
        mdv.loadMarkdownFile("file:///android_asset/hello.md",
                "file:///android_asset/markdown_css_themes/"
                        + parent.getItemAtPosition(pos).toString() + ".css");
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // no-op
    }
}

「文字列」からマークダウンを読み込む方法について

マークダウンを string としてメモリに保存している場合、この例ではそれをロードする方法を示します。

public class MarkdownDataActivity extends AppCompatActivity {

    private EditText markdownEditText;
    private MarkdownView markdownView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.markdown_view);
        markdownEditText = (EditText) findViewById(R.id.markdownText);
        markdownView = (MarkdownView) findViewById(R.id.markdownView);
        String text = getResources().getString(R.string.md_sample_data);
        markdownEditText.setText(text);
        updateMarkdownView();

        markdownEditText.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {}

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                updateMarkdownView();
            }
        });

    }

    private void updateMarkdownView() {
        markdownView.loadMarkdown(markdownEditText.getText().toString());
    }
}

オンラインからMarkdowbをレンダリングする方法(英語)

リモートでホストされているマークダウンファイルをダウンロードしてレンダリングしたい場合は、以下の方法があります。

public class RemoteMarkdownActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MarkdownView markdownView = new MarkdownView(this);
        setContentView(markdownView);
        markdownView.loadMarkdownFile("https://raw.github.com/falnatsheh/MarkdownView/master/README.md");
    }
}

この例にアクセスするここ

デモ

デモをご紹介します。

リファレンス

完全なリファレンスはこちらをご覧ください。

(c). mukeshsolanki/MarkdownView-Android

MarkdownViewは、Android上でMarkdown形式のテキストやファイルを、Githubのようにhtmlページとして表示するためのシンプルなライブラリです。

Step 1: インストール

ルートレベルの build.gradle ファイルに jitpack を追加します。

maven { url "https://jitpack.io" }

次に、ライブラリをインストールします。

implementation 'com.github.mukeshsolanki:MarkdownView-Android:1.1.1'

ステップ 2: レイアウトの追加

次に、MarkdowView をレイアウトに追加します。

<com.mukesh.MarkdownView
    android:id="@+id/markdown_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>

ステップ3:コード

次に、javaまたはkotlinのコードを書きます。

MarkdownViewを参照します。

MarkdownView markdownView = (MarkdownView) findViewById(R.id.markdown_view);

Markdowbを文字列から設定する方法を紹介します。

markdownView.setMarkDownText("# Hello World\nThis is a simple markdown"); //Displays markdown text
...

Assets`からMarkdownをロードする方法を説明します。

markdownView.loadMarkdownFromAssets("README.md"); //Loads the markdown file from the assets folder
...

また、ファイルシステムやパスからマークダウンを読み込む方法は以下の通りです。

File markdownFile=new File("filePath");
markdownView.loadMarkdownFromFile(markdownFile); //Loads the markdown file.

以下に完全な例を示します。

MainActivity.java

package com.mukesh.markdownview.example;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.mukesh.MarkdownView;

public class MainActivity extends AppCompatActivity {

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MarkdownView markdownView = (MarkdownView) findViewById(R.id.markdown_view);
    markdownView.setMarkDownText("# Hello World\nThis is a simple markdown\n"
        + "https://github.com/mukeshsolanki/MarkdownView-Android/");
    //markdownView.loadMarkdownFromAssets("README.md");
    markdownView.setOpenUrlInBrowser(true); // default false

  }
}

ソースコードはこちらをご覧ください。

参考文献

完全なリファレンスはこちら(mukeshsolanki/MarkdownView-Android)です。