태그 보관물: EditText

오늘의 삽질 – AlertDialog의 EditText에 키보드 보여주기

AlertDialog에 넣었던 EditText에서 포커스는 가있어도 소프트웨어 키보드가 나타나지 않는 증상이 있어서
구글링을 통해 온갖 키보드를 나타내기 위한 시도를 하였다.

final View innerView = View.inflate(MainActivity.this, R.layout.name_edit_popup, null);
final EditText editText = (EditText)innerView.findViewById(R.id.nameEdit);
 
final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
	.setCustomTitle(innerView)
	.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
 
		@Override
		public void onClick(DialogInterface dialog, int which) {
			// something
		}
	}).create();
 
// 시도 1
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
 
// 시도 2
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);
        }
    }
});
 
// 시도 3
dialog.setOnShowListener(new OnShowListener() {
 
    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});
 
dialog.show();

그런데도 키보드가 나타나지 않아서 멘붕하고 있었는데…


...
final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
.setCustomTitle(innerView)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
...

setView가 아니라 setCustomTitle을 사용하고 있었음을 발견하였다…

CustomTitle에 넣은 EditText에서는 키보드를 보여주지 않는 듯하니 참고하길

EditText에서 키 이벤트 처리

EditText에서는 OnKeyListener로 back키나 Enter키 입력은 받을 수 있는데
문자열같은 일반적인 키입력은 이벤트로 넘어오지 않습니다.

이런 이벤트를 받으려면 TextWatcher라는 것을 써야하더군요.

간단히 TextWatcher를 구현해서 EditText에 addTextChangedListener()를 해주면 됩니다.

TextWatcher textWatcher = new TextWatcher() {

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count, int after) {
		// 텍스트가 변경되기전 입력한 내용에 대해
		// s는 변경할 수 없음
	}

	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// 텍스트를 변경된 후 변경 사항과 함께
		// s는 변경할 수 없음
	}

	@Override
	public void afterTextChanged(Editable s) {
		 // 텍스트가 변경된 후. 변경 사항은 알 수 없음
		// s는 변경 가능. 하지만 위 함수들이 다시 콜백됨을 유의
	}

};

editText.addTextChangedListener(textWatcher); // EditText인 editText에 textWatcher를 핸들러로 등록