[android] Android TextField : 프로그래밍 방식으로 포커스 + 소프트 입력 설정

내 생각에는 EditText 검색이 있고 필드에서 클릭 이벤트의 동작을 프로그래밍 방식으로 트리거하고 싶습니다. 즉, 텍스트 필드에 포커스를두고 필요한 경우 소프트 키보드를 표시하고 싶습니다 (사용 가능한 하드 키보드가없는 경우).

나는 시도했다 field.requestFocus(). 필드는 실제로 포커스를 받지만 소프트 키보드는 표시되지 않습니다.

나는 시도했다 field.performClick(). 하지만 필드의 OnClickListener 만 호출합니다.

어떤 생각?



답변

좋은 선생님, 이것을 시도하십시오 :

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

잘 모르겠지만 일부 휴대 전화 (일부 구형 기기)에서 필요할 수 있습니다.

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


답변

다음은 나를 위해 일한 코드입니다.

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

그게 다야! 즐겨 😉


답변

다음 코드는 나를 위해 일한 애프터, 다른 두 답변 나를 위해 작동하지 않았다 :

@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);

기술적으로 소프트 키보드 디스플레이 요청을 실행하기 전에 300ms의 지연을 추가했습니다. 이상 하죠? 또한 변경 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);


답변

        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));
            }
        });


답변

제 경우에는 특정 텍스트 상자에 대한 참조없이 가상 키보드를 표시하고 싶었 기 때문에 수락 된 답변의 첫 번째 부분을 사용하여 초점맞췄습니다 .

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

그런 다음 가상 키보드를 표시합니다 .

InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);


답변