听众不会工作

时间:2017-10-27 18:40:04

标签: android onclicklistener android-custom-view onresume

我正在尝试为我放入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,它给了我&#34;儿童数:5&#34;但是&#34;点击&#34;吐司永远不会出现。我确保我的自定义视图是可点击的(线性列表的孩子)。但听众因某种原因无法工作。谁知道为什么?

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

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$2.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

当我在没有调试的情况下启动应用程序时,将显示此错误仅在使用断点进行调试时才会显示。这个错误应该意味着我试图使用不再存在的上下文,但我不是这样的问题在哪里?

1 个答案:

答案 0 :(得分:2)

看起来您的Toast消息遇到了错误。

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

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

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

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

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