프로그래밍 방식으로 EditText에서 포커스를 설정하고 키보드를 표시하는 방법


180

다음과 같은 뷰가 포함 된 레이아웃이 있습니다.

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

EditText프로그래밍 방식으로 포커스를 설정 (키보드 표시)하려면 어떻게해야합니까?

나는 이것을 시도했지만 Activity정상적으로 시작할 때만 작동 하지만에서 시작하면 TabHost작동하지 않습니다.

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


답변:


352

이 시도:

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

http://developer.android.com/reference/android/view/View.html#requestFocus ()


이 답변에서 보여 키보드를 강제로 코드 업데이트 : stackoverflow.com/questions/5105354/...
— 데이비드 리먼

5
내 활동을 정상적으로 시작할 때만 작동하지만 TabHost에서 활동을 시작할 때 작동하지 않습니다.
— Houcine

27
작동하지 않습니다. 이것은 나를 위해 작동합니다 InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
— Günay Gültekin

5
"이것은 형제가되지 않습니다". 경우에 따라 postDelayed ()에서이 코드를 비동기 적으로 호출해야합니다. 사용자가 대화 상자에서 "확인"을 누른 후 키보드를 열어야하는 경우가있었습니다. 그리고 대화가 닫힐 때 초점이 엉망이었습니다. 그래서 postDelayed ()에서 위의 코드를 호출했습니다. 대화가 닫힌 후에 실행되었습니다. 이익.
— Danylo Volokh

2
답변에 237 위로 투표하고 "그것은 형제 작동하지 않습니다"에 62 🤔 나는 자신의 의견을 얻기 위해 그것을 테스트하고 완벽하게 작동합니다!)
— Daniel

165

사용하다:

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

20
5 가지 이상의 다른 접근법을 시도한 후에, 이것은 ( View서브 클래스에서) 나를 위해 일한 유일한 방법이었습니다
— William

13
이 제안으로 인해 필드의 초점이 느슨해 지더라도 키보드가 고정됩니다.
— 까지

2
예, 그것은 저에게도 효과가 있으며 작동 imm.showSoftInput()하지 않습니다.
— Spark.Bao

8
이 방법은 작동하지만 홈 버튼 (하드웨어)으로 응용 프로그램을 종료하면 키보드가 화면에 표시됩니다. 키보드가 홈 화면에서 쓸모없는 멸시를 숨기려면 리턴 버튼 (하드웨어)을 눌러야합니다.
— Adrien Horgnies

다른 접근법은 저에게 효과가 없었습니다. 감사합니다.
— Iman Akbari

53

이것은 ungalcrys 덕분에 나를 위해 일했습니다.

키보드 표시 :

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

키보드 숨기기 :

InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2
유일한 완전한 솔루션. 감사.
— korro 2016 년

41

showSoftInput 나를 위해 전혀 작동하지 않았습니다.

입력 모드를 설정해야한다고 생각했습니다. android:windowSoftInputMode="stateVisible"(매니페스트의 활동 구성 요소)

이 도움을 바랍니다!


5
이것은 활동이 시작되었을 때 키보드를 보여줍니다.
— William

1
굉장 :) 많은 답변을 시도했지만 이것으로 만 작동시킬 수 있습니다 :) 정말 감사합니다.
— Srikanth

매우 과소 평가
— Avinash R

완벽한 답변. "editText.requestFocus ()"에서만 작동합니다. 감사.
— AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
onResume ()에 표시하려면이 작업을 수행해야했습니다. 지연이 없으면이 스레드에 설명 된 모든 단일 솔루션을 사용하여 아무 작업도 수행되지 않습니다.
— FranticRock

1
거기는. 그것이 내가 찾던 대답이었습니다. 그러나 두 번째 전체 지연이 반드시 필요한 것은 아닙니다. 나는 150 밀리 초를 시도했지만 잘 작동했습니다.
— Rubberduck

1
감사! 이것은 0ms ( tb.post({ showKeyboard(tb) })) 에서도 작동합니다 . tb조각보기가 아닌 EditText보기 ( ) 가 필요합니다 .
— CoolMind

16

소프트 키보드 표시 및 숨기기를위한 kotlin 확장은 다음과 같습니다.

fun View.showKeyboard() {
  this.requestFocus()
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

그럼 당신은 이것을 할 수 있습니다 :

editText.showKeyboard()
// OR
editText.hideKeyboard()

이것은 휴식에 비해 더 나은 솔루션입니다
— d-feverx

5

Android Jetpack 의 수명주기 인식 구성 요소로 수명주기 처리의 일부인 LifecycleObserver 를 사용하는 것이 좋습니다 .

Fragment / Activity가 나타날 때 키보드를 열고 닫고 싶습니다. 먼저 EditText에 대해 두 가지 확장 함수 를 정의 하십시오. 프로젝트의 어느 곳에 나 배치 할 수 있습니다.

fun EditText.showKeyboard() {
    requestFocus()
    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)
}

그런 다음 열고 키보드 활동 / 조각에 도달 닫는 LifecycleObserver 정의 onResume()또는 onPause:

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

그런 다음 Fragments / Activities에 다음 줄을 추가하면 언제든지 LifecycleObserver를 재사용 할 수 있습니다. 예 : 조각의 경우 :

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

4

키보드를 숨기고 표시하는 KeyboardHelper 클래스는 다음과 같습니다.

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(final Context context, final View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}, 1000);
}

public static void hideSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}, 1000);
}


public static void openSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, 1000);
}
}

0

첫 번째 방법 :

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

두 번째 방법 :

매니페스트에서 :

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

코드에서 :

etPassword.requestFocus();

0

나는 많은 방법을 시도했지만 제대로 작동하지 않습니다. 조각에서 편집 텍스트가 포함 된 활동으로 공유 전환을 사용하고 있기 때문에 확실하지 않습니다.

내 편집 텍스트는 LinearLayout으로 래핑됩니다.

포커스를 요청하기 위해 약간의 지연이 추가되었으며 아래 코드가 나를 위해 일했습니다. (Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showKeyboard ()

 val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

이 답변 중 어느 것도 스스로 작동하지 못했습니다. 나를위한 해결책은 그것들을 결합하는 것이 었습니다.

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

왜 그것이 저에게 필요한지 잘 모르겠습니다. 문서에 따르면 두 방법 모두 자체적으로 작동해야합니다.


이것은 좋은 습관이 아닙니다. 액티비티 또는 프래그먼트 트랜잭션이 소프트 키보드와 관련이 있거나 입력 방법 플래그가 올바르게 설정되지 않았지만 어느 쪽이든이 솔루션을 사용해서는 안됩니다.
— Marcel Bro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.