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();
        }
    }
}

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


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.


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);

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();
            }
        });
    }
}

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);
}

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);

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.


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

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

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();
        }
    });

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

//Function Call
requestFocus(yourEditetxt);

2

Você poderia fazer isso com uma única linha:

yourEditText.RequestFocusFromTouch();

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);
        }
    }
}

2

tente este código no manifesto

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>

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)
   }
})

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.


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

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()
    }
}

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)
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.