일단 기본적으로 달력을 만드는 것은 앞에 예제에 있어서 쉽게 구현했다.
그리드 뷰를 이용하고 클릭리스너를 상속받은 클래스를 만들어서 클릭했을경우 클릭한 날은 노란색으로 표시되도록 하는 기능이 있다.
이제 여기에 메뉴버튼을 눌러서 스케쥴을 입력할 수 있는 창과 스케쥴이 있는 날에는 달력 아래에 리스트뷰로 스케쥴들이 보여지는 것만 추가하면 된다. 생각하기에는 엄청 쉬워서 '한 2시간이면 하겠네~' 라고 생각했는데,,,,, 이런? 무려 3일동안 끙끙 거렸다.
일단 리스트 뷰 구현이 생각보다 어려웠다. 이전 예제에서는 레이아웃 인플래터를 이용해서 요로케 조로케 이용했는데 그거 보고는 도저히 이해가 안되서 그냥 Step by Step 안드로이드 책을 보고 이용했다. 단순히 레이아웃에 리스트뷰를 추가하고 MainActivity에서 불러와서 썻다.
문제는 메뉴를 눌러서 스케쥴을 추가하는 것이였다. 다이얼로그를 만드는데 새 다이얼로그창을 만들고 그안에 버튼을 눌렀을때 클릭이 자꾸 안되는 것이였다. 알고보니 커스텀 다이얼로그창을 만들경우 사용하는 레이아웃안에 뷰들을 선언할때 레이아웃 이름을 써줘야 하는 것이였다. 예를들어 다이얼로그안에 있는 버튼을 사용하기위해서는 customDialog.findViewById(R.id.Button)이런식으로 앞에 레이아웃 이름을 써줘야 한다. 아마 메인 액티비티에서 쓰는 레이아웃과 다이얼로그의 레이아웃이 다르지만 함수처리하는 부분은 메인이라서 이런식으로 불러와서 선언을 해줘야 하나 보다. 아무튼 우역곡절끝에 겨우 만들었다. 코드는 메인만 첨부.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | package com.example.challenge07; import java.util.ArrayList; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.TimePicker; import android.widget.TimePicker.OnTimeChangedListener; public class MainActivity extends Activity implements OnTimeChangedListener { CalendarView monthView; CalendarAdapter monthViewAdapter; TextView monthText; private final int DIALOG_CUSTOM_ID = 1; ListView lv; ArrayList<DayData> dayData; int curYear; int curMonth; int curDay; String txt =""; int curHour; int curMin; EditText et; Button save; ArrayAdapter<String> adapter; ArrayList<String> as; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dayData = new ArrayList<DayData>(); ArrayList<String> ts = new ArrayList<String>(); ts.add("안녕"); ts.add("안녕"); lv = (ListView)findViewById(R.id.listView); monthView = (CalendarView) findViewById(R.id.monthView); monthViewAdapter = new CalendarAdapter(this); monthView.setAdapter(monthViewAdapter); monthView.setOnDataSelectionListener(new OnDataSelectionListener(){ public void onDataSelected(AdapterView parent, View v, int position, long id){ MonthItem curItem = (MonthItem) monthViewAdapter.getItem(position); curDay = curItem.getDay(); as = new ArrayList<String>(); for(int i =0; i< dayData.size();i++){ if(dayData.get(i).getDay() ==curDay){ as.add(dayData.get(i).getScadule()); } } updateLv(); } }); monthText = (TextView)findViewById(R.id.monthText); setMonthText(); Button monthPrevious = (Button)findViewById(R.id.monthPrevious); monthPrevious.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub monthViewAdapter.setPreviousMonth(); monthViewAdapter.notifyDataSetChanged(); setMonthText(); } }); Button monthNext = (Button)findViewById(R.id.monthNext); monthNext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub monthViewAdapter.setNextMonth(); monthViewAdapter.notifyDataSetChanged(); setMonthText(); } } ); } public void updateLv(){ adapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,as); lv.setAdapter(adapter); } private void setMonthText(){ curYear = monthViewAdapter.getCurYear(); curMonth = monthViewAdapter.getCurMonth(); monthText.setText(curYear + "년" + (curMonth+1) + "월"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public boolean onOptionsItemSelected(MenuItem item){ int curId = item.getItemId(); if(curId == R.id.action_settings){ final DayData dd = new DayData(curYear, curMonth, curDay); AlertDialog.Builder builder = new AlertDialog.Builder(this); View dia = View.inflate(this, R.layout.dia, null); builder.setTitle("일정추가"); builder.setView(dia); save = (Button)dia.findViewById(R.id.button1); et = (EditText)dia.findViewById(R.id.editText1); final TimePicker tp = (TimePicker)dia.findViewById(R.id.timePicker1); tp.setOnTimeChangedListener(this); View.OnClickListener saveListener = new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub txt = et.getText().toString(); dd.setTime(tp.getCurrentHour(), tp.getCurrentMinute()); dd.setString(txt); dayData.add(dd); } }; save.setOnClickListener(saveListener); builder.show(); } return true; } @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { // TODO Auto-generated method stub curHour = hourOfDay; curMin = minute; } } |