我在每个项目中都有ListView
个编辑文字,我想知道如何使EditText
可编辑..如果我将android:windowSoftInputMode="adjustPan"
设置为android:windowSoftInputMode="adjustPan"
,似乎工作正常清单,但只在某些设备上。在某些设备上,软键盘覆盖了编辑文本。
另一方面,如果我没有将EditText
放入清单中,EditText
在显示软键盘后失去焦点,我必须多次触摸{{1}}选择并可以写入。
请帮我解决这个问题。
注意:我看过这篇文章:Focusable EditText inside ListView并没有任何帮助,我还有其他问题
答案 0 :(得分:4)
尝试在EditTexts
内创建ListView
的界面失败后,我可以对你说“不要!”。当你有足够的物品需要滚动你的ListView
时,你会遇到更多的麻烦,焦点会跳到这里,你必须保存你的EditText
的状态等等。似乎一般的想法是在EditText
中使用ListView
并不值得。
经过大量研究后,我可以建议以下方法帮助我:
我继承了ListView
并覆盖了layoutChildren方法,在其中我执行以下操作:
@Override
protected void layoutChildren() {
super.layoutChildren();
final EditText tv = (EditText)this.getTag();
if (tv != null)
{
Log.d("RUN", "posting delayed");
this.post(new Runnable() {
@Override
public void run() {
Log.d("RUN", "requesting focus in runnable");
tv.requestFocusFromTouch();
tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , tv.getWidth(), tv.getHeight(), 0));
tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , tv.getWidth(), tv.getHeight(), 0));
}
});
}
}
当我知道哪个EditText
应该得到关注时(我在调用我的适配器getView时知道这一点)我将此特定EditText
设置为ListView
的标记。然后ListView自行布局,我的帖子线程排队。它运行并请求焦点,但是因为在我的情况下还不够,我还生成两个MotionEvents
,它只是模拟一个水龙头。显然,这足以使软键盘出现。
这背后的原因在这里的答案中解释:
Android Actionbar Tabs and Keyboard Focus
答案 1 :(得分:0)
我为此做了一个解决方法..也许会帮助某人
public class EditTextListAdapter extends BaseAdapter {
/* notes list */
private ArrayList<SomeData> mSomeData = null;
/* layout inflater instance */
private LayoutInflater mInflater;
/* activity context */
private Context mContext;
/* ensure that this constant is greater than the maximum list size */
private static final int DEFAULT_ID_VALUE = -1;
/* used to keep the note edit text row id within the list */
private int mNoteId = DEFAULT_ID_VALUE;
/**
* EditTextListAdapter adapter class constructor
*
* @param context activity context
*/
public FirstTimesListAdapter(Context context) {
/* get a layout inflater instance */
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
/* load the data */
mSomeData = SomeData.instance().getData();
/* keep the context */
mContext = context;
}
/**
* Returns the selected item
*
* @return selected item
*/
public int getSelectedItem() {
return mSelectedItem;
}
public int getCount() {
return mSomeData.size();
}
public Object getItem(int i) {
return mSomeData.get(i);
}
public long getItemId(int i) {
return i;
}
public View getView(final int index, View recycledView, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (recycledView == null) {
/* inflate the list item */
recycledView = mInflater.inflate(R.layout.listview_item_with_edit_text, viewGroup, false);
/* get link to the view holder views */
viewHolder = new ViewHolder();
viewHolder.note = (EditText) recycledView.findViewById(R.id.first_times_note);
recycledView.setTag(viewHolder);
} else {
/* reuse the same views we load the first time */
viewHolder = (ViewHolder) recycledView.getTag();
}
/* display some notes */
viewHolder.note.setText(mSomeData.getNotes());
/* if the last id is set, the edit text from this list item was pressed */
if (mNoteId == index) {
/* make the edit text recive focus */
viewHolder.note.requestFocusFromTouch();
/* make the edit text's cursor to appear at the end of the text */
viewHolder.note.setSelection(viewHolder.note.getText().length());
/* reset the last id to default value */
mNoteId = DEFAULT_ID_VALUE;
}
/* set a touch listener on the edit text just to record the index of the edit text that was pressed */
viewHolder.note.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
/* get the index of the touched list item */
mNoteId = index;
}
return false;
}
});
return recycledView;
}
static class ViewHolder {
/* note input */
EditText note;
}
}