読者です 読者をやめる 読者になる 読者になる

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin.Forms で SearchBar を使うには (バグありの可能性)

こんにちは。エクセルソフトの田淵です。

Xamarin.Forms で、ListView を絞り込み表示とかしたい場合は SearchBar が便利です。

今回も Adam さんの Xamarin.Forms SearchBar Recipe を活用させていただきました。

2015/7/31 時点の最新版 Xamarin.Forms 1.4.4.6392 での情報です。

動作イメージ

f:id:ytabuchi:20150731154049g:plain:w300

サンプル

GitHub

使い方

例えば ListView で使用する場合は、カスタムの ListView に検索用のメソッドを用意し、SearchBar の TextChangedSearchButtonPressed で検索メソッドを呼び出します。

ContentPage はこんな感じで、

public class SearchBarPageCS : ContentPage
{
    MyListView mylist;
    SearchBar searchbar;
    public SearchBarPageCS()
    {
        mylist = new MyListView();
        searchbar = new SearchBar
        {
            Placeholder = "Search",
        };
        searchbar.TextChanged += (sender, e) => mylist.SearchFilter(e.NewTextValue);
        searchbar.SearchButtonPressed += (sender, e) => mylist.SearchFilter(searchbar.Text);

        Content = new StackLayout
        {
            Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0),
            Children = {
                searchbar,
                mylist,
            }
        };
    }

}

ListView はこんな感じです。日本語のひらがなカタカナを無視するには Caltureなんちゃらを使用してゴニョゴニョするんでしょうか?半角英数字/全角英数字 にも対応したいですね!

public class MyListView : ListView
{
    List<string> listData;
    public MyListView()
    {
        string[] str = { "test1", "TEST2", "abc", "XYZ", "abc", "xyz", "あいうえお", "カキクケコ", "表示性能" };
        listData = new List<string>(str);

        this.ItemsSource = listData;
    }

    /// <summary>
    /// MyListView を引数でフィルターするメソッドです。
    /// </summary>
    /// <param name="filter">string</param>
    public void SearchFilter(string filter)
    {
        this.BeginRefresh();

        if (string.IsNullOrWhiteSpace(filter))
        {
            this.ItemsSource = listData;
        }
        else
        {
            // 英語の大文字小文字対策のみですが、日本語の全角半角対策も入れるべきだと思います。
            // 良いメソッドをご存知の方はご紹介ください><
            this.ItemsSource = listData
                .Where(x => x.ToLower().Contains(filter.ToLower()));
        }

        this.EndRefresh();
    }
}

Android が動きません…

f:id:ytabuchi:20150731155900g:plain:w300

日本語の入力が出来ないので Xamarin に確認したところ、プロジェクトのプロパティで CJK を設定すれば大丈夫だよ!と回答を得ました。が、解決していません。

DebugLog に W/IInputConnectionWrapper( 3587): endBatchEdit on inactive InputConnection と入力のコネクションが非アクティブになりましてん。と出ているのも気になるところです。こちらは引き続き調査します。

Xamarin 気になった方は

いかがでしょうか。Android はともかく、こんな簡単なコードでモバイルアプリが作れちゃう Xamarin.Forms お勧めです♪

是非 ダウンロード(直接) / ダウンロード(弊社経由) して触ってみてください。 学習用リソースJXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。

以上です。