2011年02月24日

EditText/TextViewで文末まで自動スクロールしたい

続きでその2です。

スクロール速度が実用的な速度になったからには(?)、読み込んだ文章の末尾にも飛べるようにしたいという願望が再度芽生えてきました。
まあ、これも何度か失敗しているのですが、文の行数を数えてその最後にスクロールすればできるはず!
と、ここで素人のアサカサハ、じゃなかった浅ハカサ。最初の誤解があったのですが、賢明な皆様はすぐに気づいているはずですね。(笑)

文の行数を数えるといっても、どうしようか最初悩みました。
SQLから取り出したメモの本文は、ファイルではなく変数に格納されています。
かなり巨大な文章をも格納されることも考えられるのですが、そもそもSQLの一カラムとして登録して良いのかどうかは置いておいて、文章はファイルではなく変数に格納されることになります。
ファイルならリード時ループで回す時にカウントしていけば良い訳ですが、1変数に入っている状態のものはどうしよう?という疑問でした。
ここもindexOf()を使うとか、配列に入れて配列長で調べるとかいう方法が考えられるようでしたが、もっと簡単かつ簡潔にできるのではないかと。
調べていたら、アットマーク・アイティの記事に素晴らしい方法が見つかりました。

http://www.atmarkit.co.jp/fdotnet/dotnettips/911countchar/countchar.html

これは文字列内に含まれる特定文字のカウント方法ということで、元の文字列の長さからreplaceAll()で特定文字を""に置き換えた結果の長さを引くと、置き換えた回数が分かるというものです。
素晴らしく簡単簡潔!
これなら僕にも理解できます。(笑)

さて、ではあとは行数を設定してスクロールだっ!
と思ったら、ScrollViewのscrollTo(int x,int y)は別に行を指定してスクロールする訳ではなかったのでした。(苦笑)

ああ、じゃあやっぱり僕には無理かぁ、と断念しかけたのですが、ふとEditTextの方でなんとかならないのかな?と思ってちょっと調べてみました。
そして、JavaDriveにてsetSelection(int index)の説明を見つけました。
しかし、これは(画面キャプチャーが一行テキストのものなので)複数行のEditTextには適用されないよな、などと思いながら試しに

editText.requestFocus(); // 最初は別のEditTextにフォーカスがあるため目的のEditTextに移動
editText.setSelection(editText.getText().length())

としてみたところ、見事に文末へ!
これは素晴らしい!

よーし!じゃあ、今度はTextViewだっ!と勢いに乗ってやろうとしたところ、TextViewは基本的にSelectionするものではない!
なので、setSelectionは存在しないのでした。(笑)

やっぱりTextViewは諦めだな、とまたまた落ち込んでから、eclipseの補完機能で今度もScrollViewではなく、TextViewのメソッドを見ていたところ、getBottom()というメソッドがありました。説明には「The bottom of this view, in pixels. 」を返すとあります。
ん?英語の意味は不確かだけれど、これはイケそう!と思って、

scrollView.scrollTo(0, textView.getBottom());

とやってみたところ、これまた見事に文末へジャンプ!

う、嬉しいっ!
久々にうまくいった感じ!
実際はすぐにうまくいったのではなく、かなり時間はかかっていますが、一日で2項目も進展があると(ホントはもう公開前に機能追加や改善はしない予定だったのですが)、なんだかスキッとしますね。

また公開日は遠ざかった感じだけど、懸案事項が解決するのは良いことです。

追記:
(ところで、ここで告白するともうひとつ大きな懸案事項として残っているのが、データベースの問題。実は9つほどのカラムを持つDBなのですが、テーブルを分けていないのでした。本来はテーブルは分けるべきなのでしょうけど、SQL素人でもあり、どうせSDカードにDBを置けないのだから、とりあえずだ!と思っていたために安易な一枚テーブルで作成してしまったのでした。DBの肥大化にも繋がり、正しくないことは分かっていなくはなかったのですけどね。でも、ここでまたデータ構造が変わるのは辛いので、どーせ「想い出作り」で終わる可能性大なので、このまま突き進む予定です。)
posted by 白虹 at 23:55| Comment(2) | TrackBack(0) | Android開発
この記事へのコメント
いつも楽しく?見させてもらっています。
androidは日本語資料少なくて大変ですよね。
ところでScrollViewの先頭・末尾へジャンプはfullScrollがありますが試しましたでしょうか?
http://developer.android.com/reference/android/widget/ScrollView.html#fullScroll%28int%29
Posted by すぴ at 2011年02月25日 06:53
すぴさん、初めまして。
また、コメントありがとうございました。
(コメント通知メールがGmailで何故か迷惑メールに振り分けられてしまっていて、返信が遅れて申し訳ありませんでした)
愚痴を書くためのこのブログに、よもやコメントがつくことがあるとは思いもよりませんでした。(笑)

fullScroll、ハードキーがある機種専用のメソッドなのかと思い込み、試していませんでした。ご教示いただいた通り、確かにfullScrollでジャンプできますね。
勉強になりました。

どーしようもないこのブログと作者ですが、今後ともよろしくお願いします。
Posted by 白虹 at 2011年02月27日 22:32
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/43573373

この記事へのトラックバック