监听器不工作

Listener won't work

我正在尝试为放置在 LinearLayout 中的自定义视图设置监听器。这些视图是由代码根据特定文件或数据创建的,所以我不知道有多少视图。正在设置 OnClickListener,但从未调用 onClick():

@Override
    protected void onResume() {
        super.onResume();
        try {
            setupBackEnd();
        } catch (IOException e) {
            Toast.makeText(this, "Error Reading or Writing data in Storage, Try to restart the App", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }

        Toast.makeText(DayActivity.this, "Child count: " + linearList.getChildCount(), Toast.LENGTH_SHORT).show();
        for (int i = 0; i < linearList.getChildCount(); i++) {
            linearList.getChildAt(i).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(DayActivity.this, "clicked", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

这是我的代码。为了确保子视图已经存在,我展示了一个 Toast,它给了我 "Child Count: 5" 但 "clicked" Toast 从未出现。我确保我的自定义视图是可点击的(线性列表的子视图)。但由于某种原因,听众将无法工作。有人知道为什么吗?

编辑:在我尝试调试代码后出现此错误:

10-27 18:52:26.309 17630-17630/osm_cave.timecave E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: osm_cave.timecave, PID: 17630
                                                                   android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@672721e is not valid; is your activity running?
                                                                       at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
                                                                       at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
                                                                       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
                                                                       at android.widget.Toast$TN.handleShow(Toast.java:459)
                                                                       at android.widget.Toast$TN.handleMessage(Toast.java:342)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
c

当我在没有调试的情况下启动应用程序时不会显示此错误,它只会在使用断点进行调试时出现。这个错误应该意味着我正在尝试使用不再存在的上下文,但我不存在,所以这里有什么问题??

看起来你的 toast 消息 运行 出错了。

 at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
 at android.widget.Toast$TN.handleShow(Toast.java:459)
 at android.widget.Toast$TN.handleMessage(Toast.java:342)
 at android.os.Handler.dispatchMessage(Handler.java:102)

如果我没记错的话,您正在创建的 View.OnClickListener 类型的新对象(因为它是匿名的)无法访问 DayActivity.this 属性。相反,您应该从视图中获取 activity。

public void onClick(View view) {
    Activity activity = (Activity) view.getContext()
    Toast.makeText(activity, "clicked", Toast.LENGTH_SHORT).show();
}

虽然使用 Toast 消息来测试事件的发生没有任何问题,但我建议简化为仅使用日志消息。日志消息不是上下文敏感的,除非您向它提供空消息,否则不太可能失败。

如果日志消息不起作用,下一步的故障排除步骤应该是检查自定义视图和视图层次结构。如果自定义视图前面有任何可点击的透明视图,它们将拦截点击事件。仔细检查视图本身是否也是可点击的。