Como definir o foco em uma visualização quando um layout é criado e exibido?

90

Atualmente, tenho um layout que contém um Button, um TextViewe um EditText. Quando o layout for exibido, o foco será colocado automaticamente no EditText, o que fará com que o teclado apareça no telefone Android. Não é o que eu quero. Existe alguma maneira de definir o foco em TextViewou em nada quando um layout é exibido?

user256239
fonte

Respostas:

109

Definir o foco: a estrutura lidará com o foco móvel em resposta à entrada do usuário. Para forçar o foco em uma visualização específica, chame requestFocus ()

Mark B
fonte
17

Isso funciona:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Charles Mosndup
fonte
O que isso faz? Parece que ele está modificando algum estado de toda a atividade, e não apenas uma visão ou fragmento, então eu seria cauteloso sobre isso e não o usaria a menos que entenda todas as suas implicações.
Vaddadi Kartick de
Na verdade, eu não faria isso com base no pedido do autor da postagem original. Isso pode resolver o problema atual, mas usá-lo tem efeitos colaterais que podem causar problemas mais tarde. São hacks como esse que chegam às bases do código que fazem com que outros hacks sejam adicionados posteriormente para negar o hack original ... o ciclo vicioso continua ... e as pessoas se perguntam por que o código se torna impossível de manter. Sim, você adivinhou ... Eu trabalho com outras pessoas que fazem coisas assim e isso torna minha vida muito difícil.
dell116
6

Você deve adicionar isto:

android:focusableInTouchMode="true"
arif jusoh
fonte
6

Conjunto

 android:focusable="true"

na tua <EditText/>

Ravi
fonte
6

Para definir o foco, atrase requestFocus () usando um Handler.

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}
Dan McNerthney
fonte
5

Você pode tentar apenas ocultar o teclado. Algo assim:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Abeljus
fonte
3

Experimentar

comp.requestFocusInWindow();
JARC
fonte
3

Defina essas linhas OnResumetambém e certifique-se de que focusableInTouchesteja definido como verdadeiro enquanto inicializa seus controles

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();
Pawan Maheshwari
fonte
3

para mudar o foco, torne textView em xml focalizável

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

e em java na criação

textView.requestFocus();

ou simplesmente esconda o teclado

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}
Mina Shaker
fonte
android: focusable = "true" e textView.requestFocus (); trabalhou para mim. Obrigado!
Werner
2

Nenhuma das respostas acima funciona para mim. A única (digamos) solução tem sido alterar o primeiro TextView em um EditText desativado que recebe o foco e, em seguida, adiciona

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

no retorno de chamada onCreate para evitar que o teclado seja mostrado. Agora, meu primeiro EditText se parece com um TextView, mas pode obter o foco inicial, finalmente.

Lorenzoff
fonte
2

A última sugestão é a solução correta. Apenas para repetir, primeiro defina android:focusable="true"no xmlarquivo de layout e, requestFocus()em seguida, na visualização do seu código.

Reza Nezami
fonte
1

acho que uma visualização de texto não pode ser focalizada. Tente definir o foco em um botão, por exemplo, ou definir a propriedade focusable como true.

lapakrette
fonte
1

você pode adicionar um texto de edição de tamanho "0 dip" como o primeiro controle em seu xml, então, isso terá o foco na renderização. (certifique-se de que pode ser focalizado e tudo ...)

con_9
fonte
1

Você pode começar adicionando android:windowSoftInputModeà sua atividade no AndroidManifest.xmlarquivo.

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

Isso fará com que o teclado não apareça, mas EditTextainda terá o foco. Para resolver isso, você pode definir android:focusableInTouchmodee android:focusablepara truea sua visualização raiz.

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

O código acima garantirá que RelativeLayoutestá obtendo foco em vez deEditText

Uilque Messias
fonte
0

O foco é para selecionar os componentes da IU quando você está usando algo além do toque (ou seja, um d-pad, um teclado, etc.). Qualquer visualização pode receber foco, embora alguns não sejam focalizáveis ​​por padrão. (Você pode tornar uma visualização focalizável setFocusable(true)e forçá-la a ser focalizada requestFocus().)

No entanto, é importante observar que, quando você está no modo de toque, o foco é desativado . Portanto, se você estiver usando os dedos, alterar o foco programaticamente não fará nada. A exceção é para visualizações que recebem entrada de um editor de entrada. Um EditTexté um exemplo. Para esta situação especial, setFocusableInTouchMode(true)é usado para permitir que o teclado virtual saiba para onde enviar a entrada. Um EditTexttem essa configuração por padrão. O teclado virtual aparecerá automaticamente.

Se você não quiser que o teclado virtual apareça automaticamente, pode suprimi-lo temporariamente, conforme observou @abeljus:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

Quando um usuário clica no EditText, ele ainda deve mostrar o teclado.

Leitura adicional:

Suragch
fonte
Esta resposta está errada? Nenhum comentário foi deixado com o voto negativo.
Suragch