반응형
onPrepareDialogBuilder 는 Dialog 가 보여지기 전에 실행되는 메소드 입니다.
DialogPreference 에 존재하고 있으며 AlertDialog.Builder 를 만들고 설정 후에 onPrepareDialogBuilder로 넘겨 줍니다.
이 받은 Builder는 아마도... 그냥 객체만 생성된 것 같습니다. 메소드를 비워두면 아무것도 안 뜨는 것을 알 수 있습니다.
package android.test; import android.app.AlertDialog; import android.content.Context; import android.preference.ListPreference; import android.util.AttributeSet; public class ColorListPreference extends ListPreference { public ColorListPreference(Context context, AttributeSet attrs) { super(context, attrs); } public void onPrepareDialogBuilder(AlertDialog.Builder builder){ } }
넘겨 받은 Builder 에는 XML에서 지정한 제목만 들어갔네요. 아... 그런데 버튼이.. 원래 이런 스타일이 아니었죠!
버튼이 하나였던것 같은데.... 이걸 직접 수정할 수 있지만...
부모의 메소드를 실행해 보겠습니다.
public void onPrepareDialogBuilder(AlertDialog.Builder builder){ super.onPrepareDialogBuilder(builder); }
어라 이게 원했던 스타일이죠! 아... 그런데 리스트에 있는 값들이 맘에 안드네요....
원래 부터 저걸 바꾸기로 한거였는데... 이제 다시 원점이군요.
상위 메소드를 실행해서 저런 스타일을 가지는 builder가 만들어 졌습니다. 그럼 이제 그 builder 로 리스트의 값만 바꿔주면 끝입니다!!!
import java.util.ArrayList; import java.util.List; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.preference.ListPreference; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class ColorListPreference extends ListPreference { public ColorListPreference(Context context, AttributeSet attrs) { super(context, attrs); } public void onPrepareDialogBuilder(AlertDialog.Builder builder){ super.onPrepareDialogBuilder(builder); builder.setAdapter(new ColorListAdapter(getContext(),R.layout.color_list_preference_row,getEntriesList()), new OnClickListener(){ public void onClick(DialogInterface dialog, int which) { Log.i("yViewer","click item : "+which); setValue(getEntryValues()[which].toString()); dialog.dismiss(); } }); } private ArrayListgetEntriesList(){ ArrayList list = new ArrayList (); CharSequence[] array = getEntries(); for(CharSequence name : array){ list.add(name.toString()); } return list; } private class ColorListAdapter extends ArrayAdapter { private ColorString rgb; public ColorListAdapter(Context context, int resource, List objects) { super(context, resource, objects); rgb = new ColorString(); } public View getView(int position, View view, ViewGroup parent){ LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); String name = (String) ColorListPreference.this.getEntries()[position]; String value = (String) ColorListPreference.this.getEntryValues()[position]; view = vi.inflate(R.layout.color_list_preference_row, null); View colorView = view.findViewById(R.id.color); TextView nameView = (TextView) view.findViewById(R.id.name); Log.i("yViewer",value); colorView.setBackgroundColor(rgb.toRGB(value)); nameView.setText(name); nameView.setTextColor(rgb.toRGB(value)); return view; } } }
오호!! 원하는데로 나오는 군요!!
그런데... 이게 뭔가요.... 클릭해도 저장이 안되네요? 값 저장을 처리해야 할까요?
음... 기본으로 되어 있는데 괜히 건드리고 싶지는 않군요
검색을 통해서 알아보니 체크가 되는 리스트뷰 항목을 만들려면 각 항목의 최상위 뷰가 Clickable을 구현해야 한다고 합니다.
결국 새로운 뷰를 하나 만들어야 한다고 합니다.
늦었으니 그건 다음에... ^^;
반응형
'Programming > Android' 카테고리의 다른 글
TextView 글자 크기 변경 (0) | 2011.02.04 |
---|---|
smoothScrollTo 가 적용이 되지 않을때 (4) | 2011.01.25 |
16진수 색상(#FFFFFF) 를 int형 color 값으로 변환하자! (0) | 2011.01.21 |
같은 Activity 안에서 상황에 따라 다른 OptionMenu를 보여주고 싶어요! (0) | 2011.01.19 |
Custom ListPreference #2 - onCreateDialogView (0) | 2011.01.14 |