web-dev-qa-db-ja.com

ビューのonClickイベントをAndroidの親に渡す方法は?

背景がセレクターであるレイアウトにTextViewがあります。また、TextViewのテキストはHTMLからスパンに設定されます。次に、LinkMovementMethodを使用してTextViewを設定します。

TextViewをタップしたときに、セレクターをトリガーするためにクリックイベントが親レイアウトに送信されなくなりました。

これはどのように解決する必要がありますか?

92
shiami

イベントを適切なコンポーネントに送信する前にインターセプトできるようにするには、これらのメソッドのいずれかを使用する必要があると思います。

Activity.dispatchTouchEvent(MotionEvent)-これにより、アクティビティはすべてのタッチイベントをウィンドウにディスパッチする前にインターセプトできます。

ViewGroup.onInterceptTouchEvent(MotionEvent)-これにより、ViewGroupはイベントが子ビューにディスパッチされるときにイベントを監視できます。

ViewParent.requestDisallowInterceptTouchEvent(boolean)-これを親ビューで呼び出して、onInterceptTouchEvent(MotionEvent)でタッチイベントをインターセプトしないことを示します。

詳細情報 こちら

お役に立てば幸いです。

44

Android:clickable="false"Android:focusable="false"またはv.setClickable(false)v.setFocusable(false)を使用して、TextViewクリック不可/フォーカス不可を宣言します。クリックイベントは、TextViewの親にディスパッチされるはずです。

注:

これを実現するために、直接parentにクリックを追加する必要があります。または、Android:clickable="false"およびAndroid:focusable="false"を直接の親に設定しますリスナーをさらに親に渡すため

198
siyb

いつかこれだけが役立ちます:

View child = parent.findViewById(R.id.btnMoreText);
    child.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            View parent = (View) v.getParent();
            parent.performClick();
        }
    });

別のバリアントは、常に機能するとは限りません。

child.setOnClickListener(null);
15
Alexander Ukhov

プット

Android:duplicateParentState="true"

子の場合、ビューは描画可能な状態(フォーカスされている、押されているなど)を、それ自体からではなく、直接の親から取得します。親にonclickを設定し、クリックされた子を呼び出すことができます

9
Ahmad Ronagh

TextView createクリックの問題がある場合は、xmlファイルからAndroid:inputType=""を削除してください。

3

この回答は Alexander Ukhovの回答 に似ていますが、クリックイベントではなくタッチイベントを使用する点が異なります。これらのイベントにより、親は適切な押された状態(リップル効果など)を表示できます。この答えは、Javaの代わりにKotlinにもあります。

view.setOnTouchListener { view, motionEvent ->
    (view.parent as View).onTouchEvent(motionEvent)
}
1
methodsignature

OnTouchリスナーとOnClickリスナーの両方を親と子の両方に表示するには、以下のトリックを使用してください。

  1. 親ScrollViewとしてのユーザーScrollViewおよびその子ビューをRelative/LinearLayout内に配置します。

  2. ビューをスクロールしないように、親ScrollView Android:fillViewport="true"を作成します。

  3. 次に、OnTouchリスナーを親に、OnClickリスナーを子ビューに設定します。そして、両方のリスナーコールバックをお楽しみください。

0
Kishor Patil