Вопрос

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

  1. EditText
  2. ListView

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

EditText.setSelected(false);

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

Кажется, проблема связана со свойством, которое я вижу только в 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>

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

в макете 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();
}

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

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

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

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

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

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

(Отсылка от Сильвера https://stackoverflow.com/a/8639921/15695 )

и удалить

 <requestFocus />

в EditText

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

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

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

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

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

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>

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

android:windowSoftInputMode="stateAlwaysHidden"

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

Следующее работало для меня в Manifest.Писать ,

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

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

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

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

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

Источник

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

ListView.requestFocus(); 

в вашей onResume() чтобы перехватить внимание от editText.

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

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

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

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

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

Поскольку мне не нравится засорять 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;
}

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

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

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

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

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

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

Спасибо

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

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

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

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

 android:focusableInTouchMode="true"

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

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

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

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

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

Напишите этот код внутри 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>
<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"/>

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

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

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

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

Вы можете добиться этого, создав манекен 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top