OnClick on inflated items

时间:2015-06-18 05:55:00

标签: android android-layout android-inflate

在我的 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监听器将返回一个nullptr异常

3 个答案:

答案 0 :(得分:1)

您可以在设置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(...);
}

...

答案 1 :(得分:1)

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中的所有图像视图添加相同的点击监听器,请执行以下操作。

在要升级inflated_layout

的类中创建一个私有类
 private class ClickListener implements View.OnClickListener{

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

}

然后,您将获得对每个imageview的引用,并将click clickner设置为每个imageview,如下所示。

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

答案 2 :(得分:0)

这样做,

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;
            }
        }
    });
相关问题