Ich habe ein EditText-Feld und setze einen OnFocusChangeListener dafür. Wenn der Fokus verloren gegangen ist, wird eine Methode aufgerufen, die den Wert des EditText mit einem in der Datenbank überprüft. Wenn der Rückgabewert der Methode wahr ist, wird ein Toast angezeigt und der Fokus sollte wieder auf den EditText gerichtet sein. Der Fokus sollte immer wieder auf den EditText gerichtet sein und die Tastatur sollte angezeigt werden, bis der Rückgabewert der Methode falsch ist.
BEARBEITEN: Ich denke, ich habe mein eigentliches Problem noch nicht klargestellt: Kein anderes Element auf dem Bildschirm sollte bearbeitet werden können, bis der Wert des EditText zu einem Wert bearbeitet wird, wodurch die Methode "checkLiganame (liganame)" erstellt wird. " falsch zurückgeben. Nur das EditText-Feld sollte bearbeitet werden können.
Hier ist mein Code (der bei mir nicht funktioniert):
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();
}
}
und die Methode:
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;
}
Dieser Code führt zu folgendem Ergebnis: Nachdem der EditText den Fokus verloren hat, springt der Fokus zurück zu EditText, aber ich kann den Text nicht mehr bearbeiten.
EDIT2: Mein Code wurde geändert. Szenario:
Ich klicke auf den ersten EditText und füge einen String ein, der sich bereits in der Datenbank befindet. Der Toast zeigt. Jetzt kann ich meinen String nicht mehr bearbeiten. Ich klicke auf der Tastatur auf "Weiter" und der Fokus bleibt auf dem ersten EditText. Ich versuche meinen String zu bearbeiten, aber es passiert nichts. Stattdessen wird mein neuer String im zweiten EditText angezeigt. Ich klicke auf den Zurückpfeil meines Geräts und klicke erneut auf den ersten und zweiten EditText -> keine Tastatur wird angezeigt.
Hier ist mein neuer Code:
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();
}
}
}
quelle
Antworten:
Setzen Sie einfach diese Zeile auf Ihre
onCreate()
Es funktioniert bei mir, hoffe es hilft
quelle
Das Anfordern des Fokus reicht nicht aus, um die Tastatur anzuzeigen.
Um den Fokus zu erhalten und die Tastatur zu zeigen, würden Sie ungefähr Folgendes schreiben:
BEARBEITEN: Hinzufügen zusätzlicher Informationen zur Antwort, nachdem die checkLiganame-Methode hinzugefügt wurde.
In der checkLiganame-Methode prüfen Sie, ob der Cursor null ist. Der Cursor gibt immer ein Objekt zurück, sodass die Prüfung auf Null nichts bewirkt. Das Problem liegt jedoch in der Leitung
db.close();
Wenn Sie die Datenbankverbindung schließen,
Cursor
wird die ungültig und höchstwahrscheinlich null.Schließen Sie also die Datenbank, nachdem Sie den Wert abgerufen haben.
Anstatt den Cursor auf Null zu überprüfen, sollten Sie überprüfen, ob die Anzahl der zurückgegebenen Zeilen mehr als 0 beträgt: if (cursor.getCount ()> 0) und dann Ihren Booleschen Wert auf true setzen, wenn dies der Fall ist.
EDIT2: Hier ist ein Code, wie es funktioniert. EDIT3: Entschuldigung, falscher Code, den ich hinzugefügt habe ...; S.
Zunächst müssen Sie den Fokus löschen, wenn ein anderer den
EditText
Fokus erhält. Dies kann mit gemacht werdenmyEditText.clearFocus()
. Dann sollte es Ihnen in Ihrem onFocusChangeListener eigentlich egal sein, ob Sie zuerstEditText
den Fokus haben oder nicht, sodass der onFocusChangeListener ungefähr so aussehen könnte:Ersetzen Sie den ersten Scheck
if(liganame.length() == 0)
durch Ihren eigenen Scheck, dann sollte es funktionieren. Beachten Sie, dass alle EditText-AnsichtenonFocusChangeListener
auf denselben Listener eingestellt sein sollten, wie ich es im Beispiel getan habe.quelle
Darwind-Code zeigte die Tastatur nicht an.
Das funktioniert bei mir:
Falls die Tastatur nicht angezeigt wird, versuchen Sie Folgendes zu erzwingen:
quelle
Dies ändert den Fokus des EditText, wenn auf die Schaltfläche geklickt wird:
quelle
Das funktioniert bei mir:
Verstecken:
quelle
Das hat bei mir funktioniert, setzt den Fokus und zeigt auch die Tastatur
quelle
setFocusable
erfordert API 26. AuchsetFocusableInTouchMode
wurde in meinem Fall nicht benötigt.Wenn wir einen EditText dynamisch erstellen, müssen wir den requestFocus () wie unten angegeben festlegen.
Wenn wir die Komponente bereits in der XML-Ansicht deklariert haben, müssen wir sie finden und können den Fokus wie unten angegeben festlegen.
Es wird nur der Fokus auf die entsprechende EditText-Komponente gesetzt.
quelle
quelle
quelle
quelle
Sie können dies mit einer einzigen Zeile tun:
quelle
Für Xamarin.Android habe ich diese Erweiterung erstellt.
quelle
Bitte versuchen Sie diesen Code auf Manifest
quelle
Wenn Sie versuchen aufzurufen,
requestFocus()
bevor das Layout aufgeblasen ist, wird false zurückgegeben. Dieser Code wird ausgeführt, nachdem das Layout aufgeblasen wurde. Sie benötigen keine Verzögerung von 200 ms, wie oben erwähnt .quelle
Ich weiß nicht, ob Sie bereits eine Lösung gefunden haben, aber für Ihr Bearbeitungsproblem, nachdem Sie erneut den Fokus angefordert haben:
Haben Sie versucht, die Methode
selectAll()
odersetSelection(0)
(falls emtpy) auf Ihrem edittext1 aufzurufen?Bitte lassen Sie mich wissen, ob dies hilft, damit ich meine Antwort zu einer vollständigen Lösung bearbeiten kann.
quelle
quelle
Bei der Verwendung
requestFocus()
in eineronCreate()
Einführung in der Frage der Tastatur zeigt , das nicht vom Fass, verwenden SieBindingAdapter
mit einem SingleLiveEvent und fordern Sie den Fokus im Innern , dass.So geht's:
BindingAdapter
quelle
Meine Antwort hier
Während ich das offizielle Dokument lese, denke ich, dass dies die beste Antwort ist. Übergeben Sie die Ansicht einfach an Parameter wie Ihren EditText, aber showSoftKeyboard scheint nicht im Querformat zu funktionieren
quelle