如何知道在布局 OnClickListener 中单击了哪个视图?

Bab*_*-Na 5 android android-layout android-view android-event

我有一个包含一些视图的布局。我想在用户单击布局中的任意位置时设置一些操作,因此我为布局设置了一个 OnClickListener,该布局工作清晰。但是我怎么知道点击了哪个视图?我想根据点击的视图分配不同的动作;或者可能没有点击视图,它只是布局本身。所以问题是,如果我为其中一个视图设置 OnClickListener,与布局和视图相关的 OnCLickListeners 都将被激活,但我只想要视图操作。提前致谢。

Sim*_*mas 5

其他答案非常抽象,有些是不正确的。您无法重写 Activity 的 onClick 方法,因为它没有该方法(当然除非您实现 OnClickListener)。

此外,如果您为布局设置侦听器,则ViewonClick 方法接收的参数将始终是布局。


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

一个干净的解决方案是使用单个侦听器并检查它是否是被单击的视图。

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);
}
Run Code Online (Sandbox Code Playgroud)

如果您希望对不同的视图执行不同的操作,只需为每个视图创建一个侦听器即可。