Definir o foco no EditText

177

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();
        }
    }
}
erdalprinz
fonte
Se o abaixo respostas são ajudou você, por favor, aceite uma das respostas
Akshatha Srinivas

Respostas:

276

Basta colocar esta linha no seu onCreate()

editText.requestFocus();

Funciona para mim, espero que ajude

ralphgabb
fonte
163

Solicitar foco não é suficiente para mostrar o teclado.

Para obter foco e mostrar o teclado, você escreveria algo como isto:

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

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 linhadb.close();

Quando você fecha a conexão com o banco de dados, ele Cursorse 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 EditTextconseguir o foco. Isso pode ser feito com myEditText.clearFocus(). Então, no seu onFocusChangeListener, você realmente não deve se importar se primeiro EditTexttem foco ou não, para que o onFocusChangeListener possa ser algo como isto:

public class MainActivity extends Activity implements OnFocusChangeListener {
    private EditText editText1, editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText1 = (EditText) findViewById(R.id.editText1);
        editText1.setOnFocusChangeListener(this);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText2.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        String liganame = editText1.getText().toString();

        if(liganame.length() == 0) {
            if(editText1.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                editText2.clearFocus();
                Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

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 definido onFocusChangeListenero mesmo ouvinte como eu fiz no exemplo.

Darwind
fonte
Obrigado até agora. Mas isso não resolve todo o meu problema. Eu editei a descrição do meu problema.
precisa saber é o seguinte
Então, o que o checkLiganame está fazendo exatamente? Por que você não pode apenas verificar se (liganame.isEmpty ()) e, se for verdadeiro, requestFocus novamente?
Darwind
1
Obrigado :-) Agora, meu método está funcionando corretamente :-) mas meu principal problema com o EditText-Field ainda não foi resolvido. Eu ainda não pode editá-lo, após o método encontrou uma fila ...
erdalprinz
Então você adicionou if (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } Dentro do ouvinte onFocusChanged?
precisa saber é o seguinte
Sim eu fiz. Em Liganame.requestFocus () ;. Clico em "next" no teclado para pular no próximo campo EditText. A torrada está aparecendo e o foco está em AMBOS os campos EditText. Mas só posso editar o segundo. O primeiro, que deveria ser o único com foco nesse caso, não é mais editável.
erdalprinz
59

O código do Darwind não mostrou o teclado.

Isso funciona para mim:

        _searchText.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);

caso o teclado não esteja aparecendo, tente forçar:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
Groco
fonte
19

Isso muda o foco do EditText quando o botão é clicado:

public class MainActivity extends Activity {
    private EditText e1,e2;
    private Button b1,b2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1=(EditText) findViewById(R.id.editText1);
        e2=(EditText) findViewById(R.id.editText2);
        e1.requestFocus();
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e1.requestFocus();

            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e2.requestFocus();
            }
        });
    }
}
Simon Chius
fonte
16

Isso funciona de mim:

public void showKeyboard(final EditText ettext){
    ettext.requestFocus();
    ettext.postDelayed(new Runnable(){
            @Override public void run(){
                InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(ettext,0);
            }
        }
        ,200);
}

Esconder:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}
Guru raj
fonte
1
Por que você precisa esperar 200 ms? é necessário ou posso mostrar imediatamente?
precisa saber é o seguinte
11

Isto é o que funcionou para mim, define o foco e mostra o teclado também

EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);
Berni Gf
fonte
1
Obrigado. setFocusablerequer API 26. Também setFocusableInTouchModenão era necessário no meu caso.
CoolMind 18/09/19
8

Se criarmos um EditText dinamicamente, teremos que definir o requestFocus () conforme indicado abaixo.

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();

Se já declaramos o componente na visualização xml, temos que encontrá-lo e podemos focar conforme indicado abaixo.

EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();

Ele define o foco apenas para o componente EditText correspondente.

Sudhakar
fonte
6
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
Barakzai
fonte
4
    Button btnClear = (Button) findViewById(R.id.btnClear);

    EditText editText1=(EditText) findViewById(R.id.editText2);
    EditText editText2=(EditText) findViewById(R.id.editText3);

    btnClear.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            editText1.setText("");
            editText2.setText("");

            editText1.requestFocus();
        }
    });
Principe
fonte
3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);

fonte
2

Você poderia fazer isso com uma única linha:

yourEditText.RequestFocusFromTouch();
daniel alexandru Ganea
fonte
Na verdade, esta é a única resposta que funcionou para mim. Simula o toque como eu queria.
Antonio Vlasic
2

Para o Xamarin.Android, criei esta extensão.

public static class ViewExtensions
{
    public static void FocusEditText(this EditText editText, Activity activity)
    {
        if (editText.RequestFocus())
        {
            InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
            imm.ShowSoftInput(editText, ShowFlags.Implicit);
        }
    }
}
c.lamont.dev
fonte
2

tente este código no manifesto

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>
Felix Cruz
fonte
2

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 .

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})
Mücahit Şenol
fonte
1

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()ou setSelection(0)(se estiver vazio) no seu edittext1?

Informe-me se isso ajudar, portanto, editarei minha resposta para uma solução completa.

Indiscutível
fonte
1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 
user5176384
fonte
0

Se o uso de requestFocus()in onCreate()introduz o problema do teclado não aparecer na torneira, use BindingAdapterum SingleLiveEvent e solicite o foco dentro dele.

Veja como fazê-lo:

BindingAdapter

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}
Yogesh Umesh Vaity
fonte
0

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

private fun showSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

private fun closeSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}
Thành Thỏ
fonte