Mam pole EditText i ustawiam dla niego OnFocusChangeListener. Po utracie fokusu wywoływana jest metoda, która sprawdza wartość EditText z wartością w bazie danych. Jeśli wartość zwracana metody to true, wyświetlany jest toast, a fokus powinien ponownie wrócić do EditText. Fokus powinien zawsze wracać do EditText, a klawiatura powinna się wyświetlać, dopóki wartość zwracana metody nie będzie false.
EDYCJA: Myślę, że nie wyjaśniłem jeszcze swojego prawdziwego problemu: żaden inny element na ekranie nie powinien być w stanie edytować, dopóki wartość EditText nie zostanie zmieniona na wartość, co powoduje, że metoda „checkLiganame (liganame) "return false. Tylko pole EditText-Field powinno być edytowalne.
oto mój kod (który nie działa dla mnie):
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();
}
}
i metoda:
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;
}
Ten kod prowadzi do następującego wyniku: Po utracie fokusu EditText fokus wraca do EditText, ale nie mogę już edytować tekstu.
EDIT2: Zmieniono mój kod. Scenariusz:
Klikam na pierwszy EditText i umieszczam w nim String, który jest już w bazie danych. Toast się pokazuje. Teraz nie mogę już edytować mojego ciągu. Klikam „dalej” na klawiaturze, a fokus pozostaje na pierwszym EditText. Próbuję edytować mój ciąg, ale nic się nie dzieje. Zamiast tego mój nowy ciąg jest wyświetlany w drugim EditText. Klikam strzałkę wstecz na moim urządzeniu i ponownie klikam pierwszy i drugi EditText -> żadna klawiatura nie jest wyświetlana.
Oto mój nowy kod:
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();
}
}
}
źródło
Odpowiedzi:
Po prostu umieść tę linię na swoim
onCreate()
To działa dla mnie, mam nadzieję, że pomaga
źródło
Żądanie fokusu nie wystarczy, aby wyświetlić klawiaturę.
Aby się skupić i pokazać klawiaturę, napiszesz coś takiego:
EDYCJA: Dodanie dodatkowych informacji do odpowiedzi po dodaniu metody checkLiganame.
W metodzie checkLiganame sprawdzasz, czy kursor jest pusty. Kursor zawsze zwraca obiekt, więc sprawdzenie wartości null nic nie robi. Jednak problem jest w porządku
db.close();
Kiedy
Cursor
zamykasz połączenie z bazą danych, staje się ono nieważne i najprawdopodobniej jest puste.Więc zamknij bazę danych po pobraniu wartości.
Zamiast sprawdzać, czy kursor nie ma wartości null, powinieneś sprawdzić, czy liczba zwracanych wierszy jest większa niż 0: if (cursor.getCount ()> 0), a następnie ustawić wartość logiczną na true, jeśli tak.
EDIT2: Oto kod pokazujący, jak to działa. EDIT3: Przepraszam, zły kod dodałem ...; S.
Po pierwsze, musisz wyraźnie skupić się, jeśli ktoś
EditText
się skupi. Można to zrobić za pomocąmyEditText.clearFocus()
. Następnie w swoim onFocusChangeListener nie powinieneś przejmować się tym, czy najpierwEditText
ma fokus, czy nie, więc onFocusChangeListener może wyglądać mniej więcej tak:Zastąp pierwszy czek
if(liganame.length() == 0)
własnym czekiem, a następnie powinien działać. Zwróć uwagę, że wszystkie widoki EditText powinny mieć ustawionyonFocusChangeListener
ten sam odbiornik, co w przykładzie.źródło
Kod Darwind nie pokazał klawiatury.
To działa dla mnie:
jeśli klawiatura się nie wyświetla, spróbuj wymusić:
źródło
Zmienia to punkt skupienia EditText po kliknięciu przycisku:
źródło
To działa ode mnie:
Ukryć:
źródło
To działa u mnie, ustawia ostrość i pokazuje również klawiaturę
źródło
setFocusable
wymaga API 26. WsetFocusableInTouchMode
moim przypadku też nie było potrzebne.Jeśli dynamicznie tworzymy EditText, musimy ustawić requestFocus () jak podano poniżej.
Jeśli już zadeklarowaliśmy komponent w widoku xml, musimy go znaleźć i możemy skupić się, jak podano poniżej.
Skupia się tylko na odpowiednim składniku EditText.
źródło
źródło
źródło
źródło
Możesz to zrobić za pomocą jednej linii:
źródło
Dla Xamarin.Android stworzyłem to rozszerzenie.
źródło
wypróbuj ten kod w manifeście
źródło
Jeśli spróbujesz wywołać,
requestFocus()
zanim układ zostanie zawyżony, zwróci wartość false. Ten kod jest uruchamiany po zawyżeniu układu. Nie potrzebujesz 200 ms opóźnienia, jak wspomniano powyżej .źródło
Nie wiem, czy już znalazłeś rozwiązanie, ale w przypadku problemu z edycją po ponownym zażądaniu fokusu:
Czy próbowałeś wywołać metodę
selectAll()
lubsetSelection(0)
(jeśli jest puste) na swoim edytorze edittext1?Daj mi znać, jeśli to pomoże, więc zmodyfikuję moją odpowiedź na kompletne rozwiązanie.
źródło
źródło
W przypadku korzystania
requestFocus()
zonCreate()
wprowadza problem z klawiatury nie pokazuje w sposób ciągły, korzystająBindingAdapter
z użyciem SingleLiveEvent i poprosić ostrość wewnątrz tego.Oto jak to zrobić:
BindingAdapter
źródło
Moja odpowiedź tutaj
Jak czytałem w oficjalnym dokumencie, myślę, że to najlepsza odpowiedź, po prostu przekaż View do parametru, takiego jak Twój EditText, ale showSoftKeyboard wydaje się nie działać w krajobrazie
źródło