Android TextField: програмно встановити фокус + м’який ввід


81

На мою думку, у мене є пошук EditText, і я хотів би програмно викликати поведінку події клацання на полі, тобто зосередити текстове поле І при необхідності відобразити м'яку клавіатуру (якщо жорсткої клавіатури немає).

Я спробував field.requestFocus(). Поле насправді фокусується, але м'яка клавіатура не відображається.

Я спробував field.performClick(). Але це викликає лише OnClickListener поля.

Будь-яка ідея?

Відповіді:


149

Добрий сер, спробуйте це:

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

Я не впевнений, але це може знадобитися на деяких телефонах (на деяких старих пристроях):

final InputMethodManager inputMethodManager = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);

3
Той самий результат, що лише requestFocus () ... Поле фокусується, але м’яка клавіатура не спрацьовує.
sdabet

12
Я , нарешті , вирішена шляхом виклику видається field.requestFocus()в onResume()методі активності (замість onCreate()). Не знаю точно, чому це працює ...
sdabet

31
Вид не може сфокусуватися до того, як він насправді буде розкладений на екрані. Цього не можна зробити, поки onCreate () містить UI-потік, тому подання викладається безпосередньо після onCreate () та перед onResume (). :)
pgsandstrom

@fiddler Він працює в onResumeтому onResume, що викликається після onCreate, тому fieldне існує до onCreateзапуску. Дивіться тут: developer.android.com/reference/android/app/…
Ренді

3
Відмінна пропозиція, чувак. Я заявляю; це цілком заслуговує на підтримку!
МВт.

63

Ось код, який працював у мене.

edittext.post(new Runnable() {
    public void run() {
        edittext.requestFocusFromTouch();
        InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        lManager.showSoftInput(edittext, 0);
    }
});

Це воно! Насолоджуйтесь;)


1
Дякую, і ця спрацювала на мене. Я додаю EditTextпрограмно, коли користувач натискає кнопку.
німецькі пальці

Я додав EditTextмодаль із діалогового вікна. Android встановлює деякі прапори, через які цей елемент керування не отримує жодних дотиків. Якщо ви додасте поле в runnable, прапори не встановлюються.
JeffRegan

Схоже , що InputTypeз EditTextв даний час встановлюється в нуль на Android. Якщо ви встановите значення InputType, воно має спрацювати.
JeffRegan

Єдине робоче рішення для мене (якщо я використовую InputMethodManager, щоб показати вимушену клавіатуру, то я не можу це приховати)
Павло,

Жоден з інших методів у мене не спрацював, але цей з них. Я хотів, щоб поле, де користувачі натискали, щоб відкрити вікно діалогу редагування, замість того, щоб мати рядок редагування, щоб натиснути для подання EditText. На телефоні рядок редагування втрачає більшу частину своєї функціональності, оскільки діалогове вікно редагування охоплює весь екран, тому користувач не може бачити рядок редагування, включаючи літери, що йдуть у ньому під час введення тексту.
Androidcoder

6

Наступний код працює для мене , після того , як два інших відповідей не працює для мене :

@Override
public void onResume() {
    super.onResume();
    SingletonBus.INSTANCE.getBus().register(this);
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen
}

Де ShowKeyboardє

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
  //      passwordInput.requestFocusFromTouch();
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

Після успішного введення я також переконуюсь, що приховую клавіатуру

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

Технічно я щойно додав 300 мс затримки перед запуском запиту дисплея програмної клавіатури. Дивно, правда? Також змінено requestFocus()на requestFocusFromTouch().

РЕДАГУВАТИ: Не використовуйте, requestFocusFromTouch()це дає сенсорну подію для запуску. Дотримуйтесь requestFocus().

EDIT2: У діалогових вікнах ( DialogFragment) використовуйте наступне

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

замість

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

requestFocusFromTouch()здається, викликає сенсорну подію на панелі запуску. Це дивно.
EpicPandaForce

0
        field.post(new Runnable() {
            @Override
            public void run() {
                field.requestFocus();
                field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
            }
        });

0

У моєму випадку я хотів відобразити віртуальну клавіатуру без посилання на певне текстове поле, тому для фокусування використав першу частину прийнятої відповіді :

edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

Потім я показую віртуальну клавіатуру :

InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.