Как установить фокус на вид при создании и отображении макета?

90

В настоящее время у меня есть макет, содержащий a Button, a TextViewи an EditText. Когда отображается макет, фокус будет автоматически установлен на EditText, что приведет к появлению клавиатуры на телефоне Android. Это не то, что я хочу. Есть ли способ установить фокус TextViewна пустом месте при отображении макета?

user256239
источник

Ответы:

109

Установить фокус: платформа будет обрабатывать перемещение фокуса в ответ на ввод пользователя. Чтобы принудительно переключить фокус на конкретное представление, вызовите requestFocus ()

Марк Б
источник
17

Это работает:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Чарльз Мосндуп
источник
Что оно делает? Похоже, что он изменяет какое-то состояние для всего действия, а не только для представления или фрагмента, поэтому я буду осторожен с этим и не буду использовать его, если я не понимаю всех его последствий.
Kartick Vaddadi
На самом деле, я бы не стал этого делать на основании первоначального запроса плаката. Это может решить текущую проблему, но его использование имеет побочные эффекты, которые могут вызвать проблемы позже. Именно такие хаки проникают в базы кода, что приводит к добавлению других хаков позже, чтобы свести на нет исходный хак ... порочный круг продолжается ... и люди задаются вопросом, почему код становится неподдерживаемым. Ага, вы догадались ... Я работаю с другими людьми, которые делают подобные вещи, и это очень усложняет мне жизнь.
dell116 02
6

Вы должны добавить это:

android:focusableInTouchMode="true"
Ариф Джусох
источник
6

Набор

 android:focusable="true"

в вашем <EditText/>

рави
источник
6

Чтобы установить фокус, задержите requestFocus () с помощью Handler.

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}
Дэн МакНертни
источник
5

Вы можете попробовать просто спрятать клавиатуру. Что-то вроде этого:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Абелюс
источник
3

Также установите эти строки OnResumeи убедитесь, что для focusableInTouchних установлено значение true, пока вы инициализируете свои элементы управления.

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();
Паван Махешвари
источник
3

чтобы изменить фокус, сделайте textView в xml фокусируемым

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

и в java при создании

textView.requestFocus();

или просто спрячьте клавиатуру

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}
Мина Шейкер
источник
android: focusable = "true" и textView.requestFocus (); работал у меня. Благодаря!
Вернер
2

Ни один из приведенных выше ответов не работает для меня. Единственным (скажем так) решением было изменить первый TextView в отключенном EditText, который получает фокус, а затем добавить

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

в обратном вызове onCreate, чтобы предотвратить отображение клавиатуры. Теперь мой первый EditText выглядит как TextView, но, наконец, может получить начальный фокус.

Lorenzoff
источник
2

Последнее предложение - правильное решение. Чтобы повторить, сначала установите android:focusable="true"в xmlфайле макета , а затем requestFocus()в представлении в вашем коде.

Реза Незами
источник
1

Я думаю, что текстовое представление не фокусируется. Попробуйте, например, установить фокус на кнопку или установить для свойства focusable значение true.

лапакрет
источник
1

вы можете добавить текст редактирования размером «0 провал» в качестве первого элемента управления в ur xml, чтобы он сфокусировался на рендеринге. (убедитесь, что он настраивается и все ...)

con_9
источник
1

Вы можете начать с добавления android:windowSoftInputModeк своей деятельности в AndroidManifest.xmlфайл.

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

Это заставит клавиатуру не отображаться, но EditTextвсе равно будет в фокусе. Чтобы решить эту проблему, вы можете установить android:focusableInTouchmodeи android:focusableв trueкорневом представлении.

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

Приведенный выше код обеспечит RelativeLayoutфокусировку вместоEditText

Уильке Мессиас
источник
0

Фокус предназначен для выбора компонентов пользовательского интерфейса, когда вы используете что-то помимо сенсорного (например, d-pad, клавиатуру и т. Д.). Любое представление может получить фокус, хотя некоторые из них не доступны по умолчанию. (Вы можете сделать вид фокусируемым с помощью setFocusable(true)и принудительно сфокусировать его с помощьюrequestFocus() .)

Однако важно отметить, что когда вы находитесь в сенсорном режиме, фокусировка отключена . Поэтому, если вы используете пальцы, изменение фокуса программным способом ничего не дает. Исключением являются представления, которые получают ввод от редактора ввода. Вот EditTextтакой пример. В этой особой ситуации setFocusableInTouchMode(true)используется, чтобы программная клавиатура знала, куда отправлять ввод. EditTextИмеет эту настройку по умолчанию. Программная клавиатура появится автоматически.

Если вы не хотите, чтобы программная клавиатура появлялась автоматически, вы можете временно отключить ее, как отметил @abeljus:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

Однако, когда пользователь нажимает на EditText, клавиатура все равно должна отображаться.

Дальнейшее чтение:

Suragch
источник
Это неправильный ответ? С отрицательным голосом комментариев не было.
Suragch