Reputation: 53
I am using TabView
and in it, I am using Fragment
to load each tab. I want to get the Touch
event when the user touches any of the fragments.
Fragment Code
public MobileBankingFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
context = (FragmentActivity) super.getActivity();
view = inflater.inflate(R.layout.fragment_mobile_banking, container, false);
alarm = new TimerReceiver();
init(view);
touchListener(view);
return view;
}
private void touchListener(View view) {
layout= (FrameLayout) view.findViewById(R.id.fragmentMobileBanking);
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Toast.makeText(context, "you just touch the screen :-)", Toast.LENGTH_SHORT).show();
return true;
}
});
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Toast.makeText(context, "you just touch the screen :-)", Toast.LENGTH_SHORT).show();
startTheTimerForTenSecond();
return true;
}
});
}
Here I try to get the touch event in two ways, one by event, another by the id of the layout, but I have had no luck. This code gives no errors, but no output either.
Upvotes: 5
Views: 16771
Reputation: 445
Similar answer to what @sockeqwe gave, but with more details. You probably add you Fragment into some fragment container in your Application class. Say you use FrameLayout (which is derived from ViewGroup) for this purpose. Then you need to derive your own class from FrameLayout. This will do the whole job:
public static class YourOwnFrameLayout extends FrameLayout {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Catch all touch events
// You can also distinguish which event to catch (return true) or ignore (return false)
// using "switch" or "if" statement on ev.getActionMasked() or ev.getAction()
return true;
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
// Define your OnTouchEvent actions here
// Use "switch" or "if" statement on ev.getActionMasked() or ev.getAction()
// Dispatch event to the children
for (int i = 0; i < getChildCount(); i++) {
getChildAt(i).dispatchTouchEvent(event);
}
return true;
}
// Standard constructors — just pass everything
public YourOwnFrameLayout (final Context context) {
super(context);
}
public YourOwnFrameLayout (final Context context, final AttributeSet attrs) {
super(context, attrs);
}
public YourOwnFrameLayout (final Context context, final AttributeSet attrs, final int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public YourOwnFrameLayout (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
}
Then use this Customized FrameLayout (or any other Fragment container) in your Application xml (not in Fragment xml).
Upvotes: 0
Reputation: 668
All you need is, add ``focusable="true" and clicable="true"
in your fragments xml
.
Upvotes: 0
Reputation: 10038
It works on me:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_take_attendance, container, false);
touchListener(view);
..
}
private void touchListener(View view) {
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN){
Toast.makeText(getActivity(), "you just touch the screen :-)", Toast.LENGTH_SHORT).show();
}
return true;
}
});
}
It listens when you touch whole fragment
Upvotes: 6
Reputation: 15929
You have to subclass ViewPager and override interceptTouchEvent()
and onTouchEvent()
to distinguish swipe gestures from touch fragment event. https://developer.android.com/training/gestures/viewgroup.html
Upvotes: 3