自作アプリに検索機能を実装する
自作のアプリに検索機能を実装する
私は現在、英熟語や英単語のアプリを配信しています。これらのアプリはスマホを単語帳のように使用できるアプリです。
単語を調べるには、一枚ずつページをめくるか、ジャンプ機能を使うしかありません。しかしジャンプ機能はその単語が何番目にあるかを知らないといけないので使い勝手は良くないですね。
そこで今回は検索機能を実装し、意味やアルファベットから調べる機能をつけることで単語帳として使いやすくしていきたいと思います。
正規表現
検索機能に必要となるのが正規表現です。検索機能の仕組みとしては入力された文字列を正規表現で条件分岐させるという方法を使います。
まずは「英単語を検索」するのか、「意味から検索」するのかを分けたいと思います。
- 英語検索
- 日本語検索
英語検索では入力されたアルファベットの順番通りに検索します。アルファベットの順番が異なれば検索で引っかからないようにします。
よって、入力された文字列を先頭から比較するため、文字列の先頭に「^」を追加します。
日本語検索では入力された文字列は部分一致で検索します。そのため入力された文字列が意味のどこかしらにあれば検索に引っかかるようにします。
よって、入力された文字列には手を加えません。
string searchText = EntryForm.Text;
if ( searchText != null && searchText != "" )
{
if (Regex.IsMatch(searchText, "[a-zA-Z]+")) // 英語検索
{
MakeList(0, searchText);
}
else//日本語検索
{
MakeList(1, searchText);
}
}
EntryFormは入力フォームで、文字列を取得することができれば、日本語か英語かの判断を行います。英語であるかの判断は、取得された文字列に小文字と大文字のアルファベットが1文字以上あるかで判断しています。もし小文字大文字のアルファベットがないのであれば日本語であると判断します。
ただ、この処理だと英語と日本語を合わせてに入力すると英語として処理されてしまうので、今後手を加えていきたいと思っています。
MakeListは検索にひっかかったものをStackLayoutに使いしていくメソッドです。
private void MakeList( int n, string x )
{
for(int i=1;i<=9;i++)
{
wordData = new WordData(i);
int counter = wordData.WordCounter();
for(int w=0;w<counter;w++)
{
bool regex = false;
string str;
if (n == 0)
{
str = wordData.ReturnEnglishWord(w);
regex = Regex.IsMatch(str, "^" + x);
}
else
{
str = wordData.ReturnJapaneseWord(w);
regex = Regex.IsMatch(str, x);
}
if (regex)
{
// マッチしたときの処理 StackLayoutに追加
}
}
}
}
検索から単語帳ページへ
上記のプログラムを実装したアプリの画面がこちらです。
これには、プログラム側からLabelを実装し、前回紹介したTapGestureRecognizerを追加しています。
コードは以下のようになっています。
Frame label = new Frame
{
// Fontなどの情報記述
};
var tgr = new TapGestureRecognizer();
int makePage = i;
int makeCount = w;
tgr.Tapped += (s, e) => { MakeButtonFunction( makePage, makeCount ); };
label.GestureRecognizers.Add(tgr);
stack.Children.Add(label);
これにより、検索結果からすぐにお目当ての単語に飛べます。
まとめ
今回は自分のアプリに検索機能を追加しました。
この機能を追加したことでwebや辞書などで調べなくても、このアプリで完結することができます。もちろん登録されている単語しか対応していないので何でも検索できるわけではありませんが、、
Xamarin.Formsにするとこのあたりの画面作成が以前のxmlより楽に感じました。
これからも自分のアプリに追加した機能の紹介とプログラムなどを公開していきます。またこの検索機能もよりよくできるところがあれば改善していきたいと思います。
今回はこの辺で、ではまた!
