人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Androidアプリ開発初心者です。
色々なサイトを参考にさせて頂き、センサの値を表示するアプリを作ってみたのですが、
画面をスクロールさせるためScrollViewを追加したところ、タッチイベントが一回目しか取得できなくなってしまいました。
他のセンサは値が更新されるのに、タッチイベントだけは何度触っても一回目の値から更新されないのです。ScrollViewを外すと元に戻ります。
バージョンは2.1です。
原因が分からず困っています。
原因・解決策など分かりましたら、回答願います。
また、ソースを見て直した方がよい箇所などの指摘があればご教授願います。
宜しくお願いします。

ソースコードが載せられなかったので、下記のURLに記載しておきます。
[http://d.hatena.ne.jp/Ji-hoo/20110219]

●質問者: Ji-hoo
●カテゴリ:コンピュータ
✍キーワード:Android URL アプリ イベント サイト
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● i_kumagoro
●60ポイント

onTouchEventのドキュメントに書かれていますが、

Called when a touch screen event was not handled by any of the views under it.

との事なので、ScrollViewでイベントが処理されるとActivityのonTouchEventメソッドは呼ばれません。

多分onInterceptTouchEventメソッドをoverrideしたScrollViewのサブクラスを作る必要があると思います。

例えば、

class localScrollView extends android.widget.ScrollView {
public localScrollView(Context context) {
super(context);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
((Activity)(this.getContext())).onTouchEvent(ev);
return super.onInterceptTouchEvent(ev);
}
}

のようにしたScrollViewのサブクラスを、

Activityから以下のように使用すればいけそうな気がします。

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

ViewGroup scv = new localScrollView(this);
android.view.LayoutInflater li = (android.view.LayoutInflater)
getSystemService(LAYOUT_INFLATER_SERVICE);
setContentView(li.inflate(R.layout.main, scv, true));
}

ただし、これだとActivityの onTouchEventメソッドにある

return super.onTouchEvent(event);

が本来なら実行されないときにも実行されてしまうので、正しくは、Activityに情報を更新するメソッドを用意して、ActivityのonTouchEventメソッドとlocalScrollViewクラスのonInterceptTouchEventメソッドはそれを呼ぶようにするべきですが。

◎質問者からの返答

回答ありがとうございます。

私の知識不足もあると思うのですが、サブクラスを作ってみても変わりませんでした。

ただ、ドキュメントに記載されているという事は初めて知りました。

それだけでも大きな前進です。

たぶん、ScrollViewを使うような所でonTouchEventを取得しようという考え方自体が非推奨なのかな。

また、何かありましたら宜しくお願いします。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ