AlertDialog.Builder를 EditText와 함께 사용할 때 소프트 키보드가 표시되지 않습니다.


117

입력 방법으로 EditText를 사용하여 입력 상자를 만들기 위해 AlertDialog.Builder 를 사용 하고 있습니다.

안타깝게도 소프트 키보드는 사용자가 명시 적으로 다시 터치하지 않는 한 EditText 에 포커스가 있어도 팝업되지 않습니다 .

강제로 터뜨리는 방법이 있습니까?

(AlertDialog.Builder) .show (); 후에 다음을 시도했습니다 . 그러나 아무 소용이 없습니다.

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

누구든지 도울 수 있습니까?

감사!!


1
소스 코드의 형식을 지정하십시오.
필립

그런 다음 나는 당신에게도 upvote :) 여러 시간 동안 동일한 문제 검색을했고 grine4ka의 마지막 답변은 훌륭하게 작동합니다
philipp

답변:


222

나는 그런 것을 만들었다

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

dialog.show();

3
정말 고맙습니다. 나는 지금 한동안 검색했고 이것이 당신이 가고 싶은 길입니다. 모든 OnFocusChangeListener접근 방식은 나에게 많이 보이며 문제를 일으킨다. 에서 만들어야 AlertDialog합니다 AlertDialog.Builder!
필립

이것이 정말로 해결책입니까? 이것은 입력 필드가 있는지 여부에 관계없이 입력 필드에 포커스가 있는지 여부에 관계없이 키보드가 표시되도록 강제합니다. =)
Ted

@Ted you 're right this one is not the real solution, but it works. I have trying to do such as the edittext in dialog and soft keyboard not appear.
grine4ka 2013

1
실제로 "해결"(해결 방법)을 관리합니다. EditText에 대해 setOnFocusChangeListener를 사용하고 onFocusChange에서 포커스가 있는지 확인하고 ( "hasFocus"var) 그렇다면 getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted

1
참고 :이 작업을 수행하려면 setSoftInputMode선을 앞에 배치해야합니다 dialog.show(). 그렇지 않으면 작동하지 않습니다. BTW 간단한 정확한 솔루션 +1
Spikatrix

29

나는 이것을 다음과 같이 해결할 수 있었다.

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

23

동일한 코드가 태블릿에서 제대로 작동하고 키보드가 표시되지만 전화에서는 표시되지 않으므로 더 자세히 조사해 보면 "조정"옵션을 가리키는 것 같습니다.

나는 이것을 사용하고 있으며 훨씬 더 깨끗하게 느껴집니다.

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();

감사. 이것은를 사용하는 것보다 낫습니다 SOFT_INPUT_STATE_ALWAYS_VISIBLE. 같이 SOFT_INPUT_STATE_ALWAYS_VISIBLE대화 상자의 UI 구성 요소를 차단하는 것입니다 SOFT_INPUT_ADJUST_RESIZE수있는 크기를 조정하고 대화 상자를 "밀어"할 수 있습니다.
Cheok 연의 쳉

10

제 경우에는 대화 상자가 표시 될 때 키보드를 표시 할 수있는 유일한 방법은 다음을 추가하는 것입니다 DialogFragment.

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

메모 SOFT_INPUT_STATE_ALWAYS_VISIBLE 대신 SOFT_INPUT_STATE_VISIBLE을 .

문서에서 :

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.

이것은 나를 위해 일한 유일한 솔루션이었고 많은 것을 시도했습니다. 내 것은 alertdialog 빌더의 dialogfragment 빌드였습니다. 중요한 부분은 위의 코드를 onResume ()에 배치하는 것 같습니다. 다른 곳에서는 작동하지 않았습니다!
user960914

6

onCreateDialog에서 AlertDialog를 사용하여 만든 Dialogue를 표시하기 위해 showDialog를 호출 할 때

여기에 코드를 입력해야합니다.

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View v, boolean hasFocus) {
         if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
         }
       }
    });

}

5

여기에 훨씬 더 나은 솔루션이 제공 됩니다 .

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

해결 방법이 없습니다. EditText예상대로 작동합니다.


이것은 나를 위해 일했고 다른 솔루션은 초점을 맞추었지만 keybord가 표시되지 않았습니다.
Akshay

2
Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

이것은 이미 여기 에서 대답 되었습니다 . OnFocusChangeListener를 사용하면 저에게 효과적이었습니다.


이 질문은 AlertDialog.Builder 개체에 대해 소프트 입력 모드를 설정하는 방법을 묻지 만 참조하는 스레드는 AlertDialog 개체를 사용하는 예제를 제공합니다. 제안 된 코드 (OnFocusChangeListener 내에서 alert.getWindow (). setSoftInputMode (...) 사용)를 사용하려고하면 AlertDialog.Builder 유형에 대해 getWindow () 메소드가 정의되지 않은 Eclipse 객체입니다. 이 문제를 해결하도록 도와 주시겠습니까?
prepbgg

1

제 경우에는 대화 상자를 표시하기 전 (생성 후)을 설정했을 때 SoftInputMode가 표시되지 않았습니다. 아래 코드는 대화 상자를 표시 한 후 SoftInputMode를 설정 한 곳에서 저에게 효과적이었습니다.

Kotlin :

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

자바:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

나와 같은 문제를 겪고있는 모든 사람에게 도움이되기를 바랍니다.


0

이것을 시도해보십시오.

소프트 키보드를 표시하려면 :

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

그리고 그것을 숨기고 싶다면 :

  InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(input.getWindowToken(), 0);

0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

1
OP와 미래의 독자들에게 더 유용한 답변을 제공하기 때문에 코드에 컨텍스트 / 설명을 포함하는 것이 좋습니다.
EJoshuaS-Monica 복원

0

AlertDialog.onCreate가 호출 된 후 EditText가 추가되면이 문제가 발생합니다.

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

AlertDialog 클래스는 대화 상자의 뷰가 View.onCheckIsTextEditor ()에서 true를 반환하는지 여부에 따라 android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM을 자동으로 설정합니다.

FLAG_ALT_FOCUSABLE_IM 플래그를 지워야합니다.

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

AlertDialog.show는 DialogFragment.onStart에서 호출되므로 DialogFragment.onStart에 코드를 삽입 할 수 있습니다.

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

또는 DialogFragment를 사용하지 않는 경우 Dialog.setOnShowListener를 사용할 수 있습니다.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.