회사에서 급하게 안드로이드 프로젝트에 투입되었는데, 외주로 오신 분이 주신 리사이클러뷰를 사용한 비디오 슬라이딩 뷰 작업 하신거에 버튼을 추가할 일이 생겼다.
그런데 엥? 버튼의 테마가 안드로이드 스튜디오의 Design뷰에서는 잘 나오는데 실제로 실행하니 기본 안드로이드 테마가 아니라 아주 예전에 쓰던 회색 바탕의 못생긴 버튼이 출력되었다.
위 영상을 보면 BUTTON IN MAIN 버튼은 VideoPage2 바깥, 즉 리사이클러 뷰 바깥에 메인엑티비티 쪽에서 생성한 것이다. 테마가 잘 적용되었다.
그런데 Page 로 시작하는 버튼들은 리사이클러뷰 안에 있는 버튼이고 내가 아무 스타일도 주지 않았으니 같은 테마여야 하는데 저렇게 나왔다.
구글에 정말 모든 가능한 키워드 조합으로 검색해봐도 저런 경우가 없어 아 그냥 시간도 없는데 이미지를 입혀버릴까 생각했지만 우선 할 수 있는데까지는 해보기로 했다.
집에 와서까지 붙들고 늘어지다가.... 결국 해결했다.
(역시 진심을 다 하면 되는것인가)
그건 바로 RecyclerView.Adapter를 상속받는 커스텀어댑터 클래스에서 onCreateViewHolder 메소드에서 LayoutInflater.from(context) 이 놈이었다.
public class ViewPagerAdapter extends RecyclerView.Adapter<ViewPagerAdapter.ViewHolderPage> {
private ArrayList<DataPage> listData;
private final Context mContext;
ViewPagerAdapter(ArrayList<DataPage> data, Context context) {
this.listData = data;
this.mContext = context;
}
@Override
public ViewHolderPage onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_viewpager, parent, false);
return new ViewHolderPage(view);
}
...
}
그 외주하시는 분께서 동영상 작업 때문에 생성자에서 context를 받으셨는데, 이를 inflate하는데 사용하셨다. 그런데 다른 리사이클러뷰를 활용하는 코드에는 모두 아규먼트의 parent.getContext()를 from의 파라미터로 넘겨주길래 이부분을 바꿔봤더니 정상적으로 테마가 적용되었다...
정말 못할 줄 알았는데 집에서 소리질렀다.
public class ViewPagerAdapter extends RecyclerView.Adapter<ViewPagerAdapter.ViewHolderPage> {
private ArrayList<DataPage> listData;
private final Context mContext;
ViewPagerAdapter(ArrayList<DataPage> data, Context context) {
this.listData = data;
this.mContext = context;
}
@Override
public ViewHolderPage onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
View view = LayoutInflater.from(context).inflate(R.layout.item_viewpager, parent, false);
return new ViewHolderPage(view);
}
...
}
위는 정상작동 코드이다.
솔직히 이유는 정확히 모르겠다.
하지만 추측컨데 parent에서 getContext로 얻은 콘텍스트는 parent Activity에서 온 것이고 필드 값으로 저장한 콘텍스트는 생성시 getActivity().getApplicationContext()로 얻은 어플리케이션 콘텍스트라서 UI 관련한 정보가 없어서 그랬던게 아닐까 생각해본다.
'개발 관련 이야기' 카테고리의 다른 글
Android Navigation action 사용하기 (2) | 2022.10.30 |
---|---|
Android Navigation 사용하기 (0) | 2022.10.09 |
Aparche Spark :: pyspark RDD를 이용하여 간단한 예제 풀어보기 (0) | 2022.09.12 |
FaceNet 논문 리뷰 (0) | 2022.09.05 |
AWS Athena vs. EMR vs. Redshift 비교 (0) | 2022.09.04 |
댓글