【问题标题】:Android ImageView's onClickListener does not workAndroid ImageView 的 onClickListener 不起作用
【发布时间】:2011-05-21 18:31:05
【问题描述】:

我有一个 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"  />

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

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

我是不是错过了什么。任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • @mahendraliya:不要在这里使用getApplicationContext()。使用WhateverYourActivityIs.this,用您的活动名称替换WhateverYourActivityIs。此外,将某些内容记录到 LogCat(例如 Log.w())而不是依赖 Toast 进行此类诊断通常很有用。
  • @CommonsWare:从更新中可以看出,我将“getApplicationContext()”更改为“HomeActivity.this”..并添加了一条日志语句..它仍然不起作用..我是缺少特定于 onClickListener 与 ImageView 一起使用的内容?
  • @mahendraliya:“我是否遗漏了一些特定于 onClickListener 与 ImageView 配合使用的内容?” -- 不,它应该可以正常工作。
  • @CommonsWare:我不明白为什么它不起作用。您是否发现我可能忽略的代码有任何可能的错误?
  • @CommonsWare:我正在使用 FrameLayout。你认为这会影响吗?

标签: android


【解决方案1】:

你能试试这个并告诉我会发生什么吗? :

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

科特林:

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" />

【讨论】:

  • 我尝试使用 imgFavorite.setClickable(true);但这也不能解决问题
  • 我真的不明白为什么它不起作用,你能把你的活动代码放上去吗?全部都请,?
【解决方案2】:

好的,

我设法解决了这个棘手的问题。事情就像我在使用FrameLayout。不知道为什么,但我想到可能是图标会隐藏在其他视图后面。

我尝试将图标放在布局的末尾,现在我可以看到 ToastLog

感谢大家花时间解决问题。这确实很棘手。

【讨论】:

  • 这里是一样的,但是有一个RelativeLayout。在显示 RelativeView 的主要内容的视图修复了问题之后,将 ImageView 移动到最后。并且没有必要将 ImageView 设置为可点击。
  • 或者你可以在设置 onClickListener 之前使用 yourImageView.bringToFront() 。
  • 是的!有时顺序很重要。
【解决方案3】:

实际上我只是使用了imgView.bringToFront();,它有所帮助。

【讨论】:

  • 救命稻草!我有两个视图在框架布局中重叠,无法让侦听器以任何其他方式触发。谢谢!
  • 这正是我的问题,我认为这是因为它与另一个视图重叠,当您单击时无法访问该视图,谢谢!
  • 你节省了我一天的时间。
【解决方案4】:

尝试通过传递上下文而不是应用程序上下文(您还可以添加日志语句来检查 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();
        }
    });

【讨论】:

  • 我尝试使用 v.getContext() 并添加日志语句..但既不显示日志也不显示 Toast..我不明白问题出在哪里。
【解决方案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)),就是这样!您也可以看到日志和 toast 文本。

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

【讨论】:

    【解决方案6】:

    嗯,我的解决方案是另一个,或者说,错误是:

    我只是在另一个 &lt;included /&gt; 两次封装的 xml 布局中拥有另一个具有相同 ID 的图像视图,该布局在我想要对点击做出反应的那个之前找到。解决方案:给其中一个人另一个ID...

    【讨论】:

    • 我也遇到了同样的问题。重复 ID。
    【解决方案7】:

    遇到同样的问题,感谢 Framelayout 提示! 我在框架布局中使用了两个重叠的图像(顶部的一个是 alpha 蒙版,以提供软边框的效果)

    我在 xml android:clickable="true" 中设置了我想要启动 onClickListener 的图像,并将 android:clickable="false" 设置为 alpha 掩码。

    【讨论】:

      【解决方案8】:

      请试试这个。

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

      【讨论】:

        【解决方案9】:

        对于内部类传递activity的引用,我一般在onCreate()中创建一个activity的引用,并使其成为成员。由于内部类可以访问父类的成员,因此您可以掌握您的活动及其上下文:

        class MyClass extends Activity{
            private Activity thisActivity;
            @Override
        protected void onCreate(Bundle savedInstanceState) {
                    thisActivity = this;
            }
        }
        

        希望对您有所帮助。

        【讨论】:

        • 常规内部类已经可以访问this -- 没有必要为其添加数据成员。
        • 但是内部类中的'this'不会指向内部类的对象,而是将外部类的对象包围它?或者您是说有一种方法可以让您在内部类中使用 this 来实际访问外部类的实例?
        • MyClass.this 指的是特定封闭外部类的this
        【解决方案10】:

        我将 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());
                }
            }
        });
        

        【讨论】:

          【解决方案11】:

          检查其他视图是否具有match_parentfill_parent 属性,这些属性可能会覆盖您的ImageView,这已在您的RelativeLayout 中显示。顺便说一句,接受的答案在我的情况下不起作用。

          【讨论】:

            【解决方案12】:

            同样的事情也发生在我身上。

            原因是:我使用了带有顶部边距的列表视图,因此数据从图像的底部开始,但实际的列表视图与不可见的图像重叠。因此,即使我们单击图像,也不会执行该操作。为了解决这个问题,我让列表视图从图像下方开始,这样它就不会与图像本身重叠。

            【讨论】:

              【解决方案13】:

              此类问题的最可能原因可能是某些不可见的视图位于被点击的视图顶部,这会阻止点击事件触发。因此,在网上大力搜索任何内容之前,请重新检查您的 xml 布局。

              PS :- 就我而言,recyclerView 完全覆盖了布局,因此点击 imageView 受到限制。

              【讨论】:

                【解决方案14】:

                我也遇到过同样的愚蠢

                我只是复制了一项活动并粘贴了。在 Manifest 中定义。

                MainActivity.java 打开,但我忘记了复制的 Activity 在捆绑包中获得了一些 params,如果我没有通过任何 params >,刚刚结束。

                所以我的活动开始但同时完成。

                我写了 Toast 并发现了这个愚蠢的错误。 :P

                【讨论】:

                  【解决方案15】:

                  作为 android 开发的初学者,我的问题不是这些解决方案中的任何一个。我遇到了几个问题。

                  首先,我没有意识到您必须使用错误符号才能使用调试器来命中断点。

                  然后我在点击监听器中默默地收到一个错误,我试图将一些东西传递给一个方法,但该方法需要一个浮点值。

                  但是在 ide 中,该方法显示为未使用。直到我转换了值,该方法才以正确的颜色显示并且不再被标记为未使用。

                  不知道为什么我在尝试使用错误类型的方法时没有收到错误消息?

                  我还必须将android:debuggable="true" 添加到我的清单中才能调试到断点。

                  【讨论】:

                    【解决方案16】:

                    添加android:elevation="3dp" 后,一切正常。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-10-21
                      • 2021-03-17
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-06-15
                      相关资源
                      最近更新 更多