Android onClickListener 不会为子视图触发

Posted

技术标签:

【中文标题】Android onClickListener 不会为子视图触发【英文标题】:Android onClickListener not firing for child views 【发布时间】:2013-04-16 22:52:31 【问题描述】:

我正在开发一个使用 onClickListeners 翻转图块的应用程序。我在一个RelativeLayout 中有整个东西。然后我有第二个 RelativeLayout 来包含我的所有图块,以便于清除和添加。我还在 xml 中预定义了各种其他按钮。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/boardlayout"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="@drawable/board"
    tools:context=".MainActivity" >

    <RelativeLayout
        android:id="@+id/mainlayout"
        android:layout_
        android:layout_>

    </RelativeLayout>

    <ImageView
        android:id="@+id/menuButton"
        android:layout_
        android:layout_
        android:layout_above="@+id/skill2Button"
        android:layout_alignParentRight="true"
        android:src="@drawable/ic_menu" />

</RelativeLayout>

在代码中,我添加了 Tiles,它们是带有我的自定义操作的 ImageView。我还向他们添加了 onClickListeners。网格变量是我上面显示的主布局RelativeLayout。

private void createTiles()
    //Create the tiles
    int j = 0;
    Tile t;
    for(int i = 0; i < 30; i++)

        int r = i/5;
        int c = j%5;
        t = new Tile(this, r, c);
        t.setOnClickListener(tileClicked);

        j++;
        if(j == 5)
            j=0;            

        grid.addView(t);
    

问题在于较旧的 Android 版本,这些图块似乎从未触发点击事件。我将 onClickListeners 添加到图块中,然后在 RelativeLayout 上添加一个只是为了测试,RelativeLayout 获取事件,但图块没有。

菜单 ImageView(如上面的 xml 所示)也有一个 onClickListener,它会被触发。

在较新的 Android 版本中,这可以正常工作。这让我想知道旧版本是否存在从代码中添加的视图传递事件的问题。

谁能告诉我旧版本我做错了什么?

【问题讨论】:

也许可以试试setOnTouchListener()android:clickable="true" 属性。除此之外,您所拥有的似乎应该可以正常工作。 我尝试了这两种方法以及许多不同事物的组合,但没有运气。我已经用尽了我能想到的一切。这让我发疯了。 @Xather 你有没有解决你的问题?我也有类似的问题... 【参考方案1】:

试试这个,

private void createTiles()
    //Create the tiles
    int j = 0;
    Tile t[30];

    for(int i = 0; i < 30; i++)

        int r = i/5;
        int c = j%5;
        t = new Tile(this, r, c);
        t[i].setOnClickListener(this);

        j++;
        if(j == 5)
            j=0;            

        grid.addView(t);
    

你需要在你的类中实现 OnClickListener。 然后你必须重写 onClick 方法:

 @Override
    public void onClick(View v) 
        switch(v.getId())

          case // switch the ids of your views by calling getId method on them           
        
    

【讨论】:

以上是关于Android onClickListener 不会为子视图触发的主要内容,如果未能解决你的问题,请参考以下文章

Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法

Android onclicklistener中使用外部类变量时为什么需要final修饰

如何在Android Java中通过按钮的ID使用OnClickListener属性

Android OnClickListener 多个视图? [复制]

Android onClickListener实现最佳实践

(android.view.View$OnClickListener)' 在一个空对象引用 Kotlin