DialogFragmentで作るライセンス情報


やりたいこと

いいかげんそろそろ、初心者補正効かないしきちんとアプリに使ったライブラリのライセンス情報書きたい。
んで、Google謹製アプリみたいな、ある程度きちんとしたライセンス情報表示をめざして、htmlファイルをプロジェクトのassetsフォルダに打ち込んで、それをDialogFragment内のWebViewでロードして表示、っていうののメモ。

ローカルファイルへのアクセスがうまくいかなくて、やんなった。

完成イメージ

htmlでライセンス情報を書きこんだファイルの作成

これ見てコピペ
apatch2.0へのリンクを飛べるようにしてあげると、よりいいのかも。
Hrefタグでリンクです。

で、assetsフォルダ作成

AndroidStudioだと、左のフォルダ表示してるところから、いつもActivityとか作るときみたいに、

New → Folder → Assets Folder

すると、 app/src/main 配下にassetsってフォルダができる。
そこに先ほど作成したhtmlファイルを打ち込む。

build.gradleの編集

ここが、僕みたいな初心者に厳しいところ
ビルドとか、よくわかんないし
で、結論としては、appフォルダの中にある方のbuild.gradleの、android{}
の中に、

build.gradle(app)
android {

        //〜〜 省略 〜〜

    sourceSets{
        main{
            assets.srcDirs=["src/main/assets"]
        }
    }
        //〜〜 省略 〜〜
}

ってのを追加します。
自分でいじってなければ、buildTypesとdependenciesの間ね。
gradle関連のファイルいじるとでてくる上のSnackBarにみたいなやつのSync Nowってのをクリックすると、gradleがうまいことやってくれる。

assetsのパスはここだよって教えてあげてるらしいです。
僕みたいな初心者は、プロジェクト直下のbuild.gradleとappフォルダの中のbuild.gradleを間違えないでね。

これで、gradleが、assetsフォルダの場所を認識してくれたので、あとはWebViewでパスを指定してあげるだけです。

DialogFragmentとWebView

DialogFragmentを継承したクラスのonCreateDialogの中で、WebViewをfindViewして,
loadUrl("file:///android_asset/license.html")
してあげるだけでオッケー。
androidの前にスラッシュが三つあるのはミスじゃないです。
あと、プロジェクト内のフォルダ名はassetsなのに、assetってなってるのもミスじゃないです。
license.htmlは自分でさっき作ったファイル名ね。
ちなみに、グローバル変数でDialogを保持してonDestroyでnullってるのは、画面回転で落ちさせないためです。
たぶんこれで大丈夫。

MainActivity.class
    public static class LicenseDialogFragment extends DialogFragment {

        private Dialog licenseDialog;

        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            if (licenseDialog != null) {
                return licenseDialog;
            }
            View root = View.inflate(getActivity(), R.layout.dialog_licence, null);

            WebView webView = (WebView) root.findViewById(R.id.web);
            // assets配下のlicense.htmlを指定
            String htmlPath = "file:///android_asset/license.html"
            webView.loadUrl(htmlPath);

            return licenseDialog = new AlertDialog.Builder(getActivity())
                    // Titleは適当にOpen Source Licenseとかで
                    .setTitle(getString(R.string.license))
                    .setView(root)
                    .create();
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            licenseDialog = null;
        }
    }

で、いまつくったこれを、適当なところのonClickとかで、DialogFragmentをshowする。
たぶんActionBarのメニューが妥当。

MainActivity.class
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.action_license) {
            LicenseDialogFragment licenceFragment = new LicenseDialogFragment();
            licenceFragment.show(getSupportFragmentManager()
                    , LicenseDialogFragment.class.getSimpleName());
            return true;
        }
        return super.onOptionsItemSelected(item);
        }
    }

てなわけで、できました。
gradleは勉強しなきゃっすね。
Appatchライセンスは、GooglePlayストアの紹介文にも載せてあげるといいそうですよ。