Как сделать EditText не сфокусированным при создании Activity
Перед тем, как понизить голос и отметить как дубликат, прочитайте мой вопрос.
Я читал другие вопросы, обсуждающие это, и все они работают для моих макетов, за исключением самого первого созданного.
На данный момент это наверху моего onCreate
метод:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
^ Это делает так, по крайней мере, клавиатура не выскакивает при запуске, но EditText
все еще сосредоточен на.
Это XML
для меня EditText
:
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/changePass"
android:layout_centerHorizontal="true"
android:layout_marginTop="167dp"
android:ems="10"
android:imeOptions="flagNoExtractUi"
android:inputType="textPassword"
android:maxLength="30" >
</EditText>
Вот как это выглядит, когда я поднимаю свою деятельность:
Проблема в том, что с некоторыми телефонами, когда EditText
сосредоточены так, они не могут писать в нем. Я хочу, чтобы это не фокусировалось.
То, что я сделал, работает для следующих макетов, поднятых в том, что это EditTexts
не ориентированы и будут выглядеть так:
Обратите внимание, что это тот же макет, хотя. Это экран после того, как пользователь был возвращен к этому экрану, который бы ничего не указывал на XML
потому что это то же самое XML
, но проблема в том, что EditText
сосредоточено только на том, когда деятельность создана.
Я провел исследование, и все остальные вопросы не помогают мне в этом (к счастью, они помогли клавиатуре не появляться). Как я могу сделать это так EditText
при запуске будет выглядеть второй скриншот, а не первый?
14 ответов
Вы можете установить свойство Layout как android:descendantFocusability="beforeDescendants"
а также android:focusableInTouchMode="true"
Пример:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/changePass"
android:layout_centerHorizontal="true"
android:layout_marginTop="167dp"
android:ems="10"
android:imeOptions="flagNoExtractUi"
android:inputType="textPassword"
android:maxLength="30" >
</EditText>
</RelativeLayout>
Пусть это будет полезно;)
XML-код:
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/changePass"
android:layout_centerHorizontal="true"
android:layout_marginTop="167dp"
android:ems="10"
android:focusable="false"
android:imeOptions="flagNoExtractUi"
android:inputType="textPassword"
android:maxLength="30" >
</EditText>
Java-код:
EditText edPwd = (EditText)findViewById(R.id.password);
edtPwd.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.setFocusable(true);
v.setFocusableInTouchMode(true);
return false;
}
});
установить фокусируемое значение false в xml и установить его истинным с помощью кода
В вашем main_layout добавьте эти 2 строки:
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
пример:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"> *YOUR LAYOUT CODE* </RelativeLayout>
Лучшее решение здесь: https://stackru.com/a/45139132/3172843
правильное и простое решение состоит в том, чтобы установить falseFocusable и установить trueFocusableInTouchMode. поэтому EditText получает фокус только тогда, когда пользователь касается этого EditText
android:focusable="false"
android:focusableInTouchMode="true"
Всякий раз, когда я пытаюсь открыть Editext после выбора элемента Spinner, поэтому в это время я не могу открыть клавиатуру и записать значения в тексте редактирования, но я решил свою проблему с этим кодом.
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/titleName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textCapWords"
android:hint="@string/hint_your_full_name"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Спасибо!
Добавьте это в onCreate()
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
или в onCreateView()
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
XML-код
<EditText
android:imeOptions="flagNoExtractUi"
android:focusable="false"
/>
Java-код в onClickListerner
mEdtEnterPhoneNumber.setFocusable(true);
mEdtEnterPhoneNumber.setFocusableInTouchMode(true);
Вы можете сделать это программно. использование editText.setEnabled(false)
в вашем onStart()
метод вашей деятельности (не в onCreate() - потому что это какой-то метод для инициализации компонентов GUI)
<activity
android:name=".MainActivity"
android:windowSoftInputMode="stateAlwaysHidden" />
андроид:windowSoftInputMode="stateAlwaysHidden"
добавьте эту строку в тег активности файла Manifest.xml. когда вы нажимаете на TextEdit, клавиатура попадает в фокус.
В Manifest скопируйте и вставьте следующий код.
<activity
android:name=".LoginActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
Можно использовать android:focusable="false"
чтобы отключить его, но если это по какой-то причине не работает, то вы можете просто поставить LinearLayout
и это займет фокус, не нарушая ваш макет.
ПРИМЕЧАНИЕ: Eclipse выдаст вам ошибку, сообщающую, что ваш LinearLayout
бесполезен, потому что у него нет содержимого. Вы должны быть в состоянии игнорировать это без проблем.
Например:
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="false"
android:layout_width="0dp"
android:layout_height="0dp"
/>
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/changePass"
android:layout_centerHorizontal="true"
android:layout_marginTop="167dp"
android:ems="10"
android:imeOptions="flagNoExtractUi"
android:inputType="textPassword"
android:maxLength="30" >
</EditText>
</LinearLayout>
Самый простой способ - это добавить
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
в теге активности файла Manifest.xml
1) Проще всего открыть манифест и поместить следующий код между тегом активности:
android:windowSoftInputMode="stateHidden"
2) Поместите эти атрибуты в родительский макет
android:focusable="true"
android:focusableInTouchMode="true"
Использование android:focusable="false"
для фокусировки отключить
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/changePass"
android:layout_centerHorizontal="true"
android:layout_marginTop="167dp"
android:ems="10"
android:imeOptions="flagNoExtractUi"
android:inputType="textPassword"
android:maxLength="30"
android:focusable="false" >
</EditText>