单击ImageButton上的事件不立即调度

时间:2011-11-25 23:16:08

标签: android

在我相当复杂的视图布局中,我遇到了一个奇怪的问题。 (我将在我的解释中尝试简化它)

基本上我有一个ListView,其中每个项目都包含TextViewImageButton。我能够单击列表项(在textview上)或按钮(我将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);

如果您需要更多代码,请与我们联系。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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