OnClick 膨胀的物品

OnClick on inflated items

在我的 activity.xml 我有一个 LinearLayout。此 LinearLayout 包含一个由四个 ImageViews 组成的膨胀布局。实现是这样的:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll_template);
View view = getLayoutInflater().inflate(R.layout.inflated_layout, linearLayout, false);
linearLayout.addView(view);

我想在用户点击图片时执行一个操作。但是,当我单击图像时没有任何反应。这是我对 onclick 事件的实现: v.getId() 每次我点击图片

都会给我 -1
view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Log.v("V.getID", String.valueOf(v.getId()));
            Log.v("Image 1 id", String.valueOf(R.id.iv_t_1));

            switch (v.getId()){

                case R.id.iv_t_1: //image 1 clicked
                    //action
                    break;

                case R.id.iv_t_2: //image 2 clicked
                    //action
                    break;

                case R.id.iv_t_3: //image 3 clicked
                    //action
                    break;

                case R.id.iv_t_4: //image 4 clicked
                    //action
                    break;

                default:
                    break;
            }
        }
    });

编辑: 我不想在单独的图像上设置监听器的原因是膨胀的布局是动态的。它可以包含 1 到 4 张图像中的任意数量。如果我有两个图像的布局,那么第四个 imageView 侦听器将 return 一个 nullptr 异常

这样做,

ImageView img1 = (ImageView) view.findViewById(R.id.imageview1);
img1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Log.v("V.getID", String.valueOf(v.getId()));
            Log.v("Image 1 id", String.valueOf(R.id.iv_t_1));

            switch (v.getId()){

                case R.id.iv_t_1: //image 1 clicked
                    //action
                    break;

                case R.id.iv_t_2: //image 2 clicked
                    //action
                    break;

                case R.id.iv_t_3: //image 3 clicked
                    //action
                    break;

                case R.id.iv_t_4: //image 4 clicked
                    //action
                    break;

                default:
                    break;
            }
        }
    });

你可以在设置之前找到那些图像并检查它是否不为空onClickListener

ImageView img1 = (ImageView) view.findViewById(R.id.imageview1);
if (img1 != null) {
  img1.setOnClickListener(...);
}

ImageView img2 = (ImageView) view.findViewById(R.id.imageview2);
if (img2 != null) {
  img1.setOnClickListener(...);
}

...

v.getId() 给出 -1,因为您尚未在布局 inflated_layout 中为根元素设置任何 ID。您在 "inflated_layout" 中为根元素设置一个 ID,然后 v.getId() 将为您提供一个有效 ID。


View view = getLayoutInflater().inflate(R.layout.inflated_layout, linearLayout, false);
linearLayout.addView(view);

当您将点击监听器添加到上面膨胀的视图时,您是将点击监听器添加到整个布局 (inflated_layout),而不是添加到 inflated_layout 中存在的各个图像视图。要将相同的点击侦听器添加到 inflated_layout 中存在的所有图像视图,请执行以下操作。

在 class 中创建一个私人 class,您要在其中充气 inflated_layout

 private class ClickListener implements View.OnClickListener{

    @Override
    public void onClick(View v) {
        Log.d("test","View Id="+v.getId());
    }

}

然后你得到每个图像视图的引用,并为每个图像视图设置点击监听器,如下所示。

    LinearLayout linearLayout=(LinearLayout) findViewById(R.id.ll_template);
    View view=getLayoutInflater().inflate(R.layout.inflated_layout, null);
    linearLayout.addView(view);

    ImageView iv1=(ImageView) view.findViewById(R.id.iv_t_1);
    ImageView iv2=(ImageView) view.findViewById(R.id.iv_t_2);
    ImageView iv3=(ImageView) view.findViewById(R.id.iv_t_3);
    ImageView iv4=(ImageView) view.findViewById(R.id.iv_t_4);

    ClickListener cl=new ClickListener();
    iv1.setOnClickListener(cl);
    iv2.setOnClickListener(cl);
    iv3.setOnClickListener(cl);
    iv4.setOnClickListener(cl);