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

avatar
Mark
12 октября 2009 в 15:03
782852
54
3025

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

  1. EditText
  2. ListView

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

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

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

Источник

Ответы (54)

avatar
Morgan Christiansson
2 ноября 2009 в 15:49
2754

Отличные ответы от Люка и Марка. Однако хороший образец кода отсутствует. Добавление тегов 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"/>
Muhammad Babar
21 марта 2014 в 05:58
747

Как насчет установки родительского макета на android:focusableInTouchMode="true"!

John Smith
16 мая 2021 в 23:22
0

@MuhammadBabar android: focusableInTouchMode = "true" создать масштабирование в эмуляторе

Arjun Verma
1 июня 2021 в 11:39
0

В моем случае добавление даже в текстовое представление также работает

avatar
DeveloperForce
28 июня 2021 в 16:30
1

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

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

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

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

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

Итак, это будет:

android:focusable="false"

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

Итак, это будет:

android:focusable="false"

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

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

avatar
Haris
8 декабря 2020 в 17:11
1

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

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

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

Sayed Muhammad Idrees
5 января 2021 в 17:30
0

Вопрос в том, чтобы потерять Фокус.

Haris
1 июля 2021 в 03:34
0

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

avatar
Amir Raza
27 ноября 2019 в 14:29
4

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

avatar
Jyotiprakash Das
16 сентября 2019 в 12:44
1

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

@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);
    }
}
avatar
Bukunmi
27 июля 2019 в 20:06
1

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

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

            }
        });

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

avatar
Rohit Patil
10 мая 2019 в 19:07
1

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

android: windowSoftInputMode = "stateHidden"

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

Ура.

avatar
Akash Suresh Dandwate
22 февраля 2019 в 06:33
-4

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

android:windowSoftInputMode="stateAlwaysHidden"
Dan
29 марта 2019 в 15:02
2

Это предотвратит появление клавиатуры, чего не просили.

avatar
mmBs
2 января 2019 в 10:11
4

Это может быть достигнуто путем наследования 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" />
avatar
hassan mirza
9 сентября 2018 в 09:28
4

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

rgv
5 марта 2019 в 19:33
0

Мне нравится этот, потому что он достаточно простой и чистый

avatar
Rishabh Saxena
18 апреля 2018 в 06:14
69

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

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

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

Karthic Srinivasan
29 декабря 2018 в 14:24
4

отлично работал у меня. еще одно замечание: не добавляйте эти строки для прокрутки. Он не будет работать в режиме прокрутки. Зато отлично работал с линейной раскладкой.

avatar
Sharath kumar
11 сентября 2017 в 10:21
8

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

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

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

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
Ricardo A.
4 июня 2019 в 13:04
0

вопрос не в клавиатуре

avatar
Vishal Vaishnav
26 июля 2017 в 09:52
18

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

 android:focusableInTouchMode="true"
Ricardo A.
4 июня 2019 в 13:01
0

дублированный ответ

avatar
Mansuu....
16 января 2017 в 04:44
6

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

 android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
avatar
Tulsi
2 января 2017 в 11:57
1

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

android:focusable="true"
android:focusableInTouchMode="true" 
Ricardo A.
4 июня 2019 в 13:07
0

дублированный ответ

avatar
DkPathak
28 сентября 2016 в 08:19
6
View current = getCurrentFocus();

if (current != null) 
    current.clearFocus();
avatar
Tarit Ray
22 сентября 2016 в 14:04
10

Запишите этот код внутри 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>
A. Rager
1 ноября 2016 в 18:06
3

Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние «focus = true».

avatar
Karthik
24 августа 2016 в 04:07
2

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

A. Rager
1 ноября 2016 в 18:06
2

Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние «focus = true».

avatar
Vishal Raj
21 декабря 2015 в 15:33
23

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

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
A. Rager
1 ноября 2016 в 18:05
2

Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние «focus = true».

avatar
ceph3us
9 июля 2015 в 21:08
4
/** 
 * set focus to top level window
 * disposes descendant focus 
 * disposes softInput 
 * */
public static void topLevelFocus(Context context){
    if(Activity.class.isAssignableFrom(context.getClass())){
        ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
        if(tlView!=null){
            tlView.setFocusable(true);
            tlView.setFocusableInTouchMode(true);
            tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
        }
    }
}
avatar
prgmrDev
24 июня 2015 в 09:19
30

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

Источник

A. Rager
1 ноября 2016 в 18:05
1

Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние «focus = true».

avatar
Ish
13 июня 2015 в 21:50
6

Этого можно добиться, создав фиктивный элемент 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>
avatar
Mahmudul Haque Khan
21 апреля 2015 в 10:13
2
<EditText
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:id="@+id/etComments"
    android:hint="Comments.."
    android:textSize="14dp"

    android:focusable="false"

    android:textStyle="italic"/>
avatar
user4728480
31 марта 2015 в 09:27
11

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
A. Rager
1 ноября 2016 в 18:07
1

Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние «focus = true».

avatar
Akshay Paliwal
4 февраля 2015 в 06:08
1

удалите <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>`
Hermandroid
18 февраля 2015 в 16:49
1

Я просто использую android: focusableInTouchMode = "true" в родительском макете и работает для меня.

avatar
j2emanue
12 июня 2014 в 17:28
2

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

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

avatar
Amit Yadav
26 мая 2014 в 22:24
1

Отключить в 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 () :)

avatar
android developer
14 мая 2014 в 08:02
13

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

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

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

avatar
Babar Sanah
8 апреля 2014 в 11:48
38

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

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
A. Rager
1 ноября 2016 в 18:05
2

Это не снимает фокус с текстового поля: оно просто скрывает клавиатуру. Вы по-прежнему будете получать подсказку, выталкиваемую из поля, и любые селекторы состояния цвета будут отображать состояние «focus = true».

avatar
Sergey Sheleg
17 марта 2014 в 15:42
46

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

android:windowSoftInputMode="stateAlwaysHidden"
katzenhut
4 сентября 2014 в 10:04
7

Собственно говоря, это не решает вопроса. OP сказал: «Я не хочу, чтобы какой-либо элемент управления имел фокус ввода при запуске». Ваше решение скрывает только клавиатуру, есть небольшая разница.

Zach
15 января 2017 в 06:48
0

@katzenhut Ага, это моя проблема с этим ответом. Сосредоточение внимания на моем тексте редактирования открывает действие автозаполнения места, поэтому этот ответ неполный

Martin Marconcini
21 марта 2018 в 00:13
0

Этот ответ был бы полным, если бы вопрос был следующим: как я всегда могу гарантировать, что в моей деятельности никогда не отображается клавиатура. Который не.

avatar
Mary's
5 декабря 2013 в 17:56
3

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

avatar
MSIslam
6 июня 2013 в 15:23
3

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

avatar
Muhammad Aamir Ali
31 мая 2013 в 10:47
6

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

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

   <requestFocus /> <!-- remove this line --> 
</EditText>
avatar
Compaq LE2202x
23 мая 2013 в 10:42
8

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

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

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

button = (Button) findViewById(R.id.button);
button.requestFocus();
avatar
Takhion
24 апреля 2013 в 13:26
19

Поскольку я не люблю загрязнять 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;
}
avatar
Lumis
3 января 2013 в 06:57
11

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

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

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

avatar
Lee Yi Hong
28 ноября 2012 в 10:32
73

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

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

(Ссылка с сайта Silver https://coderhelper.com/a/8639921/15695)

и удалите

 <requestFocus />

в EditText

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

Nav
9 сентября 2014 в 13:12
1

Мне пришлось добавить edittext.clearFocus () в дополнение к вышесказанному, чтобы он заработал :)

avatar
jakeneff
27 сентября 2012 в 23:35
33

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

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

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

avatar
MinceMan
15 июня 2012 в 04:45
77

Следующие элементы перестанут фокусироваться на 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, то есть не используете событие, поведение фокусировки будет продолжаться как обычно.

Jayesh
8 марта 2013 в 07:46
6

Но это никогда не будет фокусироваться в будущем, как просто остановить фокус только для начального (начала активности) ??

MinceMan
9 марта 2013 в 16:36
1

OnTouchListener вызывается перед другими сенсорными действиями. Таким образом, при включении фокусировки при касании стандартная фокусировка происходит при первом прикосновении. Подойдет клавиатура и все.

avatar
floydaddict
13 марта 2012 в 09:57
94

Проблема, похоже, связана со свойством, которое я вижу только в 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>
avatar
atul
14 февраля 2012 в 04:56
12
<TextView
    android:id="@+id/TextView01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:focusable="true"
    android:focusableInTouchMode="true"
    style="@android:style/Widget.EditText"/>
avatar
Silver
26 декабря 2011 в 23:35
1189

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

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

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

avatar
rallat
30 ноября 2011 в 16:37
49

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

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>
rallat
7 июня 2012 в 08:33
2

android: windowSoftInputMode = "adjustPan" для любых действий в манифесте Android.

avatar
Zeus
6 ноября 2011 в 16:49
40

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

avatar
Jack Slater
11 июня 2011 в 21:17
24

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

<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();
avatar
Someone Somewhere
26 мая 2011 в 21:07
84

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

в макете 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();
}
avatar
Sid
7 марта 2011 в 19:37
28

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

ListView.requestFocus(); 

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

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

avatar
drei01
14 февраля 2011 в 21:32
6

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

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

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

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

avatar
Jim
13 февраля 2011 в 01:58
16

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

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

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

CJBS
1 декабря 2015 в 18:56
1

Почему бы просто не сделать это с самим корневым представлением?

avatar
Albert Oclarit
9 февраля 2011 в 18:00
3

попробуйте

edit.setInputType(InputType.TYPE_NULL);

edit.setEnabled(false);
avatar
Joe
9 апреля 2010 в 21:22
1718

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

Если проблема связана с виртуальной клавиатурой, см. Документацию AndroidManifest.xml <a ctivity> элемент.

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

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

martyglaubitz
20 мая 2014 в 08:17
26

тем не менее, курсор все еще находится в первом EditText в макете - даже если клавиатура не отображается

Joe
8 июля 2014 в 23:38
42

@Anderson: Ничто в ответе не подразумевало, что это помешает EditText получить фокус. На самом деле в нем четко указано, что это то, как вы предотвращаете автоматическое открытие программной клавиатуры IME при фокусе; потому что более вероятно, что более серьезная проблема - это неожиданное всплытие мягкой клавиатуры, а не , а не сам фокус. Если ваша проблема связана с тем, что EditText действительно имеет фокус, используйте другой ответ.

avatar
mark
23 октября 2009 в 14:23
14

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

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

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

Спасибо,

avatar
Luc
23 октября 2009 в 08:12
441

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

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

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

avatar
Eric Mill
12 октября 2009 в 19:02
82

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

Mark
12 октября 2009 в 23:36
1

Звучит многообещающе, но в какой момент жизненного цикла Activity его следует вызывать? Если я вызову его в onCreate (), EditText все еще будет в фокусе. Следует ли его вызывать в onResume () или в другом месте? Спасибо!

teedyay
14 октября 2010 в 21:02
9

Я объединил принятый ответ с этим ответом. Я позвонил по номеру myEditText.clearFocus(); myDummyLinearLayout.requestFocus(); в разделе onResume Действия. Это гарантировало, что EditText не удерживал фокус при повороте телефона.