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);
在我的 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);