Остановить EditText от получения фокуса при запуске активности
у меня есть Activity в Android, с двумя элементами:
EditText
ListView
когда моя Activity начинается с EditText сразу имеет фокус ввода (мигающий курсор). Я не хочу, чтобы какой-либо элемент управления имел фокус ввода при запуске. Я попробовал:
EditText.setSelected(false);
не повезло. Как я могу убедить EditText чтобы не выбрать себя, когда Activity начинается?
30 ответов:
отличные ответы от люка и Марка, однако хороший пример кода отсутствует. Добавление тега
android:focusableInTouchMode="true"to<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имея фокус на start, но это определенно проблема, чтобы открыть окно 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;спасибо Гийом.
единственное решение, которое я нашел:
- создать LinearLayout (Я не знаю, будут ли работать другие виды макета)
- набор атрибутов
android:focusable="true"иandroid:focusableInTouchMode="true"и
EditTextне будет получать Фокус после начала деятельности
проблема, кажется, исходит из свойства, которое я могу видеть только в
XML formмакета.обязательно удалите эту строку в конце объявления в пределах
EditTextXML-теги:<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(); }
следующее остановит 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, т. е. не потребляя событие, поведение фокусировки будет продолжаться как обычно.
попробовать clearFocus() вместо
setSelected(false). Каждый вид в Android имеет как фокусируемость, так и возможность выбора, и я думаю, что вы хотите просто очистить фокус.
я попробовал несколько ответов по отдельности, но фокус все еще находится в 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)
ни одно из этих решений не сработало для меня. Способ, которым я исправляю автофокус, был:
<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan"> <intent-filter > </intent-filter> </activity>
простое решение: В
AndroidManifestinActivityиспользовать тегandroid:windowSoftInputMode="stateAlwaysHidden"
вы можете просто установить "focusable" и "фокус в сенсорном режиме" значение true на первом
TextViewнаlayout. Таким образом, когда активность начинаетсяTextViewбудет сфокусирован, но, в силу своей природы, вы не увидите ничего сфокусированного на экране и, конечно же, будет нет клавиатура отображается...
следующее работало для меня в
Manifest. Пиши,<activity android:name=".MyActivity" android:windowSoftInputMode="stateAlwaysHidden"/>
Мне нужно было очистить фокус от всех полей программно. Я просто добавил следующие два оператора к моему основному определению макета.
myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); myLayout.setFocusableInTouchMode(true);вот и все. Исправлена моя проблема мгновенно. Спасибо, Сильвер, что указал мне верное направление.
самый простой ответ, просто добавьте это в родительский макет XML.
android:focusable="true" android:focusableInTouchMode="true"
если у вас есть другой взгляд на вашу деятельность, как
ListView, вы также можете сделать:ListView.requestFocus();в своем
onResume()чтобы захватить фокус сeditText.Я знаю, что на этот вопрос был дан ответ, но просто предоставил альтернативное решение, которое сработало для меня:)
попробуйте это перед первым редактируемым полем:
<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();
добавить следующее
onCreateспособ:this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
поскольку мне не нравится загрязнять 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()inonCreate()<EditText android:id="@+id/dummyEditTextFocus" android:layout_width="0px" android:layout_height="0px" />это, кажется, ведет себя так, как я ожидаю. Не нужно обрабатывать изменения конфигурации и т. д. Мне это было нужно для деятельности с длинным TextView (инструкции).
Да, я сделал то же самое-создал "фиктивный" линейный макет, который получает начальный фокус. Кроме того, я установил идентификаторы фокуса "next", чтобы пользователь больше не мог его фокусировать после прокрутки один раз:
<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" />просто поместите это как представление перед проблемным сфокусированным представлением, и все.
Это идеальное и самое простое решение.Я всегда использую это в своем приложении.
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
самое простое, что я сделал, чтобы установить фокус на другой вид в onCreate:
myView.setFocusableInTouchMode(true); myView.requestFocus();это остановило появление мягкой клавиатуры, и в EditText не было мигания курсора.
написать этот код внутри на
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"/>
At
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>
Comments