如何知道哪个View在布局OnClickListener中单击了? [英] How is it possible to know which View has clicked in a layout OnClickListener?

查看:204
本文介绍了如何知道哪个View在布局OnClickListener中单击了?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含一些视图的布局。我想在用户单击布局中的任何位置时设置一些操作,因此我为布局设置了一个OnClickListener,使其工作清晰。但是我怎么知道单击了哪个视图?
我要分配不同的操作取决于所单击的视图;或可能没有单击任何视图,而只是布局本身。
所以问题是,如果我为其中一个视图设置OnClickListener,则与布局和视图相关的OnCLickListeners都将被激活,但是我只需要视图操作。

I have a layout which contains some views. I want to set some actions when a user clicks anywhere in the layout, so I have set an OnClickListener for the layout which works clear. But how can I know which view was clicked? I want to assign different actions depends on the view which was clicked; or maybe no view was clicked and it was only the layout itself. So the problem is if I set OnClickListener for one of the views, both OnCLickListeners related to the layout and the view will get activated, but I want only the view action.Thanks in advance.

推荐答案

其他答案很抽象,有些答案不正确。您不能为Activity覆盖onClick方法,因为它没有一个Activity(除非您实现了OnClickListener)。

Other answers are quite abstract and some are incorrect. You can't Override onClick method for an Activity as it doesn't have one (unless of course you implement an OnClickListener).

此外,如果您将监听器设置为布局,onClick方法收到的 View 参数将始终是布局。

Furthermore, if you set the listener for the layout the View argument received by the onClick method will always be the layout.

您可以创建自己的自定义布局来拦截点击并检查是否单击了视图,也可以为所有视图设置侦听器。

You can either create your own custom layout that intercepts the clicks and check if you clicked on a view, or you can set listeners for all the views.

某种清洁器解决方案正在使用单个侦听器,并检查是否单击了视图。

A somewhat cleaner solution is using a single listener and checking if it's a view that was clicked.

private final String TAG = "MainActivity";
List<View> views = new ArrayList<View>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RelativeLayout rLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
    TextView tv1 = (TextView) findViewById(R.id.tv1);
    TextView tv2 = (TextView) findViewById(R.id.tv2);
    TextView tv3 = (TextView) findViewById(R.id.tv3);

    views.add(tv1);
    views.add(tv2);
    views.add(tv3);

    View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean isView = false;
            for (View view : views) {
                if (v.equals(view)) {
                    isView = true;
                    break;
                }
            }

            if (isView) {
                Log.e(TAG, "Click on view");
            } else {
                Log.e(TAG, "Click on layout");
            }
        }
    };

    tv1.setOnClickListener(clickListener);
    tv2.setOnClickListener(clickListener);
    tv3.setOnClickListener(clickListener);
    rLayout.setOnClickListener(clickListener);
}

如果要对不同的视图执行不同的操作,只需为每个视图创建一个侦听器他们。

If you want different actions for different views, just create a listener for each of them.

这篇关于如何知道哪个View在布局OnClickListener中单击了?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆