【问题标题】:Focus of EditText in ListViewListView中EditText的焦点
【发布时间】:2025-12-27 09:40:12
【问题描述】:

我目前在 ListView 中遇到一堆 EditText 的问题

每个 ListView 项的定义如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/itemLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="left"
        android:maxLines="1"
        android:text="Label"
        android:textSize="17sp"
        android:textStyle="bold" />
    <EditText
        android:id="@+id/valueEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:layout_below="@id/itemMainLabel"
        android:gravity="left"
        android:textSize="14sp"
        android:inputType="textNoSuggestions"/>
</RelativeLayout>

现在,无论我在哪里触摸列表项,该字段的 EditText 都需要获得焦点。 为此,我坚持以下ItemClicked 事件处理程序可以工作:

private void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
     TextView valueField = e.View.FindViewById<EditText>(Resource.Id.valueEditText);
     if (valueField != null)
     {
          valueField.RequestFocus();
     }
}

但是,当我单击 EditText 时,它能够获得焦点(因为这是默认行为),但 ItemClick 事件处理程序不会在我单击列表项的任何位置触发。

事件处理程序未触发的原因可能是什么?有没有办法使这项工作正常工作,以便在单击项目的一部分时 EditText 将获得焦点?

【问题讨论】:

    标签: android listview focus android-edittext xamarin.android


    【解决方案1】:

    您已将EditText 对象分配给TextView 实例。所以,改变这一行...

    TextView valueField = e.View.FindViewById<EditText>(Resource.Id.valueEditText);
    

    到...

    EditText valueField = e.View.FindViewById<EditText>(Resource.Id.valueEditText);
    

    【讨论】:

    • 虽然这对我来说是一个愚蠢的错误,但将实例更改为 EditText 并没有解决焦点问题(因为包含实例声明的事件处理程序甚至一开始都没有触发)
    【解决方案2】:

    默认情况下,TextViewEditText 都会吞下您的水龙头。尝试将此添加到您的 TextView 的 AXML:

    android:focusable="false"

    【讨论】:

    • 这确实使ListView_ItemClick 方法触发,但是现在此方法中调用的RequestFocus 不再使EditText 成为焦点。