背景がセレクターであるレイアウトにTextViewがあります。また、TextViewのテキストはHTMLからスパンに設定されます。次に、LinkMovementMethodを使用してTextViewを設定します。
TextViewをタップしたときに、セレクターをトリガーするためにクリックイベントが親レイアウトに送信されなくなりました。
これはどのように解決する必要がありますか?
イベントを適切なコンポーネントに送信する前にインターセプトできるようにするには、これらのメソッドのいずれかを使用する必要があると思います。
Activity.dispatchTouchEvent(MotionEvent)
-これにより、アクティビティはすべてのタッチイベントをウィンドウにディスパッチする前にインターセプトできます。
ViewGroup.onInterceptTouchEvent(MotionEvent)
-これにより、ViewGroupはイベントが子ビューにディスパッチされるときにイベントを監視できます。
ViewParent.requestDisallowInterceptTouchEvent(boolean)
-これを親ビューで呼び出して、onInterceptTouchEvent(MotionEvent)でタッチイベントをインターセプトしないことを示します。
詳細情報 こちら 。
お役に立てば幸いです。
Android:clickable="false"
とAndroid:focusable="false"
またはv.setClickable(false)
とv.setFocusable(false)
を使用して、TextView
クリック不可/フォーカス不可を宣言します。クリックイベントは、TextView
の親にディスパッチされるはずです。
注:
これを実現するために、直接parent
にクリックを追加する必要があります。または、Android:clickable="false"
およびAndroid:focusable="false"
を直接の親に設定しますリスナーをさらに親に渡すため。
いつかこれだけが役立ちます:
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);
プット
Android:duplicateParentState="true"
子の場合、ビューは描画可能な状態(フォーカスされている、押されているなど)を、それ自体からではなく、直接の親から取得します。親にonclickを設定し、クリックされた子を呼び出すことができます
TextView
createクリックの問題がある場合は、xmlファイルからAndroid:inputType=""
を削除してください。
この回答は Alexander Ukhovの回答 に似ていますが、クリックイベントではなくタッチイベントを使用する点が異なります。これらのイベントにより、親は適切な押された状態(リップル効果など)を表示できます。この答えは、Javaの代わりにKotlinにもあります。
view.setOnTouchListener { view, motionEvent ->
(view.parent as View).onTouchEvent(motionEvent)
}
OnTouch
リスナーとOnClick
リスナーの両方を親と子の両方に表示するには、以下のトリックを使用してください。
親ScrollViewとしてのユーザーScrollViewおよびその子ビューをRelative/LinearLayout内に配置します。
ビューをスクロールしないように、親ScrollView Android:fillViewport="true"
を作成します。
次に、OnTouch
リスナーを親に、OnClick
リスナーを子ビューに設定します。そして、両方のリスナーコールバックをお楽しみください。