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

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

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

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

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

Ответы [ 35 ]

3 голосов
/ 31 марта 2013

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

2 голосов
/ 26 февраля 2017

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

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

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

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
2 голосов
/ 25 сентября 2014

Все решения, указанные выше ( 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 имеет фокус»

2 голосов
/ 01 октября 2014

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

 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;
  }
1 голос
/ 10 сентября 2014

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

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

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

1 голос
/ 15 апреля 2016

Я согласен с 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);
        }
    });

Привет.

1 голос
/ 02 марта 2015

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

    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 голос
/ 13 сентября 2018

Если EditText находится внутри Recycler или ListView и / или имеет отключенное состояние, используйте код ниже.

public static void showKeyboardByFocus(final View view)
    {
        view.requestFocus();

        InputMethodManager keyboard = SystemMaster.getInputMethodManager();
        keyboard.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);

        Runnable re = new Runnable()
        {
            @Override
            public void run()
            {
                view.setEnabled(true);
                view.requestFocus();
            }
        };

        Handler h = new Handler(Looper.getMainLooper());
        h.postDelayed(re, 360);
    }
0 голосов
/ 15 ноября 2018

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

    edittext = (EditText) findViewById(R.id.edittext );
    edittext.requestFocus();
    edittext.setFocusableInTouchMode(true);
    if (edittext.requestFocus()) {
        final Thread timer = new Thread() {
            public void run() {
                try{
                    sleep(500);
                    InputMethodManager imm =(InputMethodManager) getApplicationContext().getSystemService(INPUT_METHOD_SERVICE);
                    imm.showSoftInput(edittext, SHOW_IMPLICIT);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        timer.start();
0 голосов
/ 13 января 2017

Используя Xamarin, это работает для меня внутри фрагмента:

using Android.Views.InputMethods;
using Android.Content;

...

if ( _txtSearch.RequestFocus() ) {
  var inputManager = (InputMethodManager) Activity.GetSystemService( Context.InputMethodService );
  inputManager.ShowSoftInput( _txtSearch, ShowFlags.Implicit );
}
...