Установить начальный фокус в приложении 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
4
<requestFocus /> здесь: developer.android.com/guide/topics/resources/…
Эрик Б.
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();

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

jcw
источник
3

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

editText.clearFocus();

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

Руобин Ван
источник