Eu tenho um campo EditText e defino um OnFocusChangeListener para ele. Quando ele perde o foco, um método é chamado, que verifica o valor do EditText com um no banco de dados. Se o valor de retorno do método for verdadeiro, um brinde é mostrado e o foco deve voltar ao EditText novamente. O foco sempre deve voltar ao EditText e o teclado deve aparecer, até que o valor de retorno do método seja falso.
EDIT: Acho que ainda não esclareci meu problema real: nenhum outro item na tela deve ser capaz de editar, até que o valor do EditText seja editado em um valor, o que torna o método "checkLiganame (liganame) " retorna falso. Somente o campo EditText deve ser editável.
Aqui está o meu código (que não funciona para mim):
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();
}
}
e o método:
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;
}
Esse código leva ao seguinte resultado: Depois que o EditText perdeu o foco, o foco volta para o EditText, mas não consigo mais editar o texto.
EDIT2: Mudei meu código. Cenário:
Clico no primeiro EditText e coloco uma String, que já está no banco de dados. A torrada está aparecendo. Agora não posso mais editar minha String. Clico em "Avançar" no teclado e o foco permanece no primeiro EditText. Eu tento editar minha String, mas nada acontece. Em vez disso, minha nova String está aparecendo no segundo EditText. Clico na seta para trás do meu dispositivo e clico novamente no primeiro e no segundo EditText -> nenhum teclado está sendo exibido.
Aqui está o meu novo código:
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();
}
}
}
fonte
Respostas:
Basta colocar esta linha no seu
onCreate()
Funciona para mim, espero que ajude
fonte
Solicitar foco não é suficiente para mostrar o teclado.
Para obter foco e mostrar o teclado, você escreveria algo como isto:
EDIT: Adicionando informações extras para a resposta após o método checkLiganame foi adicionado.
No método checkLiganame, você verifica se o cursor é nulo. O cursor sempre retornará um objeto, portanto, a verificação de nulo não faz nada. No entanto, o problema está na linha
db.close();
Quando você fecha a conexão com o banco de dados, ele
Cursor
se torna inválido e provavelmente é anulado.Portanto, feche o banco de dados depois de buscar o valor.
Em vez de verificar se o cursor está nulo, verifique se o número de linhas retornadas é maior que 0: if (cursor.getCount ()> 0) e, em seguida, defina seu booleano como true.
EDIT2: Então, aqui estão alguns códigos de como fazê-lo funcionar. EDIT3: Desculpe código errado eu adicionei ...; S
Primeiro, você precisa limpar o foco se outro
EditText
conseguir o foco. Isso pode ser feito commyEditText.clearFocus()
. Então, no seu onFocusChangeListener, você realmente não deve se importar se primeiroEditText
tem foco ou não, para que o onFocusChangeListener possa ser algo como isto:Substitua a primeira verificação
if(liganame.length() == 0)
pela sua própria verificação e, em seguida, deve funcionar. Observe que todas as visualizações EditText devem ter definidoonFocusChangeListener
o mesmo ouvinte como eu fiz no exemplo.fonte
O código do Darwind não mostrou o teclado.
Isso funciona para mim:
caso o teclado não esteja aparecendo, tente forçar:
fonte
Isso muda o foco do EditText quando o botão é clicado:
fonte
Isso funciona de mim:
Esconder:
fonte
Isto é o que funcionou para mim, define o foco e mostra o teclado também
fonte
setFocusable
requer API 26. TambémsetFocusableInTouchMode
não era necessário no meu caso.Se criarmos um EditText dinamicamente, teremos que definir o requestFocus () conforme indicado abaixo.
Se já declaramos o componente na visualização xml, temos que encontrá-lo e podemos focar conforme indicado abaixo.
Ele define o foco apenas para o componente EditText correspondente.
fonte
fonte
fonte
fonte
Você poderia fazer isso com uma única linha:
fonte
Para o Xamarin.Android, criei esta extensão.
fonte
tente este código no manifesto
fonte
Se você tentar ligar
requestFocus()
antes que o layout seja inflado, ele retornará falso. Esse código é executado após o layout ser inflado. Você não precisa de um atraso de 200 ms, como mencionado acima .fonte
Não sei se você já encontrou uma solução, mas para o seu problema de edição depois de solicitar o foco novamente:
Você já tentou chamar o método
selectAll()
ousetSelection(0)
(se estiver vazio) no seu edittext1?Informe-me se isso ajudar, portanto, editarei minha resposta para uma solução completa.
fonte
fonte
Se o uso de
requestFocus()
inonCreate()
introduz o problema do teclado não aparecer na torneira, useBindingAdapter
um SingleLiveEvent e solicite o foco dentro dele.Veja como fazê-lo:
BindingAdapter
fonte
Minha resposta aqui
Enquanto leio o documento oficial, acho que essa é a melhor resposta, basta passar o parâmetro View para o seu EditText, mas o showSoftKeyboard parece não estar funcionando no modo paisagem
fonte