setOnTouchListener对android Fragment不起作用

4 人关注

我正在使用 TabView ,在其中,我使用 Fragment 来加载每个标签。我想在用户接触到任何一个片段时获得 Touch 事件。

 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;

在这里,我尝试用两种方式获得触摸事件,一种是通过事件,另一种是通过布局的id,但我没有运气。这段代码没有出现错误,但也没有输出。

1 个评论
Why not using OnClickListener ?
android
android-fragments
fragment
ontouchlistener
tabview
Shafiq Ullah Shohag
Shafiq Ullah Shohag
发布于 2015-04-09
4 个回答
Jemshit Iskenderov
Jemshit Iskenderov
发布于 2022-04-12
已采纳
0 人赞同

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;

当你触摸整个片段时,它就会倾听

如果我发送错误的视图,那么应用程序必须显示错误或崩溃
@ShafiqUllahShohag 我在Fragment中试过这段代码,点击TextView,它可以工作。删除方法中的第一个布局.setOnTouchListener()
lskenderov , 我想对整个布局采取触摸事件,比如用户可以触摸没有按钮的地方,或者文字,我怎么做呢?
@ShafiqUllahShohag 我改变了,在我的案例中,我把 View view 定义在我的 onCreateView 里面。
我想我找到了问题所在。整个片段是一个recyclerview,所以可能是recyclerview在消耗触摸?
sockeqwe
sockeqwe
发布于 2022-04-12
0 人赞同

你必须对ViewPager进行子类化,并覆盖 interceptTouchEvent() onTouchEvent() 以区分刷卡手势和触摸片段事件。 https://developer.android.com/training/gestures/viewgroup.html

它在滑动标签时产生了问题,同样它不能接受触摸事件,它在呼叫器滑动时接受触摸 ...
你是对的,我可以在点击按钮时得到它。但在我的问题中,我不仅要为按钮的点击设置定时器,还要为其他元素的触摸设置。所以我的逻辑是在布局中获得任何一种触摸来设置定时器。
只需在布局中添加一个 OnClickListener 。 替换代码0】可以在安卓的任何视图(布局也是一个视图)上设置,而不仅仅是在按钮上。
我试了一下,但没有成功。你能给我一个对你有用的示例代码吗?
Kevin Mendez
Kevin Mendez
发布于 2022-04-12
0 人赞同

你所需要的是,在你的 fragments xml 中添加``focusable="true "和 clicable="true"

basileus
basileus
发布于 2022-04-12
0 人赞同

与@sockeqwe给出的答案相似,但有更多细节。你可能在你的应用类中把你的Fragment添加到一些片段容器中。假设你使用FrameLayout(它是由ViewGroup派生的)来达到这个目的。那么你需要从FrameLayout派生出你自己的类。这将完成整个工作。

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