Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to handle Touch Events on a Fragment?

I'm building an interface where I need to process touch events. In particular I would to be able to enable them only to a confined area in a fragment. To better understand the problem, to respect the standards and for the goal of my application, I planned the navigation drawer, which assumes the presence of many fragment (instead of activities). An activity with touch events is implemented quite easily, on the other hand I have read on the internet that with the fragments can become a problem.

My application, at the architectural level, is as follows: - MainActivity.java - NavigationDrawer.java - TestFragment.java (for a single fragment now, waiting to solve the problem)

I've not found a solution or a tutorial that explains how to do well (or how to workaround the problem). Then I ask you, simplifying the problem to just "enable a touch event in a fragment (getPressure() in this case)". Below are some pieces of code that may help to solve the problem:

TestFragment

public class TestFragment extends Fragment {     private static final String ARG_SECTION_NUMBER = "section_number";      public static TestFragment newInstance(int sectionNumber) {         TestFragment fragment = new TestFragment();         Bundle args = new Bundle();         args.putInt(ARG_SECTION_NUMBER, sectionNumber);         fragment.setArguments(args);         return fragment;     }      public TestFragment() {}      @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,                          Bundle savedInstanceState) {         return inflater.inflate(R.layout.fragment_test, container, false);     }      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);     }      @Override     public boolean onTouchEvent(MotionEvent event) {         // Here I want to return the press value (0 to 1)     } } 

How to associate the listener to the whole fragment? And in the case of a particular area? Finally, how can I return the value of the pressure on the screen?

Thank you so much in advice! :)

like image 960
user3319400 Avatar asked Feb 19 '14 13:02

user3319400


People also ask

Which method you should override to control your touch action?

To make sure that each view correctly receives the touch events intended for it, override the onInterceptTouchEvent() method.

How are Android touch events delivered?

The touch event is passed in as a MotionEvent , which contains the x,y coordinates, time, type of event, and other information. The touch event is sent to the Window's superDispatchTouchEvent() .

Which method you should override to control your touch action in Android?

1.1. You can react to touch events in your custom views and your activities. Android supports multiple pointers, e.g. fingers which are interacting with the screen. The base class for touch support is the MotionEvent class which is passed to Views via the onTouchEvent() method. you override the onTouchEvent() method.

Can you call an activity from a fragment?

Best way of calling Activity from Fragment class is that make interface in Fragment and add onItemClick() method in that interface. Now implement it to your first activity and call second activity from there.


1 Answers

I'm not sure if I understood your problem, but I will try to answer this. So to get touch events on fragment I would do this:

-in your fragment onCreateView:

View view = inflater.inflate(R.layout.fragment_test, container, false);      view.setOnTouchListener(new View.OnTouchListener() {             public boolean onTouch(View v, MotionEvent event) {                  if(event.getAction() == MotionEvent.ACTION_MOVE){                     //do something                 }                 return true;             }     });  //here the rest of your code  return view; 

and you can check for different MotionEvents in onTouch, for example:

MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP,... 
like image 195
intips Avatar answered Sep 24 '22 08:09

intips