Android Study

입력값을 Filter 와 Match 를 이용하여 Pattern 체크하기

85chong 2019. 1. 31. 18:08
728x90
반응형
SMALL


본인은 안드로이드에서 입력값을 필터로 걸러서 제한하는 경우가 있을때  Filter 또는 Matcher 사용한다.

이 기능을 조금 더 사용하기 쉽게 만들어놓은 코드가 있어서 적어본다.(종류별 패턴은 JAVA Study 에 몰아 넣겠다.)


- 상황 :

EditText et_input = findviewById(R.id.et_input);

et_input 에 이메일만 받고, 글자수는 최대 30자를 넘기게 하고싶지않다. 라고 가정한다면


- 방법 :

1. 먼저 필터를 쉽게 사용하기 위해  별도의 함수를 만든다.

2. 위의 함수를 입력창에 직접세팅 or 판단하는 함수를 이용해 판단후 처리한다.



- 코드 : 

1.  edt1 에는 Filter 를 이용해 숫자와 알파벳만 입력받게 

2. edt 에는 Match 를 이용해 이메일 형식인지 체크 할 수 있게끔 만들었다.





[전체코드]

public class CustomFilterMatch extends Activity {

EditText edt1,edt;
Button btn;
TextView tv;


String mstrEmailPattern = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";//Email 패턴
String mstrNumberEnglishPattern = "^[a-zA-Z0-9 ]+$";//영문&숫자 패턴


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);


tv = findViewById(R.id.tv);
edt1 = findViewById(R.id.edt1);
edt = findViewById(R.id.edt);
btn = findViewById(R.id.btn);

edt1.setFilters(customFilter(10));// 숫자와 알파벳만 입력가능하며, 최대 10글자 까지 입력가능하게 세팅

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

if(edt.getText().toString()!=null&&edt.getText().toString().length()>0){
// 버튼을 누르며 입력된 값이 이메일 형식인지 체크한다.
if(checkValidate(edt.getText().toString())){
tv.setText("checkValidate 성공");
}else{
tv.setText("이메일형식이 아닙니다.");
}

}

}
});
}


/*
방법 1
해당 입력값이 패턴에 부합하는지에 대한 판단여부 값을 반환하는 함수 / 맞으면 true , 틀리면 false 반
*/
public boolean checkValidate(final String inputData) {
Matcher matcher;
Pattern pattern = Pattern.compile(mstrEmailPattern);
if(inputData!=null&&inputData.length()>0){
matcher = pattern.matcher(inputData);
return matcher.matches();
}
return false;
}


/*
방법 2
해당 입력값에 패턴을 직접 세팅하여 입력하는 순간 자동으로 체크해주는 함수 / 맞으면 입력, 틀리면 입력이 안됨
*/
public InputFilter[] customFilter(int limit) {
InputFilter[] filters = new InputFilter[]{
//최대길이 제한
new InputFilter.LengthFilter(limit),
new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
Pattern ps = Pattern.compile(mstrNumberEnglishPattern);


// 문자를 클릭하고 띄는 순간 이쪽으로 입력값이 들어와서 매치시킨다.

if (!ps.matcher(source).matches()) {
return "";
}
return null;
}
}
};
return filters;
}

}


코드를 그대로 사용하면  edt1 에는 입력자체가 안될것이고, edt 는 btn 을 실행하여야만 결과값을 얻을수있다.


-끝-