본문 바로가기

Android

안드로이드 폰트 변경한 커스텀 SearchView 만들기

SearchView

SearchView는 API Level 11부터 제공하는 안드로이드 위젯 중 하나로 사용자가 쿼리를 날리고 그와 대응하는 결과를 리스트로 보여주는 컴포넌트입니다.

폰트를 변경하여 생성한 커스텀 TextView, EditText은 많이 존재합니다. 하지만 SearchView 에서는 TextView, EditText와는 다르게 문자열만 들어간 단일 컴포넌트가 아니라 다수개의 이미지, 텍스트 등이 합쳐진 복합적인 요소입니다. 따라서 SearchView 내부의 텍스트를 변경하기 위해 추가적인 처리과정이 필요합니다.

SearchView를 상속하여 커스터마이징

제가 폰트를 변경할 대상은 텍스트를 입력하는 컴포넌트 입니다. SearchView를 상속하여 커스터마이징 하기 위해 안드로이드에서 만든 자체적인 SearchView클래스를 열어봅시다.

여러개의 필드 중 우리가 찾고있는 컴포넌트는 mSearchSrcTextView입니다. SearchView에서는 mSearchSrcTextViewR.id.search_src_text 아이디를 사용하여 객체를 가져옵니다. 우리가 커스터마이징 진행할 클래스에서도 이와 동일하게 객체를 가져온 뒤 폰트를 변경하면 쉽게 해결할 수 있습니다.

mSearchSrcTextView의 폰트를 변경하기 위해 SearchAutoComplete클래스를 열어보면 다음과 같이 구현되어있습니다.

SearchAutoCompleteTextView와 관련된 클래스를 상속받아 구현되어있는 것을 알 수 있습니다. 따라서 SearchAutoComplete클래스에서 폰트를 바로 변경할 수 있다는 것을 알 수 있습니다.

폰트를 변경하기 위한 커스터마이징 클래스틑 다음과 같습니다. SearchView에서 findViewById로 SearchAutoComplete객체를 찾는 과정을 동일하게 진행한 뒤 해당 객체의 폰트를 변경시켜 줍니다. 여기서 폰트를 변경시켜주는 과정은 생성자에서 진행을 합니다.

public class NotoSansSearchView extends SearchView {
    SearchAutoComplete searchAutoComplete;

    public NotoSansSearchView(Context context) {
        super(context);
        initUI();
        applyFont(context);
    }

    public NotoSansSearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initUI();
        applyFont(context);
    }


    public void initUI(){
        searchAutoComplete = (SearchAutoComplete)this.findViewById(R.id.search_src_text);
        searchAutoComplete.setHintTextColor(Color.BLACK);
        searchAutoComplete.setTextColor(Color.BLACK);
        searchAutoComplete.setAlpha(0.37f);
    }

    public void applyFont(Context context){
        final String language = Locale.getDefault().getLanguage();
        final String fontPath = language.equals("kr") ? "NotoSansKR-Regular-Hestia.otf" : "Roboto-Regular.ttf";
        final Typeface typeface = Typeface.createFromAsset(context.getAssets(), fontPath);
        searchAutoComplete.setTypeface(typeface);
    }
}

상속받은 SearchView에서 SearchAutoComplete를 아이디 R.id.search_src_text 를 통해 찾았습니다. 그 이후 생성자에서 폰트를 변경시켜주는 과정을 진행하였습니다.