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


90

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

Ответы:


109

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


17

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

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

Что оно делает? Похоже, что он изменяет какое-то состояние для всего действия, а не только для представления или фрагмента, поэтому я буду осторожен с этим и не буду использовать его, если я не понимаю всех его последствий.
Kartick Vaddadi

На самом деле, я бы не стал этого делать на основании первоначального запроса плаката. Это может решить текущую проблему, но его использование имеет побочные эффекты, которые могут вызвать проблемы позже. Именно такие хаки проникают в базы кода, что приводит к добавлению других хаков позже, чтобы свести на нет исходный хак ... порочный круг продолжается ... и люди задаются вопросом, почему код становится неподдерживаемым. Ага, вы догадались ... Я работаю с другими людьми, которые делают подобные вещи, и это очень усложняет мне жизнь.
dell116 02



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, но, наконец, может получить начальный фокус.


2

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


1

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


1

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


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