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.