Как отобразить софт-клавиатуру, когда фокус редактирования текста

461

Я хочу автоматически показывать программную клавиатуру, когда EditTextона сфокусирована (если на устройстве нет физической клавиатуры), и у меня есть две проблемы:

  1. Когда Activityотображается my, my EditTextфокусируется, но клавиатура не отображается, мне нужно снова нажать на нее, чтобы отобразить клавиатуру (она должна отображаться, когда отображается my Activity).

  2. И когда я нажимаю «Готово» на клавиатуре, клавиатура исчезает, но EditTextостается в фокусе, и вы не хотите (потому что мое редактирование завершено).

Чтобы возобновить, моя проблема состоит в том, чтобы иметь что-то более похожее на iPhone: которое синхронизирует клавиатуру с моим EditTextсостоянием (сфокусировано / не сфокусировано) и, конечно, не предоставляет программную клавиатуру, если есть физическая.

Людовик Ландри
источник
У меня просто есть базовый EditText, например: <EditText android: id = "@ + id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: imeOptions = "actionDone" /> И у меня есть активность this: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Людовик Ландри
2
Это помогло мне лучше, чем любой другой ответ в этом сообщении: stackoverflow.com/a/2418314/1491212
Armel Larcier

Ответы:

629

Чтобы заставить программную клавиатуру появляться, вы можете использовать

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

А для снятия фокуса EditText, к сожалению, вам нужен манекен, Viewчтобы захватить фокус.

надеюсь, это поможет


Чтобы закрыть его вы можете использовать

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Это работает для использования в диалоге

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}
raukodraug
источник
2
Если я это сделаю, программная клавиатура отображается, когда появляется активность (это хорошо), но когда мой фокус покидает EditText и переходит к кнопке, например, клавиатура остается (это плохо).
Людовик Ландри
157
У меня не работает EditText в диалоге, который уже имеет фокус. Не уверен почему.
Матиас
10
@AbdellahBenhammou, возможно, выполнение вызова requestFocus над текстом редактирования перед показом мягкого ввода может решить вашу проблему. Это для меня.
r1k0
18
@AbdellahBenhammou, сделайте это в onCreate (): getDialog (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Филипп
22
Работал только в сочетании с yourEditText.requestFocus()описанным здесь: stackoverflow.com/questions/8991522/…
Вивек Пандей,
231

У меня такая же проблема. Сразу после изменения editText VISIBILITY с GONE на VISIBLE мне пришлось установить фокус и отобразить экранную клавиатуру. Я добился этого, используя следующий код:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Это работает для меня с задержкой 100 мс, но не удалось без задержки или только с задержкой 1 мс.

Комментируемая часть кода демонстрирует другой подход, который работает только на некоторых устройствах. Я тестировал на версиях ОС 2.2 (эмулятор), 2.2.1 (реальное устройство) и 1.6 (эмулятор).

Такой подход спас мне много боли.

Майк Кескинов
источник
48
Я не знал, что что-то может быть таким уродливым и таким прекрасным одновременно. Спасибо огромное!
Mkerley
15
@jellyfish это имитирует нажатие на EditText. Для других, читающих это, вместо создания нового Handlerвы также можете использовать View.postDelayed()метод на самом yourEditTextвиджете.
Тони Чан
5
Это взлом - гораздо лучшее решение Дэвида Чендлера.
Бен Бедерсон
4
Если решение Дэвида Чендлера работает на всех версиях / устройствах Android и для случая, когда VISIBILITY было просто изменено с GONE на VISIBLE, тогда ДА - вам следует использовать вместо этого его решение.
Майк Кескинов
3
Согласовано. Знаете ли вы лучшее решение, которое работает во всех версиях Android?
Майк Кескинов
162

Чтобы вызвать появление клавиатуры, используйте

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

Этот метод более надежен, чем прямой вызов InputMethodManager.

Чтобы закрыть его, используйте

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Дэвид Чендлер
источник
12
Может кто-нибудь объяснить, почему это надежнее, чем прямое обращение InputMethodManager? (С одной стороны, это не работает, в отличие от решения Раукодрауга.)
Мэтью Кирос
5
У меня тоже не работает. Работа в Android 2.3.5. Решение Раукодрауга работает на меня. Искал зависимость от версии, но не смог ее найти.
Хьюго Логманс
2
Это работало для меня в Android 4.4.2. Метод InputMethodManager, выбранный в качестве решения для этого поста, не работал для меня.
Фил
после использования метода в ответе я добавил это, и это сработало, но без него не сработало. спасибо
Мэнни265
2
У меня не работало в Android 4.4.2. Он показывает клавиатуру, но не скрывает ее.
Джон Дж. Смит
87

Когда больше ничего не работает, вынудите это показать :

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

А потом, если вы хотите закрыть его, например, в onPause (), вы можете вызвать:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Bolling
источник
4
Вы были правы, @Bolling! Когда больше ничего не работало, твой код спас меня. Спасибо!
Виллиан Пайшао
3
Ваш код был единственным, кто работал на меня, и я попробовал каждое решение на этой странице! Большое спасибо!
Маттиа Руджеро
4
не заставляйте это. в некоторых случаях при переходе с переднего на задний план клавиатура остается там, потому что вы ее принудительно нажимаете. это проблема фрагментации, но я видел это на самсунге дуэтов.
j2emanue
У меня обычно всегда есть код, чтобы закрыть клавиатуру onPause (), так как я видел, как она зависла, даже если вы ее не заставляли.
Боллинг
Это сработало, но при переходе на другие экраны оно все равно остается открытым
Sithu
75

Следующий код разграблен из исходного кода Google 4.1 для SearchView. Кажется, работает, хорошо на меньших версиях Android, а также.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Затем, кроме того, следующий код должен быть добавлен при создании элемента управления / действия. (В моем случае это сложный контроль, а не деятельность).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});
Робин Дэвис
источник
Спасибо! Это работает удивительно хорошо. И это решение мне более удобно из всех ответов и тем, которые я читал по этому вопросу.
Руи
37
:-D setImeVisibility(hasFocus)?
Матиас
Я попробовал этот метод, так как на самом деле «катал свой собственный вид поиска» (не хотел этого делать, но были причины). Это сработало для меня, за исключением начала деятельности. Я добавил android: windowSoftInputMode = "alwaysVisible" к активности и уже вызывал requestFocus () для текста редактирования. Работает как чемпион.
javahead76
Любая идея о необходимости удаления обратных вызовов (mShowImeRunnable)? Я думал, что как только запускаемый объект будет выбран для запуска из очереди, он будет удален из очереди одновременно?
Чеок Ян Ченг
1
Попробовав несколько вариантов, это был единственный вариант, который постоянно работал для меня (Android 4.42). Спасибо
Джон Дж. Смит
34

android:windowSoftInputMode="stateAlwaysVisible" -> в файле манифеста.

edittext.requestFocus(); -> в коде.

Это откроет программную клавиатуру, на которой текст редактирования имеет фокус запроса, когда появляется активность.

gorenikhil33
источник
2
Это откроет клавиатуру при создании Активности.
xpto
не отвечает на вопрос, но помог мне :)
S.Thiongane
открывает ключ без requestfocus в API 22
Дэвид
Работает нормально для моего случая. Интересно, почему атрибут focus запроса только из xml также нуждается в упоминании manifest!
sud007
30

Мне немного повезло в некоторых простых случаях с кодом ниже. Я не закончил все испытания, но ....

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

И Presto клавиатура обнаруживается.

выбоина
источник
Для моего случая у меня была кнопка для добавления дополнительной информации. В обработчик button.onClick вышеуказанный код был добавлен, чтобы заставить программную клавиатуру появляться для ввода дополнительной информации. Droid 2.2.2
Дент
Это хорошее решение, но не забывайте, что вы должны создать объект MotionEvent и вызвать recycle () для них после использования для повторного использования вызывающим абонентом.
Jimbob
Вам просто нужен один dispatchTouchEvent () с ACTION_UP в качестве аргумента ..
Мохаммед Джунаид
15

Вы можете попробовать заставить программную клавиатуру появляться, у меня она работает:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Вадим Зин4ук
источник
1
Это работает для меня ... Я пробовал эти InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (name, inputMethodManager.SHOW_IMPLICIT); или getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); но никто из них не работал.
Гюнай Гюльтекин
10

Иногда ответ Раукодрауга не работает. Я сделал это таким образом с некоторыми пробами и ошибками:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

И часть EditText :

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });
Xieyi
источник
1
Это единственное решение, которое работает для меня на Android 5
user1021430
10

Чтобы скрыть клавиатуру, используйте эту:

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

и показать клавиатуру:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Mubashar
источник
Для DialogFragment вы можете вызвать это в переопределенном виде onStart()и использовать getDialog().getWindow()в качестве альтернативы getActivity().getWindow().
Mr-IDE
10

А для Kotlin просто используйте следующие расширения:

fun EditText.showKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}
bitvale
источник
именно то, что я искал.
lasec0203
8

Для фрагмента, убедитесь, что он работает:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Ариш Хан
источник
7

showSoftInput не работал на меня вообще.

Я решил, что мне нужно установить режим ввода: (здесь, в компоненте Activity в манифесте)

android:windowSoftInputMode="stateVisible" 
vincebodi
источник
6

Поверьте или нет, моя проблема с Soft Keyboard была решена, когда я обнаружил, что анимация Activity может отключить Soft Keyboard. Когда вы называете намерение с

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

а также

overridePendingTransition(0, 0);

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

sparkbit
источник
6

У меня была одна и та же проблема в разных ситуациях, и решения, которые я нашел, работали в некоторых, но не работали в других, поэтому вот комбинированное решение, которое работает в большинстве ситуаций, которые я нашел:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}
n0sferat0k
источник
6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});
гость
источник
6

Я объединил все здесь и для меня это работает:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
lxknvlk
источник
6

Это сработало для меня. Вы можете попробовать это также показать клавиатуру:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Тарит Рэй
источник
5

фрагмент кода. , ,

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}
Чонз Пуангпут
источник
5

Kotlin расширение для отображения клавиатуры в фокусе.

Это комбинация предыдущих ответов, которые либо слишком длинные, либо неполные.

Это расширение публикует исполняемый файл в очереди сообщений, который показывает программную клавиатуру после запроса фокуса:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

Позвоните в любое удобное для вас время:

editText.showSoftKeyboard()
Алекс Бурдусел
источник
4

просто добавьте android: windowSoftInputMode = "stateHidden" в файле манифеста ...

Пракаш Гаваде
источник
4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
XXX
источник
4

Внутри вашего манифеста:

android:windowSoftInputMode="stateAlwaysVisible"- изначально запущенная клавиатура. android:windowSoftInputMode="stateAlwaysHidden" изначально скрытая клавиатура.

Мне также нравится использовать, "adjustPan"потому что, когда клавиатура запускается, экран автоматически настраивается.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
Г-н Имран Чоудхури
источник
4

Просто добавьте эту строку в ваше представление EditText:

android:isScrollContainer="true"

и TADA - клавиатура стала появляться автоматически!

У меня была похожая проблема, и я обнаружил это простое и странное решение.

Как уже упоминалось здесь пользователем3392439, появление клавиатуры в фокусе как-то странно связано с присутствием компонента прокрутки в файле XML.

Даже наличие другого представления EditText, которое содержит вышеупомянутую строку в том же XML, приводит к тому, что клавиатура появляется независимо от того, какой из EditTexts в данный момент сфокусирован.

Если у вас есть хотя бы одно видимое представление, содержащее компонент прокрутки в вашем XML-файле - клавиатура автоматически появится в фокусе.

Если прокрутки нет - вам нужно нажать на EditText, чтобы появилась клавиатура.

Вальдман
источник
Это очень странно, но это определенно работает - я пытался requesFocus()из обработчика щелчка, и это единственный способ, отличный от явного showSoftInput SHOW_FORCED
drew
Господи, спасибо, мужик. Понятия не имею, почему он работает, но я протестировал его на 8 устройствах разных производителей, и он работал каждый раз!
Антонио Власич
3

Все решения, указанные выше ( взаимодействие InputMethodManager в OnFocusChangeListener.onFocusChange слушатель, прикрепленный к вашему EditText, работает нормально, если у вас есть одно редактирование в действии .

В моем случае у меня есть две правки.

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

Я заметил, что onFocusChange запускается для tvX с hasFocus = true (клавиатура показана), но затем для tvY с hasFocus = true (клавиатура скрыта). В конце концов, никакой клавиатуры не было видно.

Общее решение должно иметь правильное утверждение, если «показать клавиатуру, если текст EditText имеет фокус»

Бартош Билицкий
источник
3

В разделе «Активность» onResume () вы можете вызвать метод приноситьKearboard ();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }
Викас
источник
Что за WidgetUtils.showKeyboard? Это самая важная часть здесь.
TWiStErRob
2

Ни один из Ответов не работал для меня. Вот простой способ.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

Просто отложил метод requestFocus () на 400 мс.

Сатьяджит Дас
источник
Большое спасибо, для показа клавиатуры требуется некоторая задержка ...
hkh114
1

Я обнаружил странное поведение, поскольку в одном из моих приложений программная клавиатура автоматически отображалась при входе в действие (в onCreate есть editText.requestFocus ()).

Покопавшись дальше, я обнаружил, что это потому, что вокруг макета есть ScrollView. Если я удаляю ScrollView, поведение будет таким, как описано в исходной формулировке проблемы: только при нажатии на уже сфокусированный editText отображается программная клавиатура.

Если это не работает для вас, попробуйте добавить ScrollView - это в любом случае безопасно.

user3392439
источник
1

У меня была похожая проблема с использованием анимации вида . Поэтому я добавил слушателя анимации, чтобы убедиться, что дождусь окончания анимации, прежде чем запрашивать доступ с клавиатуры к отображаемому тексту редактирования.

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });
Бенджамин Пиетт
источник
1

Я согласен с raukodraug для этого, используя swithview, вы должны запросить / очистить фокус, как это:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

С уважением.

Жан-Люк Барат
источник