我有一个 ListView,每行都有一个 EditText 工作。
我需要在单击编辑文本时选择此文本以写入数字而不擦除或移动光标。
首先使用 selectAllonfocus 有效。但是,滚动列表视图后,EditText 变得疯狂,并且选择无法正常工作。
如果我在监听器 onFocus 中执行 selectAll,那么当进行触摸时,将显示上下文菜单(选择单词、全选等)而不是选择。
如果有人可以提供帮助。
谢谢。
我有一个 ListView,每行都有一个 EditText 工作。
我需要在单击编辑文本时选择此文本以写入数字而不擦除或移动光标。
首先使用 selectAllonfocus 有效。但是,滚动列表视图后,EditText 变得疯狂,并且选择无法正常工作。
如果我在监听器 onFocus 中执行 selectAll,那么当进行触摸时,将显示上下文菜单(选择单词、全选等)而不是选择。
如果有人可以提供帮助。
谢谢。
我不知道你想做什么。如果您可以发布一些相关的源代码,也许会有所帮助...
但是当你开始滚动时它变得疯狂的事实让我觉得你没有在你的适配器 getView() 方法中正确处理 convertView 。
如果您在滚动后遇到问题,那就是视图回收让您感到困惑。您基本上需要设置一个数组来保存 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);
}
});
关于我所问的问题,我可以说的是,尝试选择列表视图编辑文本的所有文本无法正常工作。因此,我没有选择文本,而是显示一个对话框,用户可以在其中选择数字或其他内容。
不确定您是否仍在寻找解决方案,但我找到了一种方法。在适配器的 getView 方法中为 edittext 添加焦点更改侦听器,并在收到焦点时选择所有文本。
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 上对此进行了测试,并且可以正常工作。