我在一个充满 EditText 的列表视图中挣扎了一段时间,并且我无法找到一种方法来完成我的任务而不做一些棘手的事情。
我使用了最小化的项目来使其更简单且易于讨论。
我有一个ListView,用于询问信息。布局部分非常基本:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.beuvelet.myapplication.MainActivity">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"/>
</RelativeLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginBottom="0dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:gravity="center_vertical|center">
<TextView
android:id="@+id/textQuestion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|left"
android:layout_marginLeft="10dp"
android:text="texte"
android:textSize="23sp"/>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|right"
android:gravity="center_vertical|right">
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:minWidth="125dp"/>
</LinearLayout>
</LinearLayout>
这是我的适配器的 getView :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
v = getLayoutInflater().inflate(R.layout.list_item, null);
EditText edit = (EditText) v.findViewById(R.id.editText);
edit.setText(listString.get(position));
edit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
System.out.println("hasFocus");
} else {
System.out.println("noFocus");
}
}
});
return v;
}
我想在失去焦点时验证 editText 的值。
问题是每次我点击 editText 时,我都会得到这个 logcat :
I/System.out: hasFocus
I/System.out: noFocus
I/System.out: hasFocus
I/System.out: noFocus
I/System.out: hasFocus
I/System.out: noFocus
I/System.out: hasFocus
每次都会经过 OnFocusChangeListener 7 次。如果 noFocus 事件的监听器中有一些验证方法,则可以连续调用 3 次。
为什么有这么多电话?
我可以使用变量,保存一些状态,但这在我的情况下会有点棘手,我更喜欢尝试理解这种行为。
感谢您的阅读。 (抱歉英语不好:p)
当我离开包含我的 editTexts 的片段时,我的行为完全相同。遵循这个SO答案我能够防止
onFocusChanged
被多次调用。
我刚刚将其添加到我的布局根视图中,我不再遇到问题。
<LinearLayout
...
android:focusable="true"
android:focusableInTouchMode="true"
...
>
我不知道为什么这会起作用,但我很高兴它起作用了。如果有人知道为什么这有效,请随时对此答案发表评论。