EditText
by 민갤
EditText 와 Click 해서 문구를 바꾸는 TextView를 같이 사용하다 접한 코드들을 적어둡니다.
자동 Focus
EditText 자동 Focus 막기
Activity를 실행하면 EditText로 Focus가 자동으로 간다.
화면을 켜자마자 키보드와 깜박이는 커서를 보고 싶지 않다면 자동 Focus를 막기 위해
EditText를 감싸고 있는 상위 Layout에 Focus를 준다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
...
android:focusable="true"
android:focusableInTouchMode="true">
<EditText
.../>
</LinearLayout>
focusable: boolean. Focus를 받게 할 것인가? Focus를 받을 수 있게 할 것인지 정하는 속성.
focusableInTouchMode: boolean. Focus를 받을 수 있는가? TouchMode에서 Focus를 받을 수 있는 지 확인할 수 있도록 설정하는 속성.
Cursor
EditText를 사용하고 난 후 TextView를 Click 했을 때
Focus가 EditText에 그대로 존재하여 Cursor가 사라지지 않는 문제를 해결한 방법
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
TextView tv = (TextView) findViewById(R.id.tv);
EditText edt = (EditText) findViewById(R.id.edt);
tv.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
edt.clearFocus();
}
});
}
}
clearFocus: 해당 EditText에 위치한 Focus를 해제한다. Cursor는 사라지지만 키보드는 그대로 남아있다.
키보드 내리기
EditText 외의 장소를 Touch 했을 때 키보드를 내리는 방법
Listener 에 InputMethodManager.hideSoftInputFromWindow(windowToken, int)를 추가한다.
필자는 TextView를 Click 했을 때 키보드가 내려가도록 했다.
private InputMethodManager inputMMg;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
TextView tv = (TextView) findViewById(R.id.tv);
EditText edt = (EditText) findViewById(R.id.edt);
tv.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
inputWindowHide();
}
});
private void inputWindowHide() {
inputMMg = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputMMg.hideSoftInputFromWindow(edt_money.getWindowToken(), 0);
}
}
Focus에 따른 키보드 내리기
EditText가 Focus를 잃을 때 키보드도 같이 사라지게 하는 방법.
private InputMethodManager inputMMg;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
EditText edt = (EditText) findViewById(R.id.edt);
edt.setOnFocusChangeListener(new EditText.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (!b) {
inputWindowHide();
}
}
});
private void inputWindowHide() {
inputMMg = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputMMg.hideSoftInputFromWindow(edt.getWindowToken(), 0);
}
}
setOnFocusChangeListener: 해당 View의 Focus 변화에 따른 Event 처리.
EditText의 ClickListener는 EditText를 두 번 Click해야 Event가 처리되는 문제를 발견했는데
FocusChangeListener와 ClickListener를 두 개다 적용했을 때 Focus가 먼저 실행되고 Click이 실행됐다.
해서 필자는 ClickListener를 지우고 FocusChangeListener만을 사용했다.
키보드 입력 막기
EditText를 Click 했을 때 키보드 입력창이 나오지 않게 하는 방법
EditText edt = (EditText) findViewById(R.id.edt);
edt.setKeyListener(null);
키보드 보이기
EditText edt = (EditText) findViewById(R.id.edt);
InputMethodManager inputMMg = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputMMg.showSoftInput(edt, InputMethodManager.SHOW_IMPLICIT);
만일 위의 코드가 먹히지 않는 다면 딜레이를 주어야 한다.
EditText edt = (EditText) findViewById(R.id.edt);
new Handler().postDelayed(new Runnable() {
public void run() {
inputMMg = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputMMg.showSoftInput(edt, InputMethodManager.SHOW_IMPLICIT);
}
}, 100);
특정 Focus
여러 개의 EditText들 중 특정 EditText에 Focus를 두고 싶을 때 사용하는 방법.
입력 순서를 임의로 지정할 수 있다.
특이점은 XML에서 정의할 때 태그 선언 사이에 넣어야 한다는 것이다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ...>
<EditText
...>
<requestFocus>
</EditText>
</LinearLayout>
EditText edt1 = (EditText) findViewById(R.id.edt1);
EditText edt2 = (EditText) findViewById(R.id.edt2);
edt2.requestFocus();
현재 Focus
현재 Focus 된 View 알아 내는 방법
Log.d("TAG", "focus: " + getCurrentFocus());
키보드와 화면의 상호작용
키보드가 나타날 때 화면이 재조정 되는 것을 막는 방법 & 키보드와 화면 간의 상호작용 방법 지정
AndroidManifest.xml에서 키보드 상태를 바꿀 Activity 태그 안에 다음 코드를 추가한다.
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<application
...
<activity
...
android:windowSoftInputMode="adjustPan"/>
</application>
</manifest>
adjustPan: 키보드가 보여질 공간을 확보하기 위해 화면을 재조정하는 과정을 수행하지 않는다. 대신, Focus를 가진 View가 보일 수 있도록 화면을 이동한다.
adjustResize: 키보드가 보여질 공간을 확보하기 위해 화면을 재조정한다.
adjustUnspecified: 키보드 조정에 대한 default 값. 시스템이 자동으로 Pan, Resize를 판단하여 설정한다.
stateAlwaysVisible: Acitivty 실행 시 항상 키보드가 나타난다.
stateVisible: Acitivty 실행 시 키보드가 나타난다.
stateAlwaysHidden: Acitivty 실행 시 항상 키보드가 자동으로 나타나지 않게 한다.
stateHidden: Acitivty 실행 시 키보드가 자동으로 나타나지 않게 한다.
stateUnchanged: 키보드의 마지막 상태를 유지한다.
stateUnspecified: 키보드 상태에 대한 default 값. 시스템이 자동으로 설정한다.
Enter키
EditText의 Enter 기능 지정.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ...>
<EditText
...
android:imeOptions="actionDone"/>
</LinearLayout>
edt.setImeOptions(EditorInfo.IME_ACTION_DONE);
normal: 특별한 기능 없음.
actionUnspecified: 특별한 기능 없음.
actionNone: 특별한 기능 없음.
actionGo: 이동. 입력한 Text(ex:URL)로 이동한다.
actionSearch: 검색. 입력된 Text의 검색 결과로 이동한다.
actionSend: 보내기. 입력된 Text를 대상에 전달한다.
actionNext: 다음. 다음 필드(ex:다음 EditText)로 이동한다.
actionDone: 완료. 입력을 끝내고 키보드를 닫는 다.
actionPrevious: 이전. 이전 필드로 이동한다.
(flag는 동작은 제대로 확인하지 못해 생략합니다.)
Enter Event
EditText의 Enter를 눌렀을 때 Event.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
edt.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
if (i == EditorInfo.IME_ACTION_NEXT) {
Toast.makeText(getApplication(), "다음", Toast.LENGTH_SHORT).show();
}
return false;
}
});
}
}
Enter키의 변화에 따라 Event를 다르게 적용할 수도 있다.
Tip
숫자 천 단위마다 콤마(,) 찍기
NumberFormat.getInstance().format(Int number);