android - studio - how to make edittext not focused when creating activity




Parar EditText de ganhar foco na inicialização de atividade (20)

A única solução que encontrei é:

  • Crie um LinearLayout (não sei se outros tipos de layout funcionarão)
  • Defina os atributos android:focusable="true" e android:focusableInTouchMode="true"

E o EditText não terá o foco depois de iniciar a atividade

Eu tenho uma Activity no Android, com dois elementos:

  1. EditText
  2. ListView

Quando minha Activity começa, o EditText imediatamente tem foco de entrada (cursor piscando). Não quero que nenhum controle tenha foco de entrada na inicialização. Eu tentei:

EditText.setSelected(false);

Sem sorte. Como posso convencer o EditText a não se selecionar quando a Activity começa?


A coisa mais simples que fiz foi definir o foco em outra visualização no onCreate:

    myView.setFocusableInTouchMode(true);
    myView.requestFocus();

Isso parou o teclado virtual e não havia nenhum cursor piscando no EditText.


Adicione o seguinte no método onCreate :

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

Como não gosto de poluir o XML com algo relacionado à funcionalidade, criei esse método que "transparentemente" rouba o foco da primeira visualização focalizável e, em seguida, certifica-se de remover a si mesmo quando necessário!

public static View preventInitialFocus(final Activity activity)
{
    final ViewGroup content = (ViewGroup)activity.findViewById(android.R.id.content);
    final View root = content.getChildAt(0);
    if (root == null) return null;
    final View focusDummy = new View(activity);
    final View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean b)
        {
            view.setOnFocusChangeListener(null);
            content.removeView(focusDummy);
        }
    };
    focusDummy.setFocusable(true);
    focusDummy.setFocusableInTouchMode(true);
    content.addView(focusDummy, 0, new LinearLayout.LayoutParams(0, 0));
    if (root instanceof ViewGroup)
    {
        final ViewGroup _root = (ViewGroup)root;
        for (int i = 1, children = _root.getChildCount(); i < children; i++)
        {
            final View child = _root.getChildAt(i);
            if (child.isFocusable() || child.isFocusableInTouchMode())
            {
                child.setOnFocusChangeListener(onFocusChangeListener);
                break;
            }
        }
    }
    else if (root.isFocusable() || root.isFocusableInTouchMode())
        root.setOnFocusChangeListener(onFocusChangeListener);

    return focusDummy;
}

Escreva este código dentro do arquivo Manifest na Activity onde você não deseja abrir o teclado.

android:windowSoftInputMode="stateHidden"

Arquivo de manifesto:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.projectt"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="24" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
            android:name=".Splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Login"
            **android:windowSoftInputMode="stateHidden"**
            android:label="@string/app_name" >
        </activity>

    </application>

</manifest>

Essa é a solução perfeita e mais fácil. Sempre uso isso no meu aplicativo.

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

Eu tentei várias respostas individualmente, mas o foco ainda está no EditText. Eu só consegui resolvê-lo usando duas das soluções abaixo juntas.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainLayout"
  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true" >

(Referência da Silver https://.com/a/8639921/15695 )

e remova

 <requestFocus />

no EditText

(Referência de floydaddict share )


Excelentes respostas de Luc e Mark, no entanto, falta uma boa amostra de código. Adicionar a tag android:focusableInTouchMode="true" a <LinearLayout> como o exemplo a seguir corrigirá o problema.

<!-- 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"/>

No onCreate of your Activity, basta adicionar use clearFocus() no seu elemento EditText. Por exemplo,

edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();

E se você quiser desviar o foco para outro elemento, use requestFocus() sobre isso. Por exemplo,

button = (Button) findViewById(R.id.button);
button.requestFocus();

O problema parece vir de uma propriedade que só posso ver na XML form do layout.

Certifique-se de remover esta linha no final da declaração dentro das marcas XML EditText :

<requestFocus />

Isso deve dar algo assim:

<EditText
   android:id="@+id/emailField"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="textEmailAddress">

   //<requestFocus /> /* <-- without this line */
</EditText>

O seguinte funcionou para mim no Manifest . Escrever ,

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>

O seguinte impedirá que o texto editável fique em foco quando criado, mas agarre quando tocar neles.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

Então você pode definir o foco para false no xml, mas a chave está no java, que você adiciona o seguinte ouvinte:

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

Como você está retornando como falso, ou seja, não está consumindo o evento, o comportamento de foco prosseguirá normalmente.


Resposta mais simples, basta adicionar isso no layout pai do XML.

android:focusable="true" 
android:focusableInTouchMode="true"

Se você tiver outra visão sobre sua atividade como uma ListView , também poderá fazer:

ListView.requestFocus(); 

no seu onResume() para capturar o foco do editText .

Eu sei que esta pergunta foi respondida, mas apenas fornecendo uma solução alternativa que funcionou para mim :)


Solução simples: no AndroidManifest no uso da tag Activity

android:windowSoftInputMode="stateAlwaysHidden"

Tarde, mas talvez seja útil. Crie um EditText fictício na parte superior do layout e chame myDummyEditText.requestFocus() em onCreate()

<EditText android:id="@+id/dummyEditTextFocus" 
android:layout_width="0px"
android:layout_height="0px" />

Isso parece se comportar como eu esperava. Não há necessidade de lidar com alterações de configuração, etc. Eu precisava disso para uma Activity com uma longa TextView (instruções).


Tente isso antes do seu primeiro campo editável:

<TextView  
        android:id="@+id/dummyfocus" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:text="@string/foo"
        />

----

findViewById(R.id.dummyfocus).setFocusableInTouchMode(true);
findViewById(R.id.dummyfocus).requestFocus();

Uma solução mais simples existe. Defina esses atributos no 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, o layout principal receberá o foco por padrão.

Além disso, podemos remover o foco das exibições de filhos em tempo de execução (por exemplo, depois de terminar a edição de filho) dando o foco para o layout principal novamente, assim:

findViewById(R.id.mainLayout).requestFocus();

Bom comentário de Guillaume Perrot :

android:descendantFocusability="beforeDescendants" parece ser o padrão (o valor inteiro é 0). Funciona apenas adicionando android:focusableInTouchMode="true" .

Realmente, podemos ver que os beforeDescendants definidos como padrão no método ViewGroup.initViewGroup() (Android 2.2.2). Mas não é igual a 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Graças a Guillaume.


Você pode simplesmente definir "focusable" e "focusable in touch mode" para valorizar true na primeira TextView do layout . Desta forma, quando a atividade começa, o TextView será focado, mas, devido à sua natureza, você não verá nada focado na tela e, claro, não haverá nenhum teclado exibido ...


usando as informações fornecidas por outros cartazes, usei a seguinte solução:

no layout XML

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:id="@+id/linearLayout_focus"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:layout_width="0px"
    android:layout_height="0px"/>

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
    android:id="@+id/autocomplete"
    android:layout_width="200dip"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dip"
    android:inputType="textNoSuggestions|textVisiblePassword"/>

em onCreate ()

private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;

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

    //get references to UI components
    mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
    mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}

e finalmente, em onResume ()

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}




android-edittext