【问题标题】:How to handle Touch Events on a Fragment?如何处理片段上的触摸事件?
【发布时间】:2014-03-19 21:18:08
【问题描述】:

我正在构建一个界面,我需要处理触摸事件。特别是,我将能够仅将它们启用到片段中的受限区域。 为了更好地理解问题、尊重标准和实现我的应用程序的目标,我计划了导航抽屉,它假定存在许多片段(而不是活动)。带有触摸事件的 Activity 很容易实现,另一方面,我在互联网上读到 片段可能会成为问题

我的应用程序,在架构级别,如下所示: - MainActivity.java - NavigationDrawer.java - TestFragment.java(现在是单个fragment,等待解决问题)

我没有找到解释如何做好(或如何解决问题)的解决方案或教程。然后我问你,将问题简化为“在片段中启用触摸事件(在这种情况下为 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)
    }
}

如何将监听器关联到整个片段?在特定区域的情况下?最后,如何返回屏幕上的压力值?

非常感谢您的建议! :)

【问题讨论】:

  • 顺便说一句,在我的公司里,我们有一个class MainActivity extends Activity,还有很多片段。我们遇到的一个主要问题是:我们无法让片段的导航堆栈(也称为返回堆栈)按照我们想要的方式工作(我认为 iOS 做得更好),所以我们最终自己管理片段和返回按钮代码。也就是说,我们跟踪片段,当按下后退按钮时,我们自己决定回到哪里。 (如果片段 A 链接到子片段 B1,该子片段 B1 链接到兄弟/对等片段 B2,我们希望 Back 在有意义的地方返回 A,而不是 B1)
  • 我认为这个问题的答案在这里:stackoverflow.com/questions/11001282/…

标签: android android-fragments touch-event ontouchlistener


【解决方案1】:

在 Kotlin 中:

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
}

【讨论】:

    【解决方案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;
    

    你可以在onTouch中检查不同的MotionEvents,例如:

    MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP,...
    

    【讨论】:

    • 谢谢! :) 我已经完成了你写的操作,但是 Android Studio 说方法调用 'view.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, [...] 可能会产生空指针异常。有你有解决这个问题的想法吗?
    • 我觉得你不用担心那个警告,我在eclipse中用过这个方法,并没有显示任何警告,我用这种方式从来没有遇到过问题。
    • @user3319400 你也可以在你的片段中实现onTouch方法并使用view.setOnTouchListener(this)
    • 澄清 Ivan Black 的评论:在您的片段开头:public class YourFragmentName implements View.OnTouchListener。在您的片段中的某处是一个方法public boolean onTouch(View v, MotionEvent event) { ... }。然后你用view.setOnTouchListener(this) 将它与你的视图挂钩。
    • 对我来说仍然没有运气 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(); } 返回真; } });
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多