我有在每一行的工作一个EditText一个ListView。
我需要选择点击的EditText无需清除或将光标移动到写号这段文字。
在第一部作品使用selectAllonfocus。 然而,滚动列表视图之后,EditText上变得疯狂和选择工作不正常。
如果我在听者的onfocus执行全选,则当触摸被取得的文本菜单(选择字,全选,等)被示出,而不是选择。
如果有人可以提供帮助。
谢谢。
我有在每一行的工作一个EditText一个ListView。
我需要选择点击的EditText无需清除或将光标移动到写号这段文字。
在第一部作品使用selectAllonfocus。 然而,滚动列表视图之后,EditText上变得疯狂和选择工作不正常。
如果我在听者的onfocus执行全选,则当触摸被取得的文本菜单(选择字,全选,等)被示出,而不是选择。
如果有人可以提供帮助。
谢谢。
我不知道它是什么,你正在尝试做的。 也许它会帮助,如果你可以发布您的某些相关的源代码...
但是,它会在你开始滚动疯狂的事实让我的事情你没有正确处理convertView在适配器getView()方法。
如果您在滚动后有问题,这是一个的搞乱您的观点回收。 你基本上需要建立一个数组滚动时它们不会搞砸举行EditTexts的内容,这样。 你没有说什么支持你的清单,但我有一个列表与包含edittexts,这里是我如何处理它(从游标,但你能适应它的ArrayAdapter):
public class CursorAdapter_EditText extends SimpleCursorAdapter {
private static Cursor c;
private Context context;
public static String[] quantity;
private int layout;
public CursorAdapter_EditText(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
CursorAdapter_EditText.c = c;
this.context = context;
this.layout = layout;
initializeQuantity(); // Call method to initialize array to hold edittext info
}
public static void initializeQuantity() {
quantity = new String[c.getCount()]; // Initialize array to proper # of items
int i = 0;
while (i < c.getCount()) {
quantity[i] = ""; // set all EditTexts to empty
i++;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = View.inflate(context, layout, null);
final int pos = position;
View row = convertView;
c.moveToPosition(position);
TextView name = (TextView) row.findViewById(R.id.ListItem1);
EditText qty = (EditText) row.findViewById(R.id.qty);
qty.setOnFocusChangeListener(new View.OnFocusChangeListener() { // Set so EditText will be saved to array when you leave it
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
LinearLayout parent = (LinearLayout) v.getParent();
EditText qtyTemp = (EditText) parent.findViewById(R.id.qty); // Get a reference to EditText (you could probaly use v here)
quantity[pos] = qtyTemp.getText().toString(); // Save contents of EditText to array
}
}
});
name.setText(c.getString(1));
unit.setText(c.getString(3));
qty.setText(quantity[position]);
return (row);
}
}
然后,我有一个处理该回到我的数据库这样的阵列外的按钮:
commit.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
int i = 0;
itemCursor.moveToFirst();
while (itemCursor.isAfterLast() == false) {
if (CursorAdapter_EditText.quantity[i].equals("")) {
CursorAdapter_EditText.quantity[i] = "0";
}
;
int tempQty = Integer
.parseInt(CursorAdapter_EditText.quantity[i]);
if (tempQty != 0) {
mDbHelper.createListItem(listId, itemCursor
.getInt(itemCursor
.getColumnIndex(GroceryDB.ITEM_ROWID)),
tempQty, 0);
}
i++;
itemCursor.moveToNext();
}
}
});
我处理正是通过执行以下操作同样的问题:
子类的EditText
public class TrickyEditText extends EditText { private boolean mFocused = false; private boolean mTouched = false; public TrickyEditText(Context context) { super(context); } public TrickyEditText(Context context, AttributeSet attrs) { super(context, attrs); } public TrickyEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public TrickyEditText(Context context, AttributeSet attrs, int defStyleAttr, int style) { super(context, attrs, defStyleAttr, style); } @Override public boolean didTouchFocusSelect() { if (mTouched && mFocused) { return true; } else { return super.didTouchFocusSelect(); } } @Override public boolean onTouchEvent(MotionEvent event) { mTouched = true; return super.onTouchEvent(event); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { mFocused = focused; if (!focused) { mTouched = false; } super.onFocusChanged(focused, direction, previouslyFocusedRect); } }
适配器代码
public class TrickyAdapter extends ArrayAdapter { ............. @Override public View getView(int childPosition, View convertView, final ViewGroup parent) { ......... TrickyEditText et = ..... //initialize edittext et.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(final View v, boolean hasFocus) { if (hasFocus) { v.post(new Runnable() { @Override public void run() { ((EditText)v).selectAll(); } }); } } }); ......... } }
虽然它的工作非常好,这不是我很骄傲的......如果有人知道一个漂亮的解决方案,请告诉我密码!
在您的适配器的getView方法,让你的EditView中(此代码,edittxt)做:
edittxt.post(new Runnable() {
public void run() {
edittxt.requestFocusFromTouch();
edittxt.selectAll();
InputMethodManager lManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
lManager.showSoftInput(edittxt, 0);
}
});
我能说什么,我问的是,试图选择列表视图edittexts的所有文字无法正常工作。 因此,而不是选择文本,我显示了当用户选择号码或任何一个对话框。
不知道如果你还在寻找一个解决方案,但我找到了一种方法来做到这一点。 聚焦改变监听器添加到的EditText在适配器中的getView方法,并获得焦点时选择所有文本。
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
// blah blah blah
EditText edit = (EditText) view.findViewById(R.id.editTextId);
edit.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasFocus) {
if (hasFocus)
((EditText) view).selectAll();
}
});
return view;
}
我已成立windowSoftInputMode到adjustPan的活动,虽然我不认为这对此事的任何影响。
我已经在Android 2.3及4测试这和它的作品。