2005 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
2014 1 2 3 4 5 6 7 8 9 10 11 12
2015 1 2 3 4 5 6 7 8 9 10 11 12
2016 1 2 3 4 5 6 7 8 9 10 11 12
2017 1 2 3 4 5 6 7 8 9 10 11 12

ホーム

2013年06月06日

テキストエディタでは、逆方向の検索ができると便利
です。大文字小文字を考えなければString#lastIndexOf
を使えば簡単に実現できます。

private boolean findUp(EditText edit, String needle) {
    if (needle.isEmpty()) {
        return false;
    }
    int index = edit.getSelectionStart() - 1;
    if (index < 0) {
        return false;
    }
    String haystack = edit.getText().toString();
    int ret = haystack.lastIndexOf(needle, index);
    if (ret < 0) {
        return false;
    }
    edit.setSelection(ret, ret + needle.length());
    return true;
}

では、大文字小文字を無視して、なおかつ逆方向に
検索するにはどうすればいいでしょうか。残念ながら、
正規表現のメソッドには逆方向の検索がありません。

これはどうしようもないのでテキストの先頭から順方向
で探すしかありません。

private boolean findUpIgnoreCase(EditText edit, String needle) {
    if (needle.isEmpty()) {
        return false;
    }
    int start = edit.getSelectionStart();
    String haystack = edit.getText().toString();
    Pattern pat = Pattern.compile(Pattern.quote(needle), Pattern.CASE_INSENSITIVE);
    Matcher mat = pat.matcher(haystack);
    int st = -1;
    int ed = 0;
    while (true) {
        if (!mat.find(ed)) {
            break;
        }
        if (mat.start() >= start) {
            break;
        }
        st = mat.start();
        ed = mat.end();
    }
    if (st < 0) {
        return false;
    }
    edit.setSelection(st, ed);
    return true;
}

https://github.com/tkojitu/WagtailET/blob/master/src/org/jitu/wagtail/et/EditControl.java

本家Permlink


2013年06月04日

「Javaに正規表現なんてあったのか!?」という声が
ありますね。Java SEに正規表現が取り込まれたのは
Java 1.4ですから、かなり前の話です。

さて、文字列を検索するときに大文字小文字を無視
したいということがあります。Stringには
compareToIgnoreCaseという比較メソッドはありますが、
肝心の検索にはindexOfしかありません。ではどう
するか。

正規表現を使います。

private boolean findDownIgnoreCase(EditText edit, String needle) {
    if (needle.isEmpty()) {
        return false;
    }
    int index = edit.getSelectionEnd();
    String haystack = edit.getText().toString();
    Pattern pat = Pattern.compile(Pattern.quote(needle), Pattern.CASE_INSENSITIVE);
    Matcher mat = pat.matcher(haystack);
    if (!mat.find(index)) {
        return false;
    }
    int st = mat.start();
    int ed = mat.end();
    edit.setSelection(st, ed);
    return true;
}

https://github.com/tkojitu/WagtailET/blob/master/src/org/jitu/wagtail/et/EditControl.java

正規表現をコンパイルするときにCASE_INSENSITIVEを
渡すことで、大文字小文字を無視することができます。

本家Permlink


2013年06月02日

Android APIには、FileChooserのようなファイルを選択
するためのダイアログがありません。

自分でファイルダイアログを作るというのも1つの
やり方です。

https://github.com/tkojitu/WagtailED

それよりも、Intentを使って外部のファイルマネージャ
を使うほうがいいでしょう。

アプリからのIntentに反応してくれるファイルマネージャ
の1つにOI File Managerがあります。

http://www.openintents.org/en/node/159

このファイルマネージャは、OpenIntentsという活動の
中のアプリの1つです。OpenIntentsを簡単に説明すると、
Android非標準だけど便利なIntentsは公開してみんなで
共用しようという活動です。

OI File Managerを呼び出すには、前回同様Intentを
使います。Intentに収める情報は:

* アクション名("org.openintents.action.PICK_FILE")
* ファイルマネージャを開く場所

などです。

前回はIntentで呼び出した結果は捨てましたが、今回は
選択結果を受け取るためにリザルトコードをつけます:

    private void onOpen() {
        String home = FileControl.getHomePath();
        Intent intent = new Intent(OI_ACTION_PICK_FILE);
        intent.setData(Uri.parse("file://" + home));
        intent.putExtra(OI_EXTRA_TITLE, getString(R.string.oi_open_title));
        intent.putExtra(OI_EXTRA_BUTTON_TEXT, getString(R.string.oi_open_button));
        try {
            startActivityForResult(intent, REQUEST_OI_ACTION_PICK_FILE);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(this, R.string.oi_no_filemanager_installed, Toast.LENGTH_SHORT).show();
        }
    }

ファイルマネージャで選択されたファイルは
onActivityResultで受け取ります。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK || data == null) {
            return;
        }
        switch (requestCode) {
        case REQUEST_OI_ACTION_PICK_FILE:
            onOiActionPickFile(data);
            break;
        case REQUEST_OI_ACTION_PICK_DIRECTORY:
            onOiActionPickDirectory(data);
            break;
        }
    }

このonActivityResultの引数のIntentにファイル
マネージャで選ばれたファイルのパスが入っています。

では、ファイルを保存するときはどうするかというと、
同じように外部ファイルマネージャを使うとすると、
ディレクトリを指定してもらうくらいしかアイデアは
浮かびませんでした。

https://github.com/tkojitu/WagtailET/blob/master/src/org/jitu/wagtail/et/WagtailET.java

本家Permlink


Copyright © 1905 tko at jitu.org

バカが征く on Rails