2011年01月08日

TextViewにダブルタップイベントを!

やれやれ、プチはまりが連続的に発生していたので、しばらくブログを書く余裕もなく、Webをだらだら見ていました。(笑)
長期間ひとつの内容ではまっていれば愚痴を書きたくなるところ、連続的に発生すると意外と書けないのでした。
そんなわけでそろそろAndroidタブレットが欲しい今日この頃。
というか、作っているアプリともタブレットは多少関係する気がしないでもないので。

ともあれ、順不同で最新の愚痴をちょっと書き込もうかな、と。
これは一応表面上解決したのですが、正しいのか間違っているのかまったく判断できません。
というのも、どうも既存のクラスでreturn trueとかfalseとか、果てはreturn super.onXXXX()とか、どうしてそうなるのか理解できていないからです。

今回は画面ダブルタップでイベントを発生させたかったのですが、ダブルタップはonClickのように単純には使えないようなので、またまたGoogle先生方にお尋ねして、GestureDetectorを利用するということは分かりました。

今回お世話になった先生方
hoge256 先生
http://www.hoge256.net/2009/09/462.html

名無しの備忘録 先生
http://nanashimemorandum.blog14.fc2.com/blog-entry-33.html


しかし、分からなかったのは2点

1.GestureDetectorをimplementsして実装する必要のあるメソッドでonDoubleTapまたはonDoubleTapEventに処理を記述しても動作しない
2.GestureDetectorをonCreateなどでインスタンスを作ってもダブルタップが有効になるのはActivityであって、TextViewなどの上ではイベントが起こらない(Viewの乗っていない箇所のみ有効と思われた)

1については最終的にonDoubleTap()に処理を記述するだけでなく、onTouchEvent()に以下のような記述を入れないとうまく動かないようでした。つまりonTouchEventで処理を振り分けてonDoubleTapなどを呼び出すということなんですかね。
しかし、super.onTouchEvent(event)って何?どこに返してるの?という部分が理解できていません。
それにgestureDetector.onTouchEvent(event)を記述する必要が何故あるのかも分からない。
これでいいのか?と思いつつ、とりあえずonDoubleTapに処理を渡せたので、これからの長い道のりのため、後で考えることとしました。

    @Override
    public boolean onTouchEvent(MotionEvent event) {
   gestureDetector.onTouchEvent(event);
   return super.onTouchEvent(event);
    }

2については割と情報も少なく解決は絶望的かと思われましたが、「名無しの備忘録」先生のところで、MapViewを使うためにsetOnTouchListenerを組み込んでいる方法を参考とさせていただくことができました。
さっそくTextViewに組み込んで動かしてLogCatを見たところ、抽象メソッドにイベントは来ているのですが、何故かonLogPress()は反応するのですが、onTouchEvent()は反応しません。TextViewの乗っていないところでダブルタップするとonTouchEvent()は反応するのに……
ここでも抽象メソッドのreturn文で悩まされるはめとなり、returnを全部Trueにしてみたり、色々やってみたのですが、すべてNG。
仕方がないので、理解できていないまま、リスナーの方でreturn falseとなっていたところを以下のようにreturn trueにしてみたところ突如としてonDoubleTap()までイベントが通り、思った通りの動作となりました。
でも、これでいいのか?(その2)、他で問題起こらないのか?とは思うのですが、どーも良く分からないし、先を急ぐので不問に付すこととしました。

textView.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View view, MotionEvent event) {
gestureDetector.onTouchEvent(event);
return true;
}
});


てな訳で、ダブルタップによりTextViewの表示領域を操作するという(あとから必要だと思いついた)結構重要なインターフェースの改善ができて嬉しい自分ですが、相変わらず仕組みを理解できないまま進んでいく我が姿を顧みて思いついた自身の呼び名

「プラグラマー」

「プラモデル」と「プログラマー」を合成した言葉です。
出来合いの部品を組み合わせてアプリを作っていくイメージを自虐的に評しています。
本当にこれでいいのか?著作権に引っかからないのか?理解できないならApp Inventorでも使っていろ!などの問題はありますが、とりあえず開発(壊滅)は続きます。

posted by 白虹 at 14:10| Comment(1) | TrackBack(0) | Android開発