我正在尝试创建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)包含我的LinearLayourListView失去焦点,并对其内部所有子项(包括我的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/

10-13 04:54