Установить начальный фокус в приложении Android


86

В моем приложении для Android он автоматически фокусируется на первом Buttonиз моих макетов, придавая ему оранжевый контур. Как я могу установить начальный фокус, предпочтительно в XML, и можно ли это установить на ничего?

Ответы:


159

Вы можете использовать requestFocusтег:

<Button ...>
  <requestFocus />
</Button>

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


Да, это случилось с двумя моими приложениями. Думаю, я мог бы запросить фокус на элементе, который не меняется, как TextView, или это будет запрещено?
Stealthcopter

1
@stealthcopter: скажите, какую версию Android вы используете. Я использую 2.1 и 2.2, но requestFocus не работает.
антикафе

Ну, я использовал его во всех версиях, но проблема, которая у меня возникла, исчезла сама по себе, поэтому я мало исследовал.
Stealthcopter 06

19
Я пробовал подход XML, пробовал программный подход. Однако EditText сохраняет фокус. ОЧЕНЬ НАДОЕДЛИВЫЙ !
Someone Somewhere


64

@Someone Somewhere, я пробовал все вышеперечисленное безрезультатно. Я нашел исправление с http://www.helloandroid.com/tutorials/remove-autofocus-edittext-android . По сути, вам нужно создать невидимый макет прямо над проблемной кнопкой:

<LinearLayout android:focusable="true"
              android:focusableInTouchMode="true" 
              android:layout_width="0px"
              android:layout_height="0px" >
    <requestFocus />
</LinearLayout>

Я смог сосредоточиться на AlertDialog, и включение режима focusableintouchmode помогло мне сделать это правильно. По сути, вот как это сделать: alert.show (); alert.getButton (AlertDialog.BUTTON_POSITIVE) .setFocusableInTouchMode (true); alert.getButton (AlertDialog.BUTTON_NEGATIVE) .requestFocus ();
Sagar Hatekar

2
Спасибо! Это было единственное решение, которое сработало в моем случае. Хотя я использовал его немного иначе; Я поместил фокус в объект, RelativeLayoutсодержащий EditText.
kaka

1
С Android P в платформу вносятся следующие изменения: «Виды с 0 областью (либо ширина, либо высота равна 0) больше не могут быть сфокусированы. Кроме того, действия больше не неявно назначают начальный фокус в сенсорном режиме. Вместо этого он активирован вам, если хотите, явно запросить начальный фокус ".
AustrianDude

28

Установите для обоих :focusableи :focusableInTouchModeзначение true и вызовите requestFocus. Это делает свое дело.


Да, это верное решение, чтобы исправить это. Спасибо, Андерс
гохансари

23

Я обнаружил, что это работает лучше всего для меня.

В AndroidManifest.xml <activity> elementдобавьтеandroid:windowSoftInputMode="stateHidden"

Это всегда скрывает клавиатуру при входе в действие.


Легко и чисто!
SHADOW.NET 08

отлично ... это очень впечатляет!
гумурух

11

Я просто добавляю эту строку кода в onCreate():

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

Задача решена.


Работает в Android 2.3.3.
Gaurav Agarwal

7

Используйте код ниже,

TableRow _tableRow =(TableRow)findViewById(R.id.tableRowMainBody);
tableRow.requestFocus();

это должно работать.


3

@Someone Где-то я использовал это, чтобы очистить фокус:

editText.clearFocus();

и это помогает


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.