Custom Spinner는 TopView, DropView(DropDown)등을 내 임의에 맞게 변경하면서
다양한 스피너를 만드는데 도움이 많이 됐다.
생성 방법을 정리하고 나중에 github에 올릴 예정!
내가 작업하면서 썼던 Spinner 옵션은 아래와 같다
<Spinner
android:gravity="center"
android:id="@+id/sp_workbook_display_setting"
android:layout_width="182dp"
android:layout_height="40dp"
android:spinnerMode="dropdown"
android:layout_marginRight="16dp"
android:dropDownVerticalOffset="50dp"
android:theme="@style/ThemeOverlay.AppCompat.Light"
android:src="@drawable/btn_white_gray_round_radius_5dp"
android:popupBackground="@android:color/transparent"
android:dropDownWidth="590dp"/>
dropDownVerticalOffset : DropDown의 Vertical위치를 조정할 수 있다.
예를 들어 스피너 바로 밑이 아닌 간격을 두고 DropDown를 띄울 수 있다.
popupBackground : DropDown를 투명하게 띄울 수 있다.
내 경우는 커스텀한 DropDown의 모양이 말풍선이라서 이 값을 투명하게 하고
DropDown에 쓰는 Layout에 background(말풍선)를 줬다.
dropDownWidth : 이 값을 설정하지 않으면 DropDown에 쓸 Layout크기가 아무리 커도 스피너 크기에 맞게 띄워진다.
스피너 크기와 상관없이 DropDown를 띄우고 싶어서 쓰게 되었다.
src는 스피너의 모양을 변경하려는데 썼다. (화살표, 버튼모양의 스피너 )
검색으로는 나인패치로 한다고 하는데 우선 xml로 해본 상태. 원하는 모양으로 하려면 나인패치로 해야겠다.
SpinnerCustomAdapter 생성하기
public class ProblemDisplaySpinnerAdapter extends ArrayAdapter<String> implements SpinnerAdapter{
Context mContext;
LayoutInflater mInflater;
List<String>items;
int dropResource;
int topResource;
String topTitle;
public ProblemDisplaySpinnerAdapter(@NonNull Context context, int resource, @NonNull List<String> objects, String Title) {
super(context, resource, objects);
this.mContext = context;
this.mInflater = LayoutInflater.from(context);
this.items = objects;
this.topResource = resource;
this.topTitle = Title;
}
@Override
public int getCount() {
return items.size();
}
@Nullable
@Override
public String getItem(int position) {
return super.getItem(position);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return createTopView(position, convertView, parent); // top layout 설정
}
// DropDown Layout set
@Override
public void setDropDownViewResource(int resource) {
super.setDropDownViewResource(resource);
this.dropResource = resource;
}
@Override
public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return createDropView(position, convertView, parent);
}
// DropDown Set
private View createDropView(int position, View convertView, ViewGroup parent) {
final View view = mInflater.inflate(dropResource, parent, false);
return view;
}
// TopView Set
private View createTopView(int position, View convertView, ViewGroup parent) {
final View view = mInflater.inflate(topResource, parent, false);
TextView tv_title = (TextView) view.findViewById(R.id.tv_workbook_toolbar_title);
tv_title.setText(topTitle);
return view;
}
내가 구현한 스피너 형태는
스피너의 item 1개 안에 custom한 layout을 넣는 구조다.
그래서 스피너를 누르면 여러개의 item이 아닌 한 item만 뜬다.
spinnerList = new ArrayList<>();
spinnerList.add("index1");
String setTitle = "정렬/보기 방식";
displaySpinnerAdapter = new ProblemDisplaySpinnerAdapter(getApplicationContext(),R.layout.item_workbook_display_spinner_top,spinnerList,setTitle);
displaySpinnerAdapter.setDropDownViewResource(R.layout.item_workbook_display_spinner_drop_down);
sp_workbook_display_setting.setAdapter(displaySpinnerAdapter);
sp_workbook_display_setting.setSelection(0);
spinner가 setAdapter을 할 때 가져오는 값들
Context
List<String> items (크기를 1개로 고정)
topview에 쓸 layout resource
spinner title
serAdapter 이후 setDropDownViewResource를 호출해서 DropDown에 쓸 layout resource 세팅
'개발 공부 > Android' 카테고리의 다른 글
[Android Java] 기본 Spinner 구현하기 (0) | 2020.06.21 |
---|---|
[Android]안드로이드 스튜디오(Android Studio)에서 SHA-1값 확인 하는 방법 (0) | 2019.05.22 |
[Android Kotlin] 코틀린 Annotations (어노테이션) (0) | 2019.01.13 |
[Android Java] Java project에 Kotlin 추가하기 (0) | 2019.01.12 |
[Android Java]ListView에서 Clik, LongClick 중복 사용 (0) | 2018.03.14 |