실패 이야기 - MVVM Pattern in Android

안드로이드를 하면서 새로운 도전중 관심이 생긴 MVVM과 같은 패턴에도 신경을 쓰기 시작했다. 마침 좋은 안드로이드 지원 라이브러리, Plugin이 있어서 적용하였지만 생각보다 별로인 부분이 상당히 있었다.

처음 시작할 때는 AndroidAnnotation을 이용하였고 View Inject에 많은 도움을 받았지만 ANT부분에 상당한 자원이 소모되는지 빌드시간이 너무 길고, 중간중간 빌드를 통해 Activity_.class와 같이 _클래스를 생성해줘야해서 불편했다.`

그다음 선택한 방식은 디자인 패턴을 알아보다가 알게된 Android Data Binding이다. Gradle Plugin을 이용한 백그라운드로 알아서 Bind가능한 클레스를 만들어주고, 최근(??)기술이라 빌드속도에도 문제가 적었다. 또한 View Binding으로 XML에서 로직을 다룰 수 있다는 점에서 맘에 들었다. 하지만 Pure한 뷰가 아니라 유지보수가 힘들고????? 먼가 깔끔하지 않았다.

Binding Adapter를 남용하는 느낌이 들었을때 그냥 맘에 안들게 되었고, 본격적으로 Kotlin을 시작하게되면서 사용하지 않게되었다. Kotlin에 Data Binding라이브러리가 충돌?나면서 안쓰게 되었습니다.

Binding Adapter이지만 남용한 느낌이 물씬드는 코드들이다.

1. TextView

Html Text Setting

@BindingAdapter({"app:html"})
public static void setTextHtml(TextView textHtml, String html) {
    Spannable spannable = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
        spannable = (Spannable) Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
    } else {
        spannable = (Spannable) Html.fromHtml(html);
    }
    textHtml.setText(spannable, TextView.BufferType.SPANNABLE);
}
// viewDataBinding.setTextHtml(“<u>underline</u>”);

2. RecyclerView

Set adapter

@BindingAdapter({"app:adapter"})
public static void setAdapter(RecyclerView recyclerView, RecyclerView.Adapter adapter) {
    recyclerView.setAdapter(adapter);
}

Set Layout Manager

@BindingAdapter({"app:layoutManager"})
public static void setLayoutManager(RecyclerView recyclerView, int spanCount) {
    switch (spanCount) {
        case 0 :
            recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
            break;
        default:
            recyclerView.setLayoutManager(new GridLayoutManager(recyclerView.getContext(), spanCount));
    }
}

3. EditText

Two way binding

@BindingAdapter(value = {"app:text"})
  public static void setText(EditText editText, ObservableString observableString) {
      editText.addTextChangedListener(new TextWatcher() {
          @Override
          public void beforeTextChanged(CharSequence s, int start, int count, int after) {

          }

          @Override
          public void onTextChanged(CharSequence s, int start, int before, int count) {
              observableString.set(s.toString());

          }

          @Override
          public void afterTextChanged(Editable s) {

          }
      });

      String newValue = observableString.get();
      if (!editText.getText().toString().equals(newValue)) {
          editText.setText(newValue);
      }
  }

4. ViewPager

Set adapter

@BindingAdapter({"app:adapter"})
public static void setAdapter(ViewPager viewPager, PagerAdapter adapter) {
    viewPager.setAdapter(adapter);
}

Set onPageChangeListener

@BindingAdapter({"app:onPageChange"})
public static void addOnPageChangeListener(ViewPager viewPager, ViewPager.OnPageChangeListener listener) {
    viewPager.addOnPageChangeListener(listener);
}

Read more

높은 하늘

높은 하늘

요즘 밖을 나가면 매일 하늘이 푸르고 맑아 참 높다. 전 세계를 뒤덮은 질병이 이러한 맑고 높은 하늘을 만들었기에 아이러니하다. 질병은 전 세계를 뒤덮고 가족과 지인,  모두를 이간질하며 거리두게하였고 질병은 오프라인 기반 사업하던 우리 회사를 속되게 표현하여 쫄딱 망하게 하였다. 결국 우리 팀원도 20명에서 3명으로 줄었으며 큰 짐을 짊어지게 되었다. 아이러니하게

By Nine

탈고리즘 (1)

자는 시간을 제외한 하루의 대부분을 유튜브를 켜두고 지내왔다. 일어나서는 뉴스, 최신 소식을 듣고 보며 음악도 유튜브로 듣고 퇴근 후 저녁에는 구독한 채널들이 올리는 영상들을 시청하며 하루를 보냈다. 매달 유튜브를 시청하며 사용하는 60GB의 데이터는 훈장과 같았다. 가끔 습관적으로 유튜브를 켜는 것에 자괴감이 올때도 있었지만 넓고 다양한 주제의 정보를 자연스럽게 얻을 수

By Nine
어쩌면 당연한 것

어쩌면 당연한 것

전 회사에서 무엇을 해야 하는지 애매한 상황에 난 담담하게 내 할 일을 했다. 당연하다고 생각했던 react + webpack 도입이나 인프라 정리, 테스트 코드 기반 작업, 공통 모듈 라이브러리화, 레거지와 주석 코드 정리를 했다. 생각보다 오랜기간동안 진행했고 그때 스트레스를 많이 받았다. 다시 당연하다고 생각했던 것들을 해야 할 시간이다. 하지만 과거에 내가 했던

By Nine
IntelliJ .properties 파일 인코딩 오류

IntelliJ .properties 파일 인코딩 오류

어느 순간부터 IntelliJ에서 .properties 파일 인코딩이 깨지는 이슈가 생겼습니다. 원래는 하단 메뉴바에 인코딩 옵션을 선택해서 파일 인코딩을 수정할 수 있었지만 하단 메뉴바에서도 수정할 수 없게 되었습니다. 하단에 파일 인코딩 수정 메뉴message.properties 파일 인코딩은 utf-8 이지만 ISO-8859-1 으로 수정이 불가능 합니다. 이럴 경우 맥 OS 기준으로 ⌘ command + ⇧ shift + a (Find

By Nine