安卓ImageView的onClickListener无法工作

51
我有一个ImageView,想要实现onClickListener。但是当我点击图片时,没有任何反应。即使Logcat也没有显示任何错误。 以下是我的导入语句:
import android.view.View.OnClickListener;

以下是我的图片布局代码:

<ImageView android:id="@+id/favorite_icon" 
    android:src="@drawable/small_star"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="top|right" android:paddingTop="63sp"
    android:paddingRight="2sp"  />

以下是我在活动中定义OnClickListner的事件处理程序的代码:

ImageView imgFavorite = (ImageView) findViewById(R.id.favorite_icon);
imgFavorite.setClickable(true);
imgFavorite.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i(SystemSettings.APP_TAG + " : " + HomeActivity.class.getName(), "Entered onClick method");
                Toast.makeText(v.getContext(),
                        "The favorite list would appear on clicking this icon",
                        Toast.LENGTH_LONG).show();
            }
        });

我有什么遗漏吗?


2
不要在这里使用 getApplicationContext()。使用 WhateverYourActivityIs.this,将您的活动名称替换为 WhateverYourActivityIs。另外,记录一些东西到 LogCat(例如,Log.w())通常比仅依赖于 Toast 这种诊断工具更有用。 - CommonsWare
@CommonsWare:从更新中可以看到,我将“getApplicationContext()”更改为“HomeActivity.this”,并添加了一个Log语句。它仍然不能工作。我是否忽略了仅在onClickListner与ImageView一起使用的特定内容? - Mahendra Liya
@mahendraliya:“我是否错过了一些与onClickListener和ImageView配合使用的特定内容?”-- 不,它应该可以正常工作。 - CommonsWare
@CommonsWare:我正在使用FrameLayout。您认为这会以任何方式影响吗? - Mahendra Liya
我为了让setOnClickListener起作用而苦苦挣扎了数小时,尝试了setclickable(true)、setfocusable(true)、bringToFront()等方法,但都无济于事。只有setOnTouchListener对我有效。 - derjohng
显示剩余3条评论
16个回答

51

你能试一下并告诉我会发生什么吗?:

JAVA:

ImageView imgFavorite = (ImageView) findViewById(R.id.favorite_icon);
imgFavorite.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(YourActivityName.this,
                "The favorite list would appear on clicking this icon",
                Toast.LENGTH_LONG).show();
    }
});

或者您可以添加以下内容:

imgFavorite.setClickable(true); 

KOTLIN:

imgFavorite.setOnClickListener { view ->
    Toast.makeText(this@YourActivityName, R.string.toast_favorite_list_would_appear, Toast.LENGTH_LONG).show()
}
// either you make your imageView clickable programmatically
imgFavorite.clickable = true

// or via xml on your layout file
<ImageView .... android:clickable="true" />

2
我尝试使用imgFavorite.setClickable(true);,但这也没有解决问题。 - Mahendra Liya
我真的不明白为什么它不起作用,你能把你的Activity代码放上来吗?全部的都请。 - Houcine

39

好的,

我已经成功解决了这个棘手的问题。事情是这样的,我正在使用FrameLayout。不知道为什么,我想到可能图标会被隐藏在其他视图后面。

我尝试把图标放在布局的末尾,现在我能够看到Toast以及Log

谢谢大家花时间来解决这个问题。确实有些棘手。


2
这里做同样的事情,只是使用 RelativeLayout。将 ImageView 移动到显示 RelativeView 主内容的 View 之后,问题得到了解决。将 ImageView 设置为可点击并不是必要的。 - spaaarky21
1
在设置 onClickListener 之前,您可以使用 yourImageView.bringToFront()。 - Houcine
是的!有时候顺序很重要。 - DavidR

13

实际上我只是使用了imgView.bringToFront();这个方法,它起到了帮助的作用。


救命稻草!我在一个帧布局中有两个重叠的视图,但无法以其他方式触发监听器。谢谢! - Alexandru Pele
这正是我的问题,我认为这是因为它与另一个视图重叠,当你点击时无法到达该视图,谢谢! - Gastón Saillén
你救了我的一天。 - boraseoksoon

5

尝试通过传递上下文而不是应用程序上下文(您还可以添加日志语句来检查是否运行onClick方法):

imgFavorite.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("== My activity ===","OnClick is called");
            Toast.makeText(v.getContext(), // <- Line changed
                    "The favorite list would appear on clicking this icon",
                    Toast.LENGTH_LONG).show();
        }
    });

1
我尝试使用v.getContext()并添加日志语句。但是两者都没有显示出来,也没有Toast。我不明白问题出在哪里。 - Mahendra Liya

5
android:onClick="clickEvent"添加到您的图像视图中。
<ImageView android:id="@+id/favorite_icon" 
    android:src="@drawable/small_star"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="top|right" android:paddingTop="63sp"
    android:paddingRight="2sp"
    android:onClick="clickEvent"  />

在你的活动中,你可以创建一个同名方法 (clickEvent(View v)),就这样!你也可以看到日志和弹出文本。

public void clickEvent(View v)
  {
    Log.i(SystemSettings.APP_TAG + " : " + HomeActivity.class.getName(), "Entered onClick method");
    Toast.makeText(v.getContext(),
            "The favorite list would appear on clicking this icon",
            Toast.LENGTH_LONG).show();
  }

5

我的解决方案是另一个,或者说,问题是:

我在另一个<included />两次封装的xml布局中有一个具有相同id的imageview,它被发现在我想要响应点击的那个之前。解决方案:给它们中的一个另一个id...


1
我也遇到了同样的问题。重复的ID。 - garish

2
请尝试这个。

最初的回答。

ImageView imageview1 = findViewById(R.id.imageView1);
imageview1.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            Toast.makeText(YourActivity.this, "Here is your Text",Toast.LENGTH_SHORT).show();

        }

    });

2

我遇到了相同的问题,感谢Framelayout的提示! 我在一个Framelayout中使用了两个重叠的图像(上面的那一个是透明蒙版,用于给出软边框的效果)。

我在xml中设置了android:clickable="true"来使我希望触发onClick事件的图像具有可点击性,并将android:clickable="false"应用于透明蒙版。


0
为了让内部类传递活动的引用,我通常在onCreate()中创建一个活动引用并将其设置为成员。由于内部类可以访问父类成员,因此您可以获取到您的活动及其上下文:
class MyClass extends Activity{
    private Activity thisActivity;
    @Override
protected void onCreate(Bundle savedInstanceState) {
            thisActivity = this;
    }
}

希望这有所帮助。

2
常规内部类已经可以访问this--添加一个数据成员是不必要的。 - CommonsWare
但是内部类中的“this”不应该指向封装它的外部类对象吗?或者你是在说有一种方法可以通过内部类中的“this”实际访问外部类实例? - anargund
2
"MyClass.this" 指的是特定封闭外部类的 "this"。 - CommonsWare

0
我为ImageView定义了一个OnClickListener,作为按钮的OnClickListener,看起来工作正常。这是我的代码,请尝试并让我们知道是否有效。
final ImageView imageview1 = (ImageView) findViewById(R.id.imageView1);

imageview1.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {
        try {
             Log.i("MyTag","Image button is pressed, visible in LogCat");;
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接