Eu tenho uma pergunta relativamente simples. Eu tenho uma atividade com muitos EditText's neles. Quando eu abro a atividade, ela automaticamente focaliza o primeiro EditText e exibe o teclado virtual.
Como posso evitar isso?
Eu tenho uma pergunta relativamente simples. Eu tenho uma atividade com muitos EditText's neles. Quando eu abro a atividade, ela automaticamente focaliza o primeiro EditText e exibe o teclado virtual.
Como posso evitar isso?
Respostas:
Use estes atributos em sua tag de layout no arquivo XML:
android:focusable="true"
android:focusableInTouchMode="true"
Conforme relatado por outros membros em comentários, ele não funciona, ScrollView
portanto, você precisa adicionar esses atributos ao filho principal de ScrollView
.
Você pode adicionar isso à sua atividade de Manifesto do Android:
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
Tenho várias implementações descritas aqui, mas agora adicionei à propriedade AndroidManifest.xml
for my Activity
:
android:windowSoftInputMode="stateAlwaysHidden"
fragments
." stateAlwaysHidden " O teclado virtual está sempre oculto quando a janela principal da atividade tem o foco de entrada.
https://stackoverflow.com/a/11627976/5217837 Isso está quase correto:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Mas deve ser SOFT_INPUT_STATE_HIDDEN em vez de SOFT_INPUT_STATE_ALWAYS_VISIBLE
Use isso no código da sua atividade:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Tive um problema semelhante, mesmo ao alternar entre as guias, o teclado apareceu automaticamente e permaneceu ativo, com o Android 3.2.1 em um Tablet. Use o seguinte método:
public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
} else {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
}
}
No onCreate () e no onPause () da atividade para cada EditText:
setEditTextFocus (myEditText, false);
Para cada EditText um OnTouchListener:
myEditText.setOnTouchListener(new EditText.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setEditTextFocus(myEditText, true);
return false;
}
});
Para cada um EditText
em OnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
E para cada um EditText
no layout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
Provavelmente, há mais otimização de código possível.
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
Eu encontrei esta solução simples que funcionou para mim. Defina estes atributos em seu layout pai:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
E agora, quando a atividade começar, esse layout principal receberá o foco por padrão.
Além disso, podemos remover o foco das visualizações filhas em tempo de execução, dando o foco ao layout principal novamente, como este:
findViewById(R.id.mainLayout).requestFocus();
Espero que funcione para você.
esta é a solução que estou usando, não é a melhor solução, mas está funcionando bem para mim
editComment.setFocusableInTouchMode(false);
editComment.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event)
{
// TODO Auto-generated method stub
editComment.setFocusableInTouchMode(true);
editComment.requestFocus() ;
return false;
}});
Curiosamente, esta documentação https://developer.android.com/training/keyboard-input/visibility.html declara que quando uma atividade começa e o foco é dado a um campo de texto, o teclado virtual não é mostrado (e então passa para mostrar como fazer com que o teclado seja mostrado se você quiser com algum código).
No meu Samsung Galaxy S5, é assim que meu aplicativo (sem entrada de manifesto ou código específico) funciona - sem teclado virtual. No entanto, em um Lollipop AVD, um teclado virtual é mostrado - contrariando o documento fornecido acima.
Se você obtiver esse comportamento ao testar em um AVD, convém testar em um dispositivo real para ver o que acontece.
Isso tem algumas boas respostas no seguinte post: Impeça que EditText ganhe foco na inicialização da atividade . O que eu uso regularmente é o seguinte código de Morgan :
<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:nextFocusUp="@id/autotext"
android:nextFocusLeft="@id/autotext"/>
NOTA : O item fictício deve ser COLOCADO À DIREITA ANTES do elemento focalizável.
E eu acho que deve funcionar perfeitamente mesmo com ScrollView e não teve nenhum problema de acessibilidade para isso.
Isso ocorre quando seu EditText obtém o Foco automaticamente, assim como quando sua atividade começa. Portanto, uma maneira fácil e estável de corrigir isso é simplesmente definir o foco inicial para qualquer outra visualização, como um botão, etc.
Você pode fazer isso em seu layout XML, sem necessidade de código.
Resposta aceita não está funcionando para mim, é por isso que dar solução de trabalho de resposta, pode ser útil!
EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
Agora o teclado está aberto, aproveite :)
android: windowSoftInputMode = "stateHidden | AdjustResize"
Trabalhando bem
android:focusableInTouchMode="true"
Adicione a linha acima ao xml de EditText
ou TextInputLayout
que tenha o foco e esteja causando osoftInputKeyboard
apareça.
Isso resolveu o problema para nós e agora o teclado não aparece
search_edit_text = (EditText) findViewById (R.id.search_edit_text);
search_edit_text.requestFocus();
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
Isso funciona para mim, o fragmento de caras pode ter alguma sintaxe diferente. ISSO FUNCIONA PARA ATIVIDADE
Se a sua visualização tiver Editar Texto e Listar, o Teclado será aberto por padrão. Para impedir que o teclado apareça por padrão, faça o seguinte
this.listView.requestFocus();
Certifique-se de que está solicitando foco em listview depois de obter view para editText.
Por exemplo
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
Se você fizer isso, o editText terá o foco e o teclado aparecerá.