Выберите текст редактирования в виде списка. Как это можно сделать? Я не могу узнать
У меня есть ListView с EditText на каждой строке работает.
Мне нужно выбрать этот текст при нажатии на текст редактирования, чтобы писать числа без стирания или перемещения курсора.
Использование selectAllonfocus сначала работает. Однако после прокрутки списка, EditText сошел с ума, и выбор не работает правильно.
Если я выполняю selectAll в слушателе onFocus, то при касании вместо выбора отображается контекстное меню (выберите слово, выберите все и т. Д.).
Если кто-то может помочь.
Благодарю.
6 ответов
Что я могу сказать о том, что я спросил, так это о том, что попытка выделить весь текст из правки списка просмотра не работает должным образом. Поэтому вместо выбора текста я показываю диалог, в котором пользователь выбирает номер или что-то еще.
Я не могу сказать, что вы пытаетесь сделать. Возможно, было бы полезно, если бы вы могли опубликовать часть вашего соответствующего исходного кода...
Но тот факт, что он начинает сходить с ума, когда вы начинаете прокручивать, заставляет меня думать, что вы неправильно обрабатывает convertView в методе getView() адаптера.
Я справился с точно такой же проблемой, выполнив следующее:
- Удалите android:downndantFocusability="beforeDescendants" из XML с помощью ListView, android:windowSoftInputMode="AdjustPan" из AndroidManifest - они не помогут.
Subclassed 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(); } }); } } }); ......... } }
Хотя он работает довольно хорошо, это не тот код, которым я горжусь... Если кто-то знает более красивое решение, пожалуйста, скажите мне!
Если у вас возникли проблемы после прокрутки, то это перебор представления, который вас запутал. В основном вам нужно настроить массив для хранения содержимого 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();
}
}
});
В методе 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 вашего адаптера и выделите весь текст, когда фокус получен.
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, чтобы настроить Pan для активности, хотя я не думаю, что это имеет какое-либо отношение к этому вопросу.
Я проверил это на Android 2.3 и 4, и это работает.