Как запретить EditText фокусироваться при запуске Activity в Android

У меня есть Activity в Android с двумя элементами:

  1. EditText
  2. ListView

Когда мой Activity запускается, EditText сразу получает фокус ввода (мигающий курсор). Я не хочу, чтобы какой-либо элемент управления имел фокус ввода при запуске. Я пытался:

EditText.setSelected(false);
EditText.setFocusable(false);

Не повезло. Как мне убедить EditText не выбирать себя при запуске Activity?


person Mark    schedule 12.10.2009    source источник


Ответы (50)


Отличные ответы от Люка и Марка, однако хороший образец кода отсутствует. Добавление тегов android:focusableInTouchMode="true" и android:focusable="true" в родительский макет (например, LinearLayout или ConstraintLayout), как в следующем примере, решит проблему.

<!-- 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"/>
person Morgan Christiansson    schedule 02.11.2009
comment
Как насчет установки макета parent на android:focusableInTouchMode="true"! - person Muhammad Babar; 21.03.2014
comment
@MuhammadBabar android: focusableInTouchMode = true создать масштабирование в эмуляторе - person John Smith; 17.05.2021
comment
В моем случае добавление даже в текстовое представление также работает - person Arjun Verma; 01.06.2021

Реальная проблема в том, что вы просто не хотите, чтобы на ней фокусировался вообще? Или вы не хотите, чтобы виртуальная клавиатура отображалась в результате фокусировки на EditText? Я действительно не вижу проблемы с EditText, имеющим фокус на начале, но определенно проблема, когда окно softInput открыто, когда пользователь явно не запрашивал фокусировку на EditText (и в результате открывал клавиатуру) .

Если проблема в виртуальной клавиатуре, см. AndroidManifest.xml ‹activity› element документации.

android:windowSoftInputMode="stateHidden" - всегда скрывать при входе в активность.

или android:windowSoftInputMode="stateUnchanged" - не меняйте его (например, не показывать, если он еще не отображается, но если он был открыт при входе в действие, оставьте его открытым).

person Joe    schedule 09.04.2010
comment
тем не менее, курсор все еще находится в первом EditText в макете - даже если клавиатура не отображается - person martyglaubitz; 20.05.2014
comment
@Anderson: Ничто в ответе не подразумевало, что это помешает EditText получить фокус. На самом деле здесь четко указано, что именно так вы предотвращаете автоматическое открытие IME программной клавиатуры при фокусе; потому что более вероятно, что более серьезную проблему представляет неожиданное всплытие виртуальной клавиатуры, не самого фокуса. Если ваша проблема связана с тем, что EditText вообще фокусируется, воспользуйтесь чьим-нибудь ответом. - person Joe; 09.07.2014

Существует более простое решение. Установите эти атрибуты в родительском макете:

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

И теперь, когда действие начинается, этот основной макет по умолчанию получает фокус.

Кроме того, мы можем удалить фокус с дочерних представлений во время выполнения (например, после завершения дочернего редактирования), снова переключив фокус на основной макет, например:

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

Хороший комментарий от Гийома Перро:

android:descendantFocusability="beforeDescendants", по-видимому, используется по умолчанию (целочисленное значение равно 0). Работает просто добавлением android:focusableInTouchMode="true".

Действительно, мы видим, что beforeDescendants установлен по умолчанию в методе ViewGroup.initViewGroup() (Android 2.2.2). Но не равно 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Спасибо Гийому.

person Silver    schedule 26.12.2011

Единственное решение, которое я нашел:

  • Создайте LinearLayout (я не знаю, будут ли Работа)
  • Установите атрибуты android:focusable="true" и android:focusableInTouchMode="true"

И EditText не получит фокус после начала действия

person Luc    schedule 23.10.2009

Проблема, похоже, связана со свойством, которое я вижу только в XML form макета.

Обязательно удалите эту строку в конце объявления в тегах EditText XML:

<requestFocus />

Это должно дать что-то вроде этого:

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

   //<requestFocus /> /* <-- without this line */
</EditText>
person floydaddict    schedule 13.03.2012

Используя информацию, предоставленную другими плакатами, я применил следующее решение:

в макете 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"/>

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

и, наконец, в onResume ()

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

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

Попробуйте clearFocus () вместо setSelected(false). Каждое представление в Android имеет как фокусируемость, так и возможность выбора, и я думаю, что вы хотите просто убрать фокус.

person Eric Mill    schedule 12.10.2009
comment
Звучит многообещающе, но в какой момент жизненного цикла Activity его следует вызывать? Если я вызову его в onCreate (), EditText все еще будет в фокусе. Следует ли его вызывать в onResume () или в другом месте? Спасибо! - person Mark; 13.10.2009
comment
Я объединил принятый ответ с этим ответом. Я позвонил myEditText.clearFocus(); myDummyLinearLayout.requestFocus(); в onResume Действия. Это гарантировало, что EditText не удерживал фокус при повороте телефона. - person teedyay; 15.10.2010

Следующие элементы перестанут фокусироваться на edittext при создании, но захватят его, когда вы к ним прикоснетесь.

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

Итак, вы устанавливаете focusable на false в xml, но ключ находится в java, к которому вы добавляете следующий слушатель:

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

Поскольку вы возвращаете false, то есть не используете событие, поведение фокусировки будет продолжаться как обычно.

person MinceMan    schedule 15.06.2012
comment
Но это никогда не будет фокусироваться в будущем, как просто остановить фокус только для начального (начала активности) ?? - person Jayesh; 08.03.2013
comment
OnTouchListener вызывается перед другими сенсорными действиями. Таким образом, при включении фокусировки при касании стандартная фокусировка происходит при первом прикосновении. Подойдет клавиатура и все. - person MinceMan; 09.03.2013

Я пробовал несколько ответов по отдельности, но основное внимание по-прежнему уделяется EditText. Мне удалось решить эту проблему только с помощью двух решений, приведенных ниже.

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

(Ссылка из Silver https://stackoverflow.com/a/8639921/15695)

и удалить

 <requestFocus />

в EditText

(Ссылка из floydaddict https://stackoverflow.com/a/9681809)

person Lee Yi Hong    schedule 28.11.2012
comment
Мне пришлось добавить edittext.clearFocus () в дополнение к вышесказанному, чтобы он заработал :) - person Nav; 09.09.2014

Поздний, но самый простой ответ, просто добавьте это в родительский макет XML.

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

Голосуйте за, если это вам помогло! Удачного кодирования :)

person Rishabh Saxena    schedule 18.04.2018
comment
отлично работал у меня. еще одно замечание: не добавляйте эти строки для прокрутки. Он не будет работать в режиме прокрутки. Зато отлично работал с линейной раскладкой. - person Karthic Srinivasan; 29.12.2018

Ни одно из этих решений не помогло мне. Я исправил автофокус следующим образом:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>
person rallat    schedule 30.11.2011
comment
android: windowSoftInputMode = adjustPan для любого действия в манифесте Android - person rallat; 07.06.2012

Простое решение: в теге AndroidManifest в Activity используйте

android:windowSoftInputMode="stateAlwaysHidden"
person Sergey Sheleg    schedule 17.03.2014
comment
Собственно говоря, это не решает вопроса. OP сказал: Я не хочу, чтобы какой-либо элемент управления имел фокус ввода при запуске. Ваше решение скрывает только клавиатуру, есть небольшая разница. - person katzenhut; 04.09.2014
comment
@katzenhut Ага, вот и моя проблема с этим ответом. Сосредоточение внимания на моем edittext открывает действие PlaceAutoComplete, поэтому этот ответ неполный - person Zach; 15.01.2017
comment
Этот ответ был бы полным, если бы вопрос был следующим: как я всегда могу гарантировать, что в моей деятельности никогда не отображается клавиатура. Который не. - person Martin Marconcini; 21.03.2018

Вы можете просто установить для "focusable" и "focusable in touch mode" значение true в первом TextView из layout. Таким образом, при запуске действия TextView будет сфокусирован, но по своей природе вы не увидите ничего сфокусированного на экране и, конечно же, не будет отображаться клавиатура ...

person Zeus    schedule 06.11.2011

В Manifest у меня работало следующее. Напишите ,

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
person Babar Sanah    schedule 08.04.2014
comment
Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние focus = true. - person A. Rager; 01.11.2016

Мне нужно было программно очистить фокус со всех областей. Я просто добавил следующие два утверждения к своему основному определению макета.

myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);

Вот и все. Решил мою проблему мгновенно. Спасибо, Сильвер, за то, что указал мне в правильном направлении.

person jakeneff    schedule 27.09.2012

Добавьте android:windowSoftInputMode="stateAlwaysHidden" в тег активности файла Manifest.xml.

Источник

person prgmrDev    schedule 24.06.2015
comment
Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние focus = true. - person A. Rager; 01.11.2016

Если у вас есть другое представление о вашей деятельности, например ListView, вы также можете:

ListView.requestFocus(); 

в вашем onResume(), чтобы захватить фокус с editText.

Я знаю, что на этот вопрос был дан ответ, но я просто предлагаю альтернативное решение, которое сработало для меня :)

person Sid    schedule 07.03.2011

Попробуйте это перед своим первым редактируемым полем:

<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();
person Jack Slater    schedule 11.06.2011

Добавьте в метод onCreate следующее:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
person Vishal Raj    schedule 21.12.2015
comment
Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние focus = true. - person A. Rager; 01.11.2016

Поскольку мне не нравится загрязнять XML чем-то, что связано с функциональностью, я создал этот метод, который «прозрачно» крадет фокус у первого фокусируемого представления, а затем обязательно удаляет себя, когда это необходимо!

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;
}
person Takhion    schedule 24.04.2013

Напишите эту строку в родительском макете ...

 android:focusableInTouchMode="true"
person Vishal Vaishnav    schedule 26.07.2017
comment
дублированный ответ - person Ricardo A.; 04.06.2019

Поздно, но может быть полезно. Создайте фиктивный EditText в верхней части макета, затем вызовите myDummyEditText.requestFocus() в onCreate()

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

Похоже, я веду себя так, как я ожидал. Нет необходимости обрабатывать изменения конфигурации и т. Д. Мне это нужно для Activity с длинным TextView (инструкциями).

person Jim    schedule 13.02.2011
comment
Почему бы просто не сделать это с самим корневым представлением? - person CJBS; 01.12.2015

Да, я сделал то же самое - создал «фиктивный» линейный макет, который получает первоначальный фокус. Кроме того, я установил идентификаторы «следующего» фокуса, чтобы пользователь больше не мог сфокусировать его после прокрутки один раз:

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

много работы, чтобы просто избавиться от фокусировки на виде ..

Спасибо

person mark    schedule 23.10.2009

Для меня на всех устройствах работало следующее:

    <!-- fake first focusable view, to allow stealing the focus to itself when clearing the focus from others -->

    <View
    android:layout_width="0px"
    android:layout_height="0px"
    android:focusable="true"
    android:focusableInTouchMode="true" />

Просто поместите это как представление перед проблемным сфокусированным представлением, и все.

person android developer    schedule 14.05.2014

Самое простое, что я сделал, - это сосредоточился на другом представлении в onCreate:

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

Это остановило появление программной клавиатуры, и в EditText не было мигания курсора.

person Lumis    schedule 03.01.2013

Это идеальное и самое простое решение, которое я всегда использую в своем приложении.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
person Community    schedule 31.03.2015
comment
Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние focus = true. - person A. Rager; 01.11.2016

Напишите этот код в Manifest файле в Activity, где вы не хотите открывать клавиатуру.

android:windowSoftInputMode="stateHidden"

Файл манифеста:

 <?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>
person Tarit Ray    schedule 22.09.2016
comment
Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние focus = true. - person A. Rager; 01.11.2016

В onCreate вашей деятельности просто добавьте use clearFocus() в свой элемент EditText. Например,

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

И если вы хотите переместить фокус на другой элемент, используйте для этого requestFocus(). Например,

button = (Button) findViewById(R.id.button);
button.requestFocus();
person Compaq LE2202x    schedule 23.05.2013

Самый простой способ скрыть клавиатуру - использовать setSoftInputMode

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

или вы можете использовать InputMethodManager и скрыть клавиатуру вот так.

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
person Sharath kumar    schedule 11.09.2017
comment
вопрос не в клавиатуре - person Ricardo A.; 04.06.2019

Я использую следующий код, чтобы не дать EditText перехватить фокус при нажатии моей кнопки.

addButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        View focused = internalWrapper.getFocusedChild();
        focused.setVisibility(GONE);
        v.requestFocus();
        addPanel();
        focused.setVisibility(VISIBLE);
    }
});

Обычно скройте текст редактирования, а затем покажите его снова. Это работает для меня, поскольку EditText не в поле зрения, поэтому не имеет значения, отображается ли он.

Вы можете попробовать спрятать и показать его по очереди, чтобы посмотреть, помогает ли это потерять фокус.

person drei01    schedule 14.02.2011

Вы можете добиться этого, создав макет EditText с шириной и высотой макета, равными 0dp, и запросив фокус на этом представлении. Добавьте следующий фрагмент кода в свой xml-макет:

<EditText
    android:id="@+id/editText0"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:hint="@string/dummy"
    android:ems="10" 
    >
     <requestFocus />
    </EditText>
person Ish    schedule 13.06.2015

Обязательно удалите строку "<requestFocus />" из тега EditText в xml.

<EditText
   android:id="@+id/input"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">

   <requestFocus /> <!-- remove this line --> 
</EditText>
person Muhammad Aamir Ali    schedule 31.05.2013

Когда ваше действие открыто, клавиатура становится видимой автоматически, что вызывает фокусировку EditText. Вы можете отключить клавиатуру, написав следующую строку в теге активности в файле manifest.xml.

 android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
person Mansuu....    schedule 16.01.2017

У вас есть редактировать текст и список. В OnStart / On Create вы должны установить фокус на представление списка: Listview.requestfocus()

person hassan mirza    schedule 09.09.2018
comment
Мне нравится этот, потому что он достаточно простой и чистый - person rgv; 05.03.2019

Это может быть достигнуто путем наследования EditText и переопределения onTouchEvent.

class NonFocusableEditText: EditText {

    constructor(context: Context): super(context)
    constructor(context: Context, attrs: AttributeSet?): super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr)

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        return if (isFocusable) super.onTouchEvent(event) else false
    }
}

Затем вы можете использовать его в макетах как обычно EditText:

<com.yourpackage.NonFocusableEditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"    
        android:hint="@string/your_hint"
        android:imeOptions="actionDone"
        android:inputType="textNoSuggestions" />
person mmBs    schedule 02.01.2019

Просто добавьте android:focusableInTouchMode="true" в родительский макет EditText, и вы избавитесь от этого неудобного поведения.

person Amir Raza    schedule 27.11.2019

пытаться

edit.setInputType(InputType.TYPE_NULL);

edit.setEnabled(false);
person Albert Oclarit    schedule 09.02.2011

EditText внутри ListView не работает должным образом. При использовании EditText лучше использовать TableLayout с автоматически генерируемыми строками.

person MSIslam    schedule 06.06.2013

Вы можете указать фокус на какой-либо другой виджет, используя фокус запроса, а также использовать код, скрывающий клавиатуру.

person Mary's    schedule 05.12.2013

У меня была такая проблема, и это было связано с моим селектором. Первым состоянием был фокус, даже несмотря на то, что мое представление было отключено, оно принимало состояние фокусировки, поскольку оно было первым, которое соответствовало и использовало его. вы можете отключить первое состояние следующим образом:

<selector xmlns:android="http://schemas.android.com/apk/res/android">


<item android:drawable="@drawable/text_field_disabled" android:state_enabled="false"/>
<item android:drawable="@drawable/text_field_focused" android:state_focused="true"/>
<item android:drawable="@drawable/text_field_normal"/>

person j2emanue    schedule 12.06.2014

Самый простой способ - добавить android:windowSoftInputMode="stateAlwaysHidden" в тег активности файла Manifest.xml.

person Karthik    schedule 24.08.2016
comment
Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние focus = true. - person A. Rager; 01.11.2016

Отключите его в onCreate ()

final KeyListener edtTxtMessageKeyListener = edtTxtMessage.getKeyListener();
edtTxtMessage.setCursorVisible(false);
edtTxtMessage.setKeyListener(null);

И, наконец, включите его в onClick () EditText

edtTxtMessage.setCursorVisible(true);
edtTxtMessage.setKeyListener(edtTxtMessageKeyListener);

Но проблема в том, что нам нужно дважды щелкнуть, чтобы запустить OnScreenKeyboard в первый раз.

@Workaround

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

Попробуйте также в onClick () :)

person Amit Yadav    schedule 26.05.2014

remove<requestFocus /> из текста редактирования в XML-файле

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

   //`<requestFocus />` /* <-- remove this tags */
</EditText>`
person Akshay Paliwal    schedule 04.02.2015
comment
Я просто использую android: focusableInTouchMode = true в родительском макете и работает для меня. - person Hermandroid; 18.02.2015

Сделайте это и сделайте свою работу!

android:focusable="true"
android:focusableInTouchMode="true" 
person Tulsi    schedule 02.01.2017
comment
дублированный ответ - person Ricardo A.; 04.06.2019

Если вы хотите скрыть клавиатуру в начале действия. Тогда упомяните

android: windowSoftInputMode = "stateHidden"

К этому действию в файле манифеста. Проблема решена.

Ваше здоровье.

person Rohit Patil    schedule 10.05.2019

Простое и надежное решение, просто переопределите этот метод:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    View v = getCurrentFocus();

    if (v != null &&
            (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) &&
            v instanceof EditText &&
            !v.getClass().getName().startsWith("android.webkit.")) {
        int scrcoords[] = new int[2];
        v.getLocationOnScreen(scrcoords);
        float x = ev.getRawX() + v.getLeft() - scrcoords[0];
        float y = ev.getRawY() + v.getTop() - scrcoords[1];

        if (x < v.getLeft() || x > v.getRight() || y < v.getTop() || y > v.getBottom())
            hideKeyboard(this);
    }
    return super.dispatchTouchEvent(ev);
}

public static void hideKeyboard(Activity activity) {
    if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
    }
}
person Jyotiprakash Das    schedule 16.09.2019

Я снимаю фокус с помощью кнопки отправки

XML файл:

<LinearLayout
...
android:id="@+id/linear_layout"
android:focusableInTouchMode="true"> // 1. make this focusableInTouchMode...
</LinearLayout>

Файл JAVA:

private LinearLayout mLinearLayout; // 2. parent layout element
private Button mButton;

mLinearLayout = findViewById(R.id.linear_layout);
mButton = findViewById(R.id.button);

mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mLinearLayout.requestFocus(); // 3. request focus

            }
        });

Надеюсь, это вам поможет :)

person Bukunmi    schedule 27.07.2019

Уже предоставлено множество рабочих ответов, но я думаю, что мы можем сделать немного лучше, используя простой метод ниже.

//set focus to input field
private fun focusHere() {
    findViewById<TextView>(R.id.input).requestFocus()
}

вместо ввода в R.id.input используйте любой другой идентификатор представления, чтобы установить фокус на это представление.

person Haris    schedule 08.12.2020
comment
Вопрос в том, чтобы потерять Фокус. - person Sayed Muhammad Idrees; 05.01.2021
comment
Вы потеряете фокус с одного вида, который вам нужен, и переключитесь на другой вид - person Haris; 01.07.2021

Вы можете настроить свой Editext так, чтобы атрибут focus был отключен, теперь это можно применить двумя способами:

  • Вы можете отключить фокусируемый как общий атрибут

  • Или вы можете отключить FocusableInTouchMode как атрибут, специфичный для этого представления в сенсорном режиме (сенсорный экран)

Атрибут focusable по умолчанию имеет значение true, если этот Editext находится наверху стека представлений в этом действии, например заголовок, он может быть сфокусирован при запуске действия.

Чтобы отключить Focusable, вы можете просто установить для него логическое значение false.

Итак, это было бы:

android:focusable="false"

Чтобы отключить FocusableInTouchMode, вы можете просто установить для его логического значения false.

Итак, это было бы:

android:focusable="false"

Вы просто находите Textview, к которому хотите применить изменения, и добавляете соответствующие фрагменты кода к их xml-спецификациям в XML-файле.

В качестве альтернативы вы можете щелкнуть Textview внутри редактора макета и найти боковую панель, отображающую все атрибуты xml для этого Textview, а затем просто прокрутить вниз до места, где объявлены Focusable и FocusableInTouchMode, и установить для них значение true или false.

person DeveloperForce    schedule 28.06.2021

добавьте строку ниже в файл манифеста, где вы упомянули свою деятельность

android:windowSoftInputMode="stateAlwaysHidden"
person Akash Suresh Dandwate    schedule 22.02.2019
comment
Это предотвратит появление клавиатуры, чего не спрашивали. - person Dan; 29.03.2019