![Creative The name of the picture]()
How to pass a view's onClick event to its parent on Android?
I have a TextView in a layout whos background is a Selector. And the TextView's text is set to Spanned from HTML.
Then I set the TextView with the LinkMovementMethod.
Now when I tap on the TextView, the click event is not sent to its parent layout to trigger the selector.
How should this be solved?
6 Answers
6
I think you need to use one of those methods in order to be able to intercept the event before it gets sent to the appropriate components:
Activity.dispatchTouchEvent(MotionEvent) - This allows your Activity to intercept all touch events before they are dispatched to the window.
Activity.dispatchTouchEvent(MotionEvent)
ViewGroup.onInterceptTouchEvent(MotionEvent) - This allows a ViewGroup to watch events as they are dispatched to child Views.
ViewGroup.onInterceptTouchEvent(MotionEvent)
ViewParent.requestDisallowInterceptTouchEvent(boolean) - Call this upon a parent View to indicate that it should not intercept touch events with onInterceptTouchEvent(MotionEvent).
ViewParent.requestDisallowInterceptTouchEvent(boolean)
More information here.
Hope that helps.
Declare your TextView not clickable / focusable by using android:clickable="false" and android:focusable="false" or v.setClickable(false) and v.setFocusable(false). The click events should be dispatched to the TextView's parent now.
TextView
android:clickable="false"
android:focusable="false"
v.setClickable(false)
v.setFocusable(false)
TextView
Note:
In order to achieve this, you have to add click to its direct parent. or set
android:clickable="false" and android:focusable="false" to its direct parent to pass listener to further parent.
parent
android:clickable="false"
android:focusable="false"
TextView#setOnClickListener()
TextView
android:clickable="false"
ClickListener
null
setOnclickListener(null)
Sometime only this helps:
View child = parent.findViewById(R.id.btnMoreText);
child.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
View parent = (View) v.getParent();
parent.performClick();
}
});
Another variant, works not always:
child.setOnClickListener(null);
Put
android:duplicateParentState="true"
in child then the views get its drawable state (focused, pressed, etc.) from its direct parent rather than from itself.
you can set onclick for parent and it call on child clicked
If your TextView create click issues, than remove android:inputType="" from your xml file.
TextView
android:inputType=""
If you want to both OnTouch and OnClick listener to parent and child view both, please use below trick:
OnTouch
OnClick
User ScrollView as a Parent view and inside that placed your child view inside Relative/LinearLayout.
Make Parent ScrollView android:fillViewport="true" so View not be scrolled.
android:fillViewport="true"
Then set OnTouch listener to parent and OnClick listener to Child views.
And enjoy both listener callbacks.
OnTouch
OnClick
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Is there an easier way to pass the events to trigger the onClick and onLongClick in parent view, or I have to implement them myself?
– shiami
Dec 12 '10 at 13:59