Як встановити фокус на поданні, коли макет створюється та відображається?


90

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

Відповіді:


109

Встановити фокус: Фреймворк обробляє рухомий фокус у відповідь на введення користувачем. Щоб примусити зосередитись на певному поданні, зателефонуйте requestFocus ()


17

Це працює:

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

Що це робить? Здається, це змінює якийсь стан для всієї діяльності, а не лише подання чи фрагмент, тому я буду обережний щодо цього і не використовуватиму його, якщо не зрозумію всіх його наслідків.
Vaddadi Kartick

Дійсно, я б не робив цього на основі запиту оригінального плаката. Це може вирішити поточну проблему, але її використання має побічні ефекти, які можуть спричинити проблеми пізніше. Подібні хаки потрапляють у бази коду, що призводить до того, що інші хаки додаються пізніше, щоб заперечити початковий хакер ... порочний цикл триває .... і люди дивуються, чому код стає неможливим. Так, ви здогадалися .... Я працюю з іншими, хто робить подібні речі, і це ускладнює моє життя.
dell116



6

Щоб встановити фокус, відкладіть requestFocus () за допомогою обробника.

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 в на create

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

я думаю, що перегляд тексту не можна сфокусувати. Спробуйте, наприклад, встановити фокус на кнопці або встановити властивість, що фокусується, на true.


1

Ви можете додати текст редагування розміром "0 dip" як перший елемент керування в 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, він все одно повинен показувати клавіатуру.

Подальше читання:


Чи така відповідь неправильна? Жодного коментаря щодо "проти" не залишилось.
Сурагч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.