Как обрабатывать события касания на фрагменте?

Я создаю интерфейс, в котором мне нужно обрабатывать события касания. В частности, я мог бы включить их только в ограниченную область во фрагменте. Чтобы лучше понять проблему, соблюдать стандарты и цель моего приложения, я спланировал панель навигации, которая предполагает наличие множества фрагментов (вместо действий). Действие с событиями касания реализуется довольно легко, с другой стороны, я читал в Интернете, что с фрагментами могут возникнуть проблемы.

Мое приложение на архитектурном уровне выглядит следующим образом: - MainActivity.java - NavigationDrawer.java - TestFragment.java (сейчас для одного фрагмента, ожидая решения проблемы)

Я не нашел решения или руководства, в котором объяснялось бы, как добиться успеха (или как решить проблему). Тогда я прошу вас, упрощая задачу, просто «включить событие касания во фрагменте (в данном случае getPressure ())». Ниже приведены некоторые фрагменты кода, которые могут помочь решить проблему:

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)
    }
}

Как связать слушателя со всем фрагментом? А в случае с конкретным районом? Наконец, как мне вернуть значение давления на экран?

Большое спасибо за совет! :)


person user3319400    schedule 19.02.2014    source источник
comment
Кстати, в моей компании есть class MainActivity extends Activity и много фрагментов. Одна из основных проблем, с которыми мы столкнулись, заключалась в следующем: мы не могли заставить стек навигации (он же задний стек) для фрагментов работать так, как мы хотели (я думаю, что iOS справилась с этим лучше), поэтому мы закончили тем, что управляли фрагментами и кнопкой возврата в наших собственных код. То есть мы отслеживали фрагменты, и при нажатии кнопки «Назад» принимали собственное решение о том, куда вернуться. (Если фрагмент A связан с дочерним фрагментом B1, который ссылается на фрагмент однорангового / однорангового B2, мы хотели, чтобы Back возвращался к A, а не к B1, в тех местах, где это имеет смысл)   -  person ToolmakerSteve    schedule 20.10.2016
comment
Думаю, один ответ на этот вопрос здесь: stackoverflow.com/questions/11001282/   -  person JJorian    schedule 25.07.2018


Ответы (2)


Не уверен, понял ли я вашу проблему, но я постараюсь ответить на этот вопрос. Итак, чтобы получить доступ к событиям на фрагменте, я бы сделал следующее:

-в вашем фрагменте 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;

и вы можете проверить различные MotionEvents в onTouch, например:

MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP,...
person intips    schedule 19.02.2014
comment
Спасибо! :) Я сделал то, что вы написали, но Android Studio сообщает, что вызов метода 'view.setOnTouchListener (new View.OnTouchListener () {public boolean onTouch (View v, [...] может вызвать исключение нулевого указателя. Имейте у вас есть идея решить эту проблему? - person user3319400; 19.02.2014
comment
Я думаю, вам не стоит беспокоиться об этом предупреждении, я использовал этот метод в eclipse, и он не показывал никаких предупреждений, и у меня никогда не было проблем с его использованием. - person intips; 20.02.2014
comment
@ user3319400, вы также можете реализовать метод onTouch в своем фрагменте и использовать view.setOnTouchListener(this) - person Ivan Black; 07.06.2015
comment
Для пояснения комментария Ивана Черного: В начале вашего фрагмента: public class YourFragmentName implements View.OnTouchListener. И где-то внутри вашего фрагмента есть метод public boolean onTouch(View v, MotionEvent event) { ... }. Затем вы подключаете это к своему представлению с помощью view.setOnTouchListener(this). - person ToolmakerSteve; 20.10.2016
comment
мне все еще не повезло rootView.setOnTouchListener (new View.OnTouchListener () {@Override public boolean onTouch (View v, событие MotionEvent) {if (event.getActionMasked () == MotionEvent.ACTION_DOWN) {Toast.makeText (getActivity () , вы просто касаетесь экрана :-), Toast.LENGTH_SHORT) .show (); } вернуть истину; }}); - person Vishal Patel; 24.02.2017

В Котлине:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

   val view =  inflater.inflate(R.layout.fragment_img_view, container, false)

    view.setOnTouchListener(object : View.OnTouchListener {
        override fun onTouch(v: View?, event: MotionEvent): Boolean {
            if (event.action == MotionEvent.ACTION_MOVE) {
                scaleGestureDetector.onTouchEvent(event)
            }
            return true
        }
    })
    return view
}
person Massimo Pavanel    schedule 07.01.2021