안녕하세요- 여러분- 예전부터 고심해왔던 문제인데 워낙 내공이 부족하여 해결책을 찾지 못하고 있습니다.
당면한 문제는 TAB의 외관 스타일을 변경하는 가운데 2.2버전과 2.1버전에서의 변경 메소드간의 차이가 있기에
각 버전에서 정상 작동하기 위해선 어떻게 코딩을 해야 하는지 여러분의 의견을 듣고 싶어 질문하게 되었습니다
우선 TAB이 변경된 간단한 이미지와 각 버전간의 소스를 올려보도록 하겠습니다.
1. 이미지 - 기본 탭 스타일 -> 변경된 탭 스타일
2. Tab 변경 코드
Code lower. 2.1버전 - 탭위젯의 필드 변수를 받아와서 강제로 변경하는 식으로 적용
Field bottomLeftStrip; Field bottomRightStrip; try{ bottomLeftStrip = tw.getClass().getDeclaredField("mLeftStrip"); bottomRightStrip = tw.getClass().getDeclaredField("mRightStrip"); if(!bottomLeftStrip.isAccessible()) { bottomLeftStrip.setAccessible(true); } if(!bottomRightStrip.isAccessible()){ bottomRightStrip.setAccessible(true); } bottomLeftStrip.set(tw, getResources().getDrawable(R.drawable.tab_line)); bottomRightStrip.set(tw, getResources().getDrawable(R.drawable.tab_line)); } catch (Exception e) { e.printStackTrace(); }
Code Higher. 2.2버전 이상 - setStripDrawable메소드를 이용하여 적용
TabWidget tw = tabHost.getTabWidget(); tw.setLeftStripDrawable(R.drawable.tab_line); tw.setRightStripDrawable(R.drawable.tab_line); tw.setStripEnabled(true);
2.2버전 이상에서는 간단하게 규격화된 메소드를 사용하면 되지만, 2.1버전이하에서는 클래스와 필드 변수를 받아와서 변경시켜주는 다소 위험한(?) 방식을 취하고 있습니다.
제가 하고자하는 것은 2.2버전의 기기에서는 Code Higher.를 사용하고 2.1버전의 기기에서는 Code Lower.를 사용하게 하려고 하는데
다음과 같이 코드를 짜게 될 경우 2.2에서야 문제가 없지만 2.1에서는 강제 종료되지 않나요? 혹은 정상 처리 되나요?
try{ 2.2코드 실행 }catch(ClassNotFoundException e){ 2.1코드 실행 }
if(android.os.Build.Version.SDK_INT > 7){ 2.2코드 실행 }else{ 2.1코드 실행 }
이렇게 버전에 따른 실행 관리 조건문을 통해 상위 버전 코드에 대한 접근성을 막아줌으로서 강제 종료를 사전에 막는 방법이 통할까요?
구글링을 통해 위 경우에 대한 해결책이 wrapper class(다소 복잡하나 최선), reflection(간단하나 오로지 디버그용)가 있다는 것을 알게 되었고 어떻게 적용해야 하는지 공부중에 있습니다. 그리고 이 방법이 최선책인지 어떻게 해결해나가야 할지 방향성을 잡기 위해 여러분께 도움을 요청합니다.