반응형
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 ArrayList getEntriesList(){
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 |