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 2011

31
뷰는 실제로 화면에 배치되기 전에 초점을 맞출 수 없습니다. onCreate ()가 UI 스레드를 보유하는 동안에는이 작업을 수행 할 수 없으므로보기는 onCreate () 바로 뒤와 onResume () 전에 배치됩니다. :)
pgsandstrom 2011

@fiddler 이후 에 호출 onResume되기 때문에 작동 하므로 실행될 때까지 존재하지 않습니다 . 여기를 참조하십시오 : developer.android.com/reference/android/app/…onResumeonCreatefieldonCreate
Randy

3
훌륭한 제안, ol 'chap. 나는 선언한다; 이것은 찬성 할 가치가 있습니다!
MW.

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사용자가 버튼을 누를 때 프로그래밍 방식으로 추가 합니다.
dumbfingers

EditText대화 모달에서 추가했습니다 . 이 컨트롤이 터치를 수신하지 못하도록하는 일부 플래그가 Android에서 설정됩니다. 실행 파일에 필드를 추가하면 플래그가 설정되지 않습니다.
JeffRegan

등 보입니다 InputType의는 EditText안드로이드에 의해 null로 설정되고있다. 을 설정하면 InputType작동합니다.
JeffRegan

나를위한 유일한 솔루션 (InputMethodManager를 사용하여 키보드를 강제로 표시하면 숨길 수 없음)
Pavel

다른 방법은 나에게 효과가 없었지만이 방법은 효과가있었습니다. 사용자가 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);

기술적으로 소프트 키보드 디스플레이 요청을 실행하기 전에 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);

requestFocusFromTouch()런처에서 터치 이벤트를 트리거하는 것 같습니다. 이것은 이상합니다.
EpicPandaForce 2015 년

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.