마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

이중 DatePicker에서 년월만 나오게 하고 싶어요

0 추천

안녕하세요

시작일 데이트피커와 종료일 데이트피커 두개를 한 다이얼로그에 집어 넣고

두 날짜를 합해 그 사이에 있는 날짜의 데이터들을 서버에서 받아와 리스트뷰에 뿌려주는 엑티비티를 만들고 있는데요

레이아웃에서 두개의 DatePicker를 만들어서 이걸 LayoutInflater해서 다이얼로그에 표현되게 만들었는데요

실제로 실행해 봤을 때 모습은 아래의 이미지처럼 나옵니다

 

[이중 DatePicker]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="시작일"
        android:textColor="#ffffff"
        android:textSize="15sp" />

    <DatePicker
        android:id="@+id/start_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" >
    </DatePicker>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="20dip"
        android:text="종료일"
        android:textColor="#ffffff"
        android:textSize="15sp" />

    <DatePicker
        android:id="@+id/end_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" >
    </DatePicker>

</LinearLayout>

 

그리고 데이트피커를 두개 넣는 레이어는 위의 소스처럼 구성했구요

AlertDialog를 이용해 설정을 누를경우 각 데이트피커에 유저가 설정한대로 값을 저장하게 만들었습니다

AlertDialog date_dailog = new AlertDialog.Builder(this)
		
		.setTitle("기간설정")
		.setMessage("기간을 설정해주세요" )
		
		.setPositiveButton("설정", new DialogInterface.OnClickListener()
		{
			public void onClick(DialogInterface dialog, int which) 
			{
				s_date = 
						start_date.getYear()+"년"+
						String.format("%02d", start_date.getMonth()+1)+"월"+
						String.format("%02d", start_date.getDayOfMonth())+"일";
				
				e_date = 
						end_date.getYear()+"년"+
						String.format("%02d", end_date.getMonth()+1)+"월"+
						String.format("%02d", end_date.getDayOfMonth())+"일";

				server_s_date = 
						start_date.getYear()+"-"+
						String.format("%02d", start_date.getMonth()+1)+"-"+
						String.format("%02d", start_date.getDayOfMonth());
				
				server_e_date = 
						end_date.getYear()+"-"+
						String.format("%02d", end_date.getMonth()+1)+"-"+
						String.format("%02d", end_date.getDayOfMonth());

				date_view.setText(s_date+" ~ "+e_date);
      
				dialog.dismiss();
				setListView();

			}
		})
		.setNegativeButton( "취소", new DialogInterface.OnClickListener()
		{
			
			public void onClick(DialogInterface dialog, int which) 
			{
				dialog.dismiss();
			}
		})
		

		.setView(dialog_view)
		.show();
		setListView();
		
	}

굉장히 만족스러운 결과가 나왔는데요

문제는 년월일 중에 일을 빼고 년월만 할려고 해보니

Layout에 구성되어 있는 DatePicker가 년 월 일 단위로 분리가 안되어서 곤란한 상황입니다

분명히 실행상으로는 유저가 년월일 각각 독립적으로 날짜를 바꿀 수 있게 구성되어 있었는데

레이아웃에서 혹은 java코드에서 이걸 분할해주는 명령어를 찾을수가 없습니다

열심히 검색해 보니 DatePickerDialog로 년월만 나오게 만드신분의 소스를 보게 되었는데

public class Main extends Activity implements OnDateSetListener 
{

	DatePickerDialog datePickerDialog;

	@Override
 	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		datePickerDialog = new DatePickerDialog(this, this, 2013, 10, 23);
		
		try 
		{
			   Field[] f = datePickerDialog.getClass().getDeclaredFields();
			   
			   
			   
			   for (Field dateField : f) 
			   {
				   
			    if (dateField.getName().equals("mDatePicker")) 
			    {
			    	
			     dateField.setAccessible(true);

			     DatePicker datePicker = (DatePicker) dateField
			       .get(datePickerDialog);

			     Field datePickerFields[] = dateField.getType()
			       .getDeclaredFields();

			     for (Field datePickerField : datePickerFields) 
			     {
			    	 
			      if ("mDayPicker".equals(datePickerField.getName()) || "mDaySpinner".equals(datePickerField.getName())) 
			      {
			    	  
			       datePickerField.setAccessible(true);
			       Object dayPicker = new Object();
			       dayPicker = datePickerField.get(datePicker);
			       
			       try 
			       {
			           ((View) dayPicker).setVisibility(View.GONE);
			       } 
			       catch (ClassCastException e) 
			       {
			           e.printStackTrace();
			       }
			    
			      }
			     
			     }
			     
			    }
			    
			   }
			   
			  }
		catch (IllegalAccessException e) 
			  {
			   e.printStackTrace();
			  } 
		catch (IllegalArgumentException e) 
			{
			   e.printStackTrace();
			  }

			  datePickerDialog.show();
			 }


	

	@Override
	public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) 
	{
	
	}
 
} 

이분의 코드로 새로운 프로젝트를 만들어서 실행해보니 년월만 나오게 아주 깔끔하지만 데이트피커가 하나 밖에 존재하지 않더라구요

그리고 alertdialog처럼 타이틀 메시지 버튼제어를 어떻게 해야될지 전혀 감이 안오고요

Field[]라는 것으로 일을 잘라내서 setVisibility를 이용해 일을 숨긴 후 년월만 나오게 하신것 같은데 이해가 안되니 응용도 안되는 상황입니다

난관에 봉착해서 몇일간 진행이 안되고 이것저것 해보다가 지쳐서 최후의 수단으로 이렇게 글을 쓰게 됐는데요

제가 원하는 답변을 다시 간추려서 써 보겠습니다

 

1. 제가 처음 구성한 이중 데이트피커의 소스를 이용해 년월만 나오게 할 수 있는건가요?

2. 마지막에 데이트피커다이얼로그를과 필드를 이용해서 년월만 나오게 한 소스를 이용해 피커 2개를 집어 넣고 등록버튼을 눌렀을 때 텍스트박스에 날짜를 업데이트해주고 서버에 데이터를 끌고와  리스트뷰에 뿌려주게 할 수 있나요? 

ngmato (270 포인트) 님이 2014년 2월 19일 질문
ngmato님이 2014년 2월 19일 수정

1개의 답변

0 추천
 
채택된 답변
다 찾으셨는데 헤매고 계시군요.

 

코드에서 생성하는 방법이 아닌 xml 파일을 이용한 걸 보시면 더 쉽게 이해하실 것 같아요.

http://stackoverflow.com/questions/10401915/hide-year-field-in-android-datepicker

 

2번 질문은 date만 제대로 가져왔다면 포맷터 이용해서 연월부분만 가져올 수 있습니다.
쎄미 (162,410 포인트) 님이 2014년 2월 19일 답변
ngmato님이 2014년 2월 24일 채택됨
조언감사합니다!
다 왔다고 하시니 좀더 봐야될것 같습니다
...