我正在尝试创建ListView
项的CursorAdapter
(具有自定义EditText
),以使EditTexts
最初显示为不可编辑,并在长按时变为可编辑。然后,用户将编辑EditText
内容,而EditText
将在失去焦点时将更改保存到db。但是,我遇到了一个非常讨厌的行为,无法执行此操作。
1)我在XML中将EditTexts
设置为android:focusable="false"
和android:focusableInTouchMode="false"
。
2)我在我的OnItemLongClickListener
中创建了一个ListActivity
,它可以执行以下操作:
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
{
Log.d("NLAc", "longClick called");
EditText et = (EditText) view.findViewById(R.id.etFolderName);
et.setFocusable(true);
et.setFocusableInTouchMode(true);
return true;
}
3)当我在适配器中创建视图时,将附加以下焦点更改侦听器:
public void onFocusChange(View v, boolean hasFocus)
{
if (hasFocus)
{
EditText et = (EditText)v;
Log.d(TAG, "hasFocus true called " + et.getText());
et.setText("focused");
et.setSelection(et.length());
}
else
{
EditText et = (EditText)v;
Log.d(TAG, "hasFocus false called " + et.getText());
et.setText("unfocused");
et.setFocusableInTouchMode(false);
//TODO Save to DB
}
}
发生的事情是,当我长时间单击第一项时,会在日志中得到以下内容:
longClick called
hasFocus true called item1
hasFocus false called focused
如果删除可设置为false(
et.setFocusableInTouchMode(false);
)的行设置,则会得到另一个hasFocus true called unfocused
。显然事情是这样的:
1)
EditText
设为可聚焦时会聚焦2)包含我的
LinearLayour
的ListView
失去焦点,并对其内部所有子项(包括我的unFocus()
)调用内部EditText
3)
EditText
失去焦点4)
EditText
成为焦点-无论出于何种原因。这种行为使我无法在失去焦点时禁用
EditText
或使其变得无法聚焦,直到我想要的是下次长按。谁能建议我可能会想念的东西?或解释这种行为?任何解决方案表示赞赏。
最佳答案
通过相互使用两个视图,我能够取得一些进步。我使用TextView进行不专心的显示,然后将其隐藏并在长时间单击时显示EditText。但这首先并没有真正帮助ListView真正怪异的焦点处理,直到我尝试了为ViewGroups定义的android:descendantFocusability
设置。将其设置为ViewGroup.FOCUS_AFTER_DESCENDANTS
后,至少对于我而言,它的行为变得更加可预测。
关于android - ListView项的焦点行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8977436/