У меня есть поле EditText и установить для него OnFocusChangeListener. Когда он потерял фокус, вызывается метод, который проверяет значение EditText с единицей в базе данных. Если возвращаемое значение метода равно true, отображается тост, и фокус должен снова вернуться к EditText. Фокус должен всегда возвращаться к EditText, и клавиатура должна отображаться, пока возвращаемое значение метода не станет ложным.
РЕДАКТИРОВАТЬ: я думаю, я еще не до конца разъяснил свою реальную проблему: ни один другой элемент на экране не может быть в состоянии редактировать, пока значение EditText не будет отредактировано до значения, что делает метод "checkLiganame (liganame)" "вернуть ложь. Только поле EditText должно быть редактируемым.
вот мой код (который не работает для меня):
final EditText Liganame = (EditText) findViewById(R.id.liganame);
Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
String liganame = Liganame.getText().toString();
if (checkLiganame(liganame)) {
Toast toast = Toast.makeText(CreateTableActivity.this,
"Dieser Liganame ist bereits vergeben",
Toast.LENGTH_SHORT);
toast.show();
Liganame.requestFocus();
}
}
и метод:
public boolean checkLiganame(String liganame) {
boolean found = false;
DatabaseHelper databaseHelper = new DatabaseHelper(this);
SQLiteDatabase db = databaseHelper.getReadableDatabase();
Cursor cursor = db.query("liga", new String[] { "liganame" },
"liganame = '" + liganame + "'", null, null, null, null);
Log.i("Liganame: ", String.valueOf(cursor));
db.close();
if (cursor != null) {
found = true;
}
return found;
}
Этот код приводит к следующему результату: после того, как EditText потерял фокус, фокус возвращается к EditText, но я больше не могу редактировать текст.
EDIT2: изменил мой код. Сценарий:
Я нажимаю на первый EditText и помещаю в него строку, которая уже есть в базе данных. Тост показывает. Теперь я больше не могу редактировать свою строку. Я нажимаю «Далее» на клавиатуре, и фокус остается на первом EditText. Я пытаюсь отредактировать свою строку, но ничего не происходит. Вместо этого моя новая строка отображается во втором EditText. Я нажимаю стрелку назад на моем устройстве и нажимаю на первый и второй EditText -> клавиатура не отображается.
Вот мой новый код:
public class CreateTableActivity extends Activity implements
OnFocusChangeListener {
private EditText Liganame, Mannschaftsanzahl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.create_league);
Liganame = (EditText) findViewById(R.id.liganame);
Liganame.setOnFocusChangeListener(this);
Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
Mannschaftsanzahl.setOnFocusChangeListener(this);
final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);
OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
ButtonClick();
}
};
save_button.setOnClickListener(mCorkyListener);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
String liganame = Liganame.getText().toString();
if (checkLiganame(liganame)) {
if (Liganame.requestFocus()) {
getWindow()
.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Mannschaftsanzahl.clearFocus();
Toast.makeText(CreateTableActivity.this,
"Dieser Liganame ist bereits vergeben",
Toast.LENGTH_SHORT).show();
}
}
}
источник
Ответы:
Просто поместите эту строку на свой
onCreate()
Это работает для меня, надеюсь, это помогает
источник
Запрашивать фокус недостаточно, чтобы показать клавиатуру.
Чтобы сфокусироваться и показать клавиатуру, вы должны написать что-то вроде этого:
РЕДАКТИРОВАТЬ: Добавление дополнительной информации к ответу после добавления метода checkLiganame.
В методе checkLiganame вы проверяете, является ли курсор нулевым. Курсор всегда будет возвращать объект, поэтому проверка на нулевое значение ничего не делает. Однако проблема в линии
db.close();
Когда вы закрываете соединение с базой данных, оно
Cursor
становится недействительным и, скорее всего, обнуляется.Поэтому закройте базу данных после того, как вы получили значение.
Вместо того, чтобы проверять курсор на нулевое значение, вы должны проверить, больше ли число возвращаемых строк, чем 0: if (cursor.getCount ()> 0), а затем установить логическое значение true, если это так.
РЕДАКТИРОВАТЬ 2: Итак, вот некоторый код для того, как заставить это работать. РЕДАКТИРОВАТЬ3: Извините неправильный код, который я добавил ...; S
Прежде всего, вам нужно очистить фокус, если другой
EditText
получает фокус. Это можно сделать с помощьюmyEditText.clearFocus()
. Тогда в вашем onFocusChangeListener вы не должны заботиться о том,EditText
имеет ли сначала фокус или нет, поэтому onFocusChangeListener может выглядеть примерно так:Замените первую проверку
if(liganame.length() == 0)
своей собственной проверкой, затем она должна работать. Обратите внимание, что все представления EditText должны были устанавливать ихonFocusChangeListener
для одного и того же слушателя, как я делал в примере.источник
Код Дарвинда не показывал клавиатуру.
Это работает для меня:
если клавиатура не отображается, попробуйте принудительно:
источник
Это изменяет фокус EditText при нажатии кнопки:
источник
Это работает от меня:
Прятаться:
источник
Это то, что работает для меня, устанавливает фокус и показывает клавиатуру также
источник
setFocusable
требует API 26. ТакжеsetFocusableInTouchMode
не было необходимости в моем случае.Если мы создаем EditText динамически, тогда мы должны установить requestFocus (), как указано ниже.
Если мы уже объявили компонент в представлении xml, мы должны найти его и сосредоточиться, как показано ниже.
Он устанавливает только фокус на соответствующий компонент EditText.
источник
источник
источник
источник
Вы можете сделать это одной строкой:
источник
Для Xamarin.Android я создал это расширение.
источник
пожалуйста, попробуйте этот код в манифесте
источник
Если вы попытаетесь позвонить
requestFocus()
до того, как разметка будет раздута, он вернет false Этот код запускается после раздувания макета. Вам не нужно 200 мс задержки, как указано выше .источник
Я не знаю, если вы уже нашли решение, но для вашей проблемы с редактированием после запроса фокуса снова:
Вы пытались вызвать метод
selectAll()
илиsetSelection(0)
(если есть emtpy) в вашем edittext1?Пожалуйста, дайте мне знать, если это поможет, поэтому я отредактирую свой ответ для полного решения.
источник
источник
Если при использовании команды
requestFocus()
inonCreate()
вводится проблема, когда клавиатура не отображается при нажатии,BindingAdapter
используйте функцию SingleLiveEvent и запросите фокус внутри нее .Вот как это сделать:
BindingAdapter
источник
Мой ответ здесь
Когда я читаю на официальном документе, я думаю, что это лучший ответ, просто передайте View в параметр, такой как ваш EditText, но showSoftKeyboard, похоже, не работает в альбомной ориентации.
источник