ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Custom ListPreference #3 - onPrepareDialogBuilder
    Programming/Android 2011. 1. 21. 02:04
    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을 구현해야 한다고 합니다.

    결국 새로운 뷰를 하나 만들어야 한다고 합니다.

    늦었으니 그건 다음에... ^^;

    댓글 0

Designed by Tistory.