【问题标题】:Click Event on ImageButton not dispatched immediately未立即调度 ImageButton 上的单击事件
【发布时间】:2011-11-26 21:25:37
【问题描述】:

在我相当复杂的视图布局中,我遇到了一个奇怪的问题。 (在我的解释中我会尽量简化一下)

基本上我有一个ListView,其中每个项目由一个TextView 和一个ImageButton 组成。我可以单击列表项(在文本视图上)或按钮(我将 ImageButton 设置为不可聚焦,否则它将不起作用)

现在它似乎工作正常,直到我打开另一个窗口并返回到列表视图。 从那时起,我可以单击 ImageButton 而不会发生任何事情(甚至在单击期间背景不会发生变化)。但是当我再次单击 TextView 时,ImageButton 中的所有单击事件都会立即调度。

这是为什么呢?

编辑:

列表项:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="0px"
    android:minHeight="40dp"
    android:orientation="horizontal"
    android:paddingLeft="2px"
    android:paddingRight="2px"
    >

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Text"
        android:textSize="19dp"
        android:paddingTop="4px"
        android:paddingBottom="4px"
        android:layout_gravity="center_vertical"/>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/open_subtree_layout"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="0px"
        android:orientation="horizontal"
        android:padding="0px">

        <View
            android:layout_width="1px"
            android:layout_height="match_parent"
            android:background="@drawable/separator_line" />

        <com.treeviewer.leveldisplay.DontPressWithParentImageButton
            android:id="@+id/btn_right"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical"
            android:background="@drawable/list_selector_background"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:padding="10dp"
            android:src="@drawable/arrow_right" />
    </LinearLayout>

</LinearLayout>

就是这样膨胀的:

    [...]
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = inflater.inflate(R.layout.tree_row, null, false);

TextView textView = (TextView)mView.findViewById(R.id.text1);
LinearLayout nextNodeButtonContainer = (LinearLayout)mView.findViewById(R.id.open_subtree_layout);

if(childCount >= 0) {
    titleBuilder.append(" (" + childCount + ")");
    nextNodeButtonContainer.setVisibility(View.VISIBLE);
    View button = nextNodeButtonContainer.findViewById(R.id.btn_right);
    button.setFocusable(false);
    button.setFocusableInTouchMode(false);
    //button.setClickable(true);
    button.setOnClickListener(clickListener);

    button.setTag(tagValue);
} else {
    nextNodeButtonContainer.setVisibility(View.GONE);
}

textView.setText(titleBuilder);

如果您需要更多代码,请告诉我。

【问题讨论】:

  • 在这里发布一些代码来帮助我们...

标签: android


【解决方案1】:

好的,我终于解决了这个问题。

不幸的是,在我的问题中,我没有提供必要的信息来解决它,因为问题出在我没想到的地方:

我有一个ListAdapter,其中 getView 方法如下所示:

public View getView(int position, View convertView, ViewGroup parent) {
    return mNodes.get(position).getView(mNodeArrowClickListener, position);
}

节点的getView 方法(TreeLevelElements)看起来像:

public class TreeLevelElement {
    private final Context mContext;
    private View mView = null;

    //[...] other methods

     View getView(OnClickListener clickListener, final int tagValue) {
        if(mView == null) {
            //[...] produce a new View from XML
        }
        return mView;
    }
}

问题是,我将视图存储在我的元素中,所以我猜这与 android 为新项目重用旧视图的策略有某种冲突。 我不知道到底发生了什么,但现在我删除了mView 并每次都创建一个新的,它可以工作。

我还将更改它以重用 convertView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多