Как да се справя със събитията при докосване на фрагмент?

Създавам интерфейс, където имам нужда да обработвам събития при докосване. По-специално, бих могъл да ги активирам само в ограничена област във фрагмент. За да разбера по-добре проблема, да спазвам стандартите и за целта на моето приложение, планирах навигационното чекмедже, което предполага наличието на много фрагменти (вместо дейности). Дейност със събития на докосване се реализира доста лесно, от друга страна прочетох в интернет, че с фрагментите може да стане проблем.

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

Не намерих решение или урок, който да обяснява как да се справя добре (или как да заобиколя проблема). След това ви моля, опростявайки проблема, така че просто да „разрешите събитие за докосване във фрагмент (getPressure() в този случай)“. По-долу са някои части от кода, които могат да помогнат за разрешаването на проблема:

Тестов фрагмент

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 event) { 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