Оригинальный вопрос касается диалогов, и мой EditText находится на регулярной основе. Во всяком случае, я подозреваю, что это должно работать для большинства из вас тоже. Так вот что работает для меня (выше предложенный метод с самым высоким рейтингом ничего не сделал для меня). Вот пользовательский EditView, который делает это (подклассы не нужны, но я нашел это удобным для моих целей, так как я хотел также захватить фокус, когда представление становится видимым).
На самом деле это в значительной степени совпадает с ответом Tidbecks. Я вообще-то не заметил его ответа, так как у него были нулевые голоса. Тогда я собирался просто прокомментировать его пост, но это было бы слишком долго, поэтому я все равно закончил делать этот пост. Тидбек указывает, что он не уверен, как это работает с устройствами, имеющими клавиатуры. Я могу подтвердить, что поведение кажется одинаковым в любом случае. Это так, что в портретном режиме программная клавиатура выскакивает, а в альбомной - нет. Сдвинуть или нет физическую клавиатуру не имеет значения на моем телефоне.
Потому что, я лично нашел поведение немного неловко , я выбрал для использования: InputMethodManager.SHOW_FORCED
. Это работает так, как я хотел, чтобы это работало. Клавиатура становится видимой независимо от ориентации, однако, по крайней мере, на моем устройстве она не выскакивает, если выдвинута аппаратная клавиатура.
import android.app.Service;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
public class BringOutTheSoftInputOnFocusEditTextView extends EditText {
protected InputMethodManager inputMethodManager;
public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public BringOutTheSoftInputOnFocusEditTextView(Context context) {
super(context);
init();
}
private void init() {
this.inputMethodManager = (InputMethodManager)getContext().getSystemService(Service.INPUT_METHOD_SERVICE);
this.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
BringOutTheSoftInputOnFocusEditTextView.this.inputMethodManager.showSoftInput(BringOutTheSoftInputOnFocusEditTextView.this, InputMethodManager.SHOW_FORCED);
}
}
});
}
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (visibility == View.VISIBLE) {
BringOutTheSoftInputOnFocusEditTextView.this.requestFocus();
}
}
}