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

时间:2014-08-06 07:55:42

标签: android android-layout android-view android-event

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

7 个答案:

答案 0 :(得分:3)

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

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


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

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

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

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

答案 1 :(得分:2)

例如,Layout有两个视图View1和View2。我假设你已经给他们充气了。所以你必须为每个人设置OnClickListiner

Layout.setOnClickListener(this);
View1.setOnClickListener(this);
View2.setOnClickListener(this);

然后你必须覆盖方法:

public void onClick(View v) 
    {
        switch(v.getId())
        {
            case R.id.id_for_layout:
                // do what you want when user click layout
                break;

            case R.id.id_for_first_view:
                // do what you want when user click first view
                break;

            case R.id.id_for_second_view:
                // do what you want when user click second view
                break;
          }
}

答案 2 :(得分:0)

There is View v parameter in onClickListner(View v) method : 


@Override
protected void onCreate(Bundle savedInstanceState) {
    LinearLayout layout=(LinearLayout)findViewById(R.id.linearLayout);
    layout.setOnclickListener(this);

}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.linearLayout){
        //your logic
    } 
}

答案 3 :(得分:0)

请记住,OnClick方法有一个参数,用于指示单击哪个View!

public void onClick(View v) {
      switch(v.getId()) {
        case R.id.btn1:
          // first button
          break;
        case R.id.btn2:
          // second button
          break;
      }
  }

答案 4 :(得分:0)

通过android为每个视图分配id:id =&#34; @ + id / v1&#34;

onClick(View v)

检查视图

if(v == findViewById(R.id.v1))
{
 // v1 specific action
}
else if(v == findViewById(R.id.v2))
    {
     // v2 specific action
    }

答案 5 :(得分:0)

好的,这很简单。
您必须为每个视图(按钮,textView等)以及整个布局添加OnClickListener。
在这种情况下,单击时将启动的onClickListeners是视图的onClickListener和布局的onClickListener。
因此不需要一大堆类。
如果你尝试这个就足够了(做动作取决于id并且不要忘记布局;)):

public void onClick(View v) {
  switch(v.getId()) {
    case R.id.layout:
      layout actions here
      break;
    case R.id.textview:
      textview actions here
      break;

这个onClickListener适用于所有视图;)

答案 6 :(得分:0)

对于任何感兴趣的人,您也可以记录当前点击的视图:

 getActivity()
      .getWindow()
      .getDecorView()
      .findViewById(android.R.id.content)
      .setOnTouchListener((v, event) -> {

                if (event.getAction() == MotionEvent.ACTION_UP) {
                    Log.v("[onClick]", v.getClass().getCanonicalName());
                }

                return false;
            });