Остановить EditText от получения фокуса при запуске Activity
У меня есть Activity
в Android, с двумя элементами:
-
EditText
-
ListView
Когда начинается моя Activity
, EditText
сразу же имеет фокус ввода (мигающий курсор). Я не хочу, чтобы какой-либо элемент управления имел фокус ввода при запуске. Я старался:
EditText.setSelected(false);
Неудачно. Как я могу убедить EditText
не выбирать себя, когда Activity
начинается?
Ответы
Ответ 1
Отличные ответы от Люка и Марка, однако хороший пример кода отсутствует. Добавление тега android:focusableInTouchMode="true"
в <LinearLayout>
как <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"/>
Ответ 2
Является ли фактическая проблема, что вы просто не хотите, чтобы она была сосредоточена? Или вы не хотите, чтобы он отображал виртуальную клавиатуру в результате фокусировки EditText
? Я действительно не вижу проблемы с тем, что EditText
фокусируется на запуске, но определенно проблема заключается в том, что окно softInput открывается, когда пользователь явно не запрашивает фокусировку на EditText
(и откройте клавиатуру как результат).
Если это проблема виртуальной клавиатуры, см. AndroidManifest.xml
<activity> элемент.
android:windowSoftInputMode="stateHidden"
- всегда скрывать его при вводе активности.
или android:windowSoftInputMode="stateUnchanged"
- не меняйте его (например, не показывайте его, если он еще не показан, но если он был открыт при вводе активности, оставьте его открытым).
Ответ 3
Существует более простое решение. Установите эти атрибуты в родительском макете:
<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();
Хороший комментарий из Guillaume Perrot:
android:descendantFocusability="beforeDescendants"
представляется default (целочисленное значение равно 0). Он работает только путем добавления android:focusableInTouchMode="true"
.
Действительно, мы видим, что beforeDescendants
установлен по умолчанию в методе ViewGroup.initViewGroup()
(Android 2.2.2). Но не равен 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
Спасибо Гийому.
Ответ 4
Единственное решение, которое я нашел, это:
- Создайте LinearLayout (я не знаю, будут ли работать другие типы макетов)
- Задайте атрибуты
android:focusable="true"
и android:focusableInTouchMode="true"
И EditText
не будет получать фокус после начала действия
Ответ 5
Проблема возникает из свойства, которое я могу видеть только в 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>
Ответ 6
используя информацию, предоставленную другими плакатами, я использовал следующее решение:
в макете 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);
}
и, наконец, in onResume()
@Override
protected void onResume() {
super.onResume();
//do not give the editbox focus automatically when activity starts
mAutoCompleteTextView.clearFocus();
mLinearLayout.requestFocus();
}
Ответ 7
Попробуйте clearFocus() вместо setSelected(false)
. Каждое представление в Android имеет как фокусируемость, так и возможность выбора, и я думаю, что вы хотите просто очистить фокус.
Ответ 8
Следующее остановит редактирование 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, то есть не потребляете событие, поведение фокусировки будет продолжаться как обычно.
Ответ 9
Я попробовал несколько ответов по отдельности, но фокус все еще на EditText. Мне удалось решить это, используя два из нижеприведенного решения вместе.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
(Ссылка от Silver fooobar.com/questions/392/...)
и удалить
<requestFocus />
на EditText
(Ссылка от floydaddict fooobar.com/questions/392/...)
Ответ 10
Поздний, но самый простой ответ, просто добавьте это в родительский макет XML.
android:focusable="true"
android:focusableInTouchMode="true"
Upvote, если это помогло вам! Удачного кодирования :)
Ответ 11
Ни один из этих решений не работал у меня. То, как я исправляю автофокусировку, было:
<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
<intent-filter >
</intent-filter>
</activity>
Ответ 12
Простое решение:
В теге AndroidManifest
в теге Activity
используйте
android:windowSoftInputMode="stateAlwaysHidden"
Ответ 13
Вы можете просто установить "фокусируемое" и "фокусируемое в касании" значение true в первом TextView
layout
. Таким образом, при запуске активности TextView
будет сфокусирован, но по своей природе вы не увидите ничего сосредоточенного на экране и, конечно же, будет отображаться клавиатура no...
Ответ 14
Следующее работало для меня в Manifest
. Напишите,
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
Ответ 15
Мне нужно было очистить фокус от всех полей программно. Я просто добавил следующие два утверждения в мое основное определение макета.
myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);
Что это. Исправлена ошибка. Спасибо, Серебро, за то, что указал мне в правильном направлении.
Ответ 16
Добавьте android:windowSoftInputMode="stateAlwaysHidden"
в тег активности файла Manifest.xml
.
Источник
Ответ 17
Если у вас есть другой вид активности, например ListView
, вы также можете:
ListView.requestFocus();
в onResume()
, чтобы захватить фокус с editText
.
Я знаю, что на этот вопрос был дан ответ, но просто предоставил альтернативное решение, которое сработало для меня:)
Ответ 18
Добавьте следующий метод onCreate
:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Ответ 19
Попробуйте это перед первым редактируемым полем:
<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();
Ответ 20
Будучи тем, что я не люблю загрязнять 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;
}
Ответ 21
Поздно, но, возможно, полезно. Создайте фиктивный EditText в верхней части макета, затем вызовите myDummyEditText.requestFocus()
в onCreate()
<EditText android:id="@+id/dummyEditTextFocus"
android:layout_width="0px"
android:layout_height="0px" />
Это похоже на то, что я ожидаю. Не нужно обрабатывать изменения конфигурации и т.д. Мне это нужно для Activity с длинным TextView (инструкциями).
Ответ 22
Да, я сделал то же самое - создаю линейный макет 'dummy', который получает первоначальный фокус. Кроме того, я установил "следующие" идентификаторы фокуса, чтобы пользователь не мог больше сконфигурировать его после прокрутки:
<LinearLayout 'dummy'>
<EditText et>
dummy.setNextFocusDownId(et.getId());
dummy.setNextFocusUpId(et.getId());
et.setNextFocusUpId(et.getId());
много работы, чтобы избавиться от фокуса на вид.
Спасибо
Ответ 23
Для меня все, что работает на всех устройствах:
<!-- 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" />
Просто поставьте это как представление перед проблематичным сфокусированным видом и тем, что оно.
Ответ 24
Запишите эту строку в родительском макете...
android:focusableInTouchMode="true"
Ответ 25
Это идеальное и самое простое решение. Я всегда использую это в своем приложении.
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Ответ 26
Самое простое, что я сделал, это сосредоточиться на другом представлении в onCreate:
myView.setFocusableInTouchMode(true);
myView.requestFocus();
Это остановило мягкую клавиатуру, и в EditText не было курсора.
Ответ 27
<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"/>
Ответ 28
Запишите этот код внутри 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>
Ответ 29
В onCreate
вашей деятельности просто добавьте clearFocus()
в свой элемент EditText.
Например,
edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();
И если вы хотите перенаправить фокус на другой элемент, используйте requestFocus()
.
Например,
button = (Button) findViewById(R.id.button);
button.requestFocus();
Ответ 30
Обязательно удалите строку "<requestFocus />"
из тега EditText
в xml.
<EditText
android:id="@+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<requestFocus /> <!-- remove this line -->
</EditText>