Programming/iOS2012.09.16 03:19

CustomView 를 만들어서 초기화 하는 부분을 initWithFrame에 넣었습니다.

하지만 이 매소드가 실행되지 않더군요.

init 매소드도 실행되지 않아요.

나머지 하나가 남았더군요.  initWithCoder 이것이 Storyboard 에서 초기화 할때 사용하는 매소드입니다.


- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    
    if (self) {

    }
    
    return self;
}


신고
Posted by 초프(초보 프로그래머)
Programming/Android2011.01.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을 구현해야 한다고 합니다.

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

늦었으니 그건 다음에... ^^;
신고
Posted by 초프(초보 프로그래머)
Programming/Android2011.01.14 14:03
#1 에서 검색할 결과를 바탕으로 테스트 해보았습니다.

xml/setup.xml

	

ColorListPreference.java
package android.test;

import android.content.Context;
import android.preference.ListPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AbsListView.LayoutParams;

public class ColorListPreference extends ListPreference {

	public ColorListPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	public View onCreateDialogView(){
		ListView view = new ListView(getContext());
		view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
		view.setAdapter(new ArrayAdapter(getContext(),android.R.layout.simple_list_item_single_choice,getEntries()));
		
		return view;
	}
}


위 그림은 이클립스의 Hierarchy View perspective 로 본 그림입니다. 3번째 layout 에서 크게 4가지로 분리되는 것이 보입니다. 이 4가지가 topPanel, contentPanel, customPanel, buttonPanel 입니다. 
우리가 원했던 대로 contentPanel에는 아무것도 출력되지 않았고 customPanel에만 출력이 되었습니다



그런데 이게... 뭘까요? 기존의 형식을 유지하면서 나오길 원했는데... 이건 전혀 그렇지 않네요...;
처음부터 잘못 생각했었습니다. customPanel을 건드리는게 아니라 contentPanel을 건드려야 겠구나....

contentPanel은 어떻게 건드릴 까요?

여러가지로 테스트해본 결과 건드릴 수가 없었습니다. contentPanel의 부분은 AlertDialog.Builder 에서 생성된 내용이 들어가는 부분인듯 합니다. 그럼 당연히 Builder를 통해서 리스트를 생성해야 겠지요. 

그럼 AlertDialog.Builder은 어디서 건드리지?????


안드로이드 개발자 사이트에서 확인해 보니 DialogPreference에는 onPrepareDialogBuilder이 있습니다.
이 메소드에서는 Dialog를 생성하는 것이 아니라 preference를 클릭하여 Dialog를 보여지기 전에 실행됩니다.
그래서 이곳에서 builder를 이용해서 수정하여 보여주는 것입니다 !!!



신고
Posted by 초프(초보 프로그래머)
Programming/Android2011.01.14 13:23
설정 화면을 만들때 preference를 이용하면 xml로 쉽게 만들 수 있습니다.
그러나 기본으로 제공되고 있는 종류가 너무 적습니다. 

CheckBoxPreference
EditTextPreference
ListPreference
RingtonePreference
이 4가지가 기본적으로 제공되고 있습니다.

이번에 작업을 하면서 ListPreference 로 색상을 선택하게 하였는데 색상이 보이지 않아서 사용자들의 불만이 급증할 것으로 생각 되었습니다. 그래서 Custom ListPreference를 만들기로 하였습니다.

ListPreferece는 DialogPreference를 상속 받아서 Dialog안에 리스트를 출력해 주는 Preference입니다.


이런 ListPreference를 만들려고 합니다. 이 Dialog에는 총 4개의 부분으로 나눠져 있습니다.

 topPanel  

 contentPanel  

 customPanel  
 buttonPanel  


topPanel은 title 부분입니다. Custom Title로 변경 가능 합니다.
contentPanel은 DialogPreference에서 생성된 부분입니다. 사용자가 직접 Custom View로 변경하는 것은 힘들어 보입니다.
customPanel은 Custom View를 구현할 수 있는 부분입니다.
buttonPanel은 버튼이 나오는 부분으로 이부분은 negative, positive로 쉽게 변경이 가능합니다.

contentPanel을 바꾸고 싶은 것이 목표입니다. 그래서 검색해 봤습니다. 구글 레퍼런스 사이트에서 찾아 냈습니다.


오른쪽 아래에 보시면 (if a custom content view is required) ....... custom content 가 필요하면 이걸 사용하라고 합니다. 친절히 이렇게 써줬다니... 감격했습니다.


신고
Posted by 초프(초보 프로그래머)