[android] AlertDialog에서, 이미지 포함된 다중선택 화면 만들기
역시나.. 전에 개발하던 프로그램에서.. 다중선택하는 화면이 있었는데..
일단 alertdialog를 이용해서 간단히 만들었는데..
이왕이면 이미지도 같이 표현됐으면 좋겠다 생각해서.. 며칠 자료찾아보고 했던적이 있다.
역시나.. 한번 정리해서 올려놔야지.. 했었는데..
너무 지나서.. 생각이 잘…
그래도 몇줄 끄적여 놓는다.
일단 결과화면
이런식으로.. 화면에 표시될 항목들을 선택해주는 화면을 만들꺼다.
일단.. 기본적인 AlertDialog.Builder 사용법은 다른곳에서 읽어보고 오시길..
검색버튼을 클릭하면.. 선택 화면을 띄워줄 메소드를 호출작성한다. 다음과 같이 만들었다.
protected void changeDisplayLegend() { // 이미지, 항목, 선택박스를 출력할 ListAdapter 만들기.. 나중에 따로 선언해줌(뒤에 코드 있음). LegendListAdapter lstAdptrLgnd = new LegendListAdapter(HappyMapActivity.this, R.layout.select_legend_item, Arrays.asList(Constants.FACIL_TYP_STRINGS)); // 범례 선택창을 띄운다. AlertDialog.Builder alert = new AlertDialog.Builder(HappyMapActivity.this); alert.setTitle("표시항목 선택"); // adapter setting alert.setAdapter(lstAdptrLgnd, null); alert.setPositiveButton("적용", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub saveSPrfLgnd(); // 화면 갱신 initOverlay(); } } ); alert.setNegativeButton("취소", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub // 기존에 저장된 값으로 롤백 loadSPrfLgnd(); } } ); alert.show(); }
제일 중요한 부분일듯.. 선택항목을 뿌려줄 listadpater부분
protected class LegendListAdapter extends ArrayAdapter<String> { private Context context; private ViewHolder holder; // 자료를 저장할 클래스를 만든다. class ViewHolder { int position; ImageView icon; CheckedTextView title; }; public LegendListAdapter(Context context, int textViewResourceId, List<String> objects) { super(context, textViewResourceId, objects); // TODO Auto-generated constructor stub this.context = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; // 선택항목 하나에 대한 view의 레이아웃 설정 if(row == null) { LayoutInflater inflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); row = inflator.inflate(R.layout.select_legend_item, null); } // 해당항목의 정보를 Holder를 만들어서 저장한다. holder = new ViewHolder(); // 레이아웃에서 출력할 위젯을 찾아낸다. holder.icon = (ImageView)row.findViewById(R.id.ivItemLgndIcon); holder.title = (CheckedTextView)row.findViewById(R.id.ctvItemLgndTitle); holder.position = position; if(position<Constants.FACIL_TYP_STRINGS.length) { // 표시값 세팅 holder.icon.setImageDrawable(getResources().getDrawable(Constants.FACIL_TYP_ICON_IDS[position])); holder.title.setText(Constants.FACIL_TYP_STRINGS[position]); holder.title.setChecked(bDisplayLegend[position]); } // holder를 저장해놓는다. row.setTag(holder); // 클릭했을경우, 선택, 비선택 작업 row.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub ViewHolder holder = (ViewHolder)v.getTag(); holder.title.toggle(); // 선택값을 저장한다. (그냥 단순 boolean array를 전역변수로 잡아서 사용했다.) bDisplayLegend[holder.position]=holder.title.isChecked(); } }); return(row); } }
아래는.. 참고사항..
선택했을 완료했거나, 취소했을경우.. 선택된 값(현재는 그냥 전역변수 boolean array에 저장)을 프리퍼런스에 저장하거나 불러온다.
protected void loadSPrfLgnd() { // SharedPreferences에서 범례 출력 사항을 불러온다. if(sprfMapLegend==null) { sprfMapLegend = getSharedPreferences("map_dsply_lgnd", MODE_PRIVATE); } for(int i=0; i<Constants.FACIL_TYP_STRINGS.length; i++) { bDisplayLegend[i] = sprfMapLegend.getBoolean(Constants.FACIL_TYP_STRINGS[i], false); } } protected void saveSPrfLgnd() { // SharedPreferences에서 범례 출력 사항을 저장한다. if(sprfMapLegend==null) { sprfMapLegend = getSharedPreferences("map_dsply_lgnd", MODE_PRIVATE); } SharedPreferences.Editor editor = sprfMapLegend.edit(); for(int i=0; i<Constants.FACIL_TYP_STRINGS.length; i++) { editor.putBoolean(Constants.FACIL_TYP_STRINGS[i], bDisplayLegend[i]); } // 저장 editor.commit(); }
할때는 되게 해매면서 했는데…
정리하니.. (정리라기 보단.. copy&paste) 그리 내용이 많진 않네..
역시나 잘 이해안되는 부분은 댓글 다시길.. ^^
(추가) 설명이 조금 부족한것 같아서.. 몇가지 부속파일들 내용을 올린다.
우선.. select item의 layout file..
select_legend_item.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="6dp"> <ImageView android:id="@+id/ivItemLgndIcon" android:layout_width="32dp" android:layout_height="32dp" android:layout_centerVertical="true" android:layout_gravity="center_vertical" android:layout_marginLeft="5dp" android:layout_marginRight="15dp" /> <CheckedTextView android:id="@+id/ctvItemLgndTitle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_toRightOf="@id/ivItemLgndIcon" android:checkMark="?android:attr/listChoiceIndicatorMultiple" android:clickable="false" android:gravity="center_vertical" /> </RelativeLayout>
Constants의 몇가지 값
public class Constants { public static final String FACIL_TYP_SENIORCENTER = "경로당"; public static final String FACIL_TYP_ELDERYCARE = "노인요양시설"; public static final String FACIL_TYP_ELDERYFACIL = "노인일반시설"; public static final String FACIL_TYP_WOMEN = "여성복지시설"; public static final String FACIL_TYP_YOUTH = "아동청소년시설"; public static final String FACIL_TYP_NURSERY = "보육시설"; public static final String FACIL_TYP_DISABLED = "장애인시설"; public static final String FACIL_TYP_SELFSUPPORT = "자활고용시설"; public static final String FACIL_TYP_HOSPITAL = "병의원"; public static final String FACIL_TYP_OVERALL = "종합시설"; public static final String FACIL_TYP_ETC = "공공기관 등"; public static final String[] FACIL_TYP_STRINGS = { FACIL_TYP_SENIORCENTER, FACIL_TYP_ELDERYCARE, FACIL_TYP_ELDERYFACIL, FACIL_TYP_WOMEN, FACIL_TYP_YOUTH, FACIL_TYP_NURSERY, FACIL_TYP_DISABLED, FACIL_TYP_SELFSUPPORT, FACIL_TYP_OVERALL, FACIL_TYP_ETC }; // select list에 찍어줄 이미지 Resource ID public static final int[] FACIL_TYP_ICON_IDS = { R.drawable.icon_seniorcenter, R.drawable.icon_elderycare, R.drawable.icon_elderyfacil, R.drawable.icon_women, R.drawable.icon_youth, R.drawable.icon_nursery, R.drawable.icon_disabled, R.drawable.icon_selfsupport, R.drawable.icon_overall, R.drawable.icon_gurilogo }; }