카테고리 없음

안드로이드를 이용한 달력만들기 2

만년필석사 2016. 8. 28. 16:13
반응형

이번시간엔 달력을 만드는데 이번달만 표시될 수 있는 달력을 만들어보았다. 이것 역시 네이버, 구글, 책등을 찾아보며 만들어봤다. 하지만 자바코드 같은 경우는 네이버블로그에 도움을 상당수 많이 받았다. 생각보다 원하는 마땅한 코드도 없고 내 컴퓨터에 맞게 코딩 시킬라면 참 어려운점이 많았다.


1. acvity_main.xml 코드



대강 이렇게 만들어진다. 색깔같은경우는 내가 직접 넣어봤다. 

코드는 다음과 같다.

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:background="#00c8ff" >



<TextView

android:id="@+id/tv_date"

android:layout_width="match_parent"

android:layout_height="50dp"

android:background="#ffff00"

android:gravity="center_vertical"

android:paddingLeft="10dp"

android:textColor="#000000"

android:textSize="20sp" />



<GridView

android:layout_marginTop="10dp"

android:id="@+id/gridview"

android:layout_weight="1"

android:layout_height="0dp"

android:layout_width="match_parent"

android:numColumns="7"

android:listSelector="#b9ff00"

>

</GridView>


</LinearLayout>


그리드 뷰를 이용해서 만든 달력이다. 선까지 표시가 되서 더 깔끔하게 달력같은 달력을 만들 수 있다.


2. Main_activity.java 코드


package com.example.gunjoolee.calendar2;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Date;

import java.util.List;

import java.util.Locale;



import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.GridView;

import android.widget.TextView;



public class MainActivity extends Activity {



/**

* 연/월 텍스트뷰

*/

private TextView tvDate;

/**

* 그리드뷰 어댑터

*/

private GridAdapter gridAdapter;



/**

* 일 저장 할 리스트

*/

private ArrayList<String> dayList;



/**

* 그리드뷰

*/

private GridView gridView;



/**

* 캘린더 변수


private Calendar mCal;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);



setContentView(R.layout.activity_main);



tvDate = (TextView)findViewById(R.id.tv_date);

gridView = (GridView)findViewById(R.id.gridview);



// 오늘에 날짜를 세팅 해준다.

long now = System.currentTimeMillis();

final Date date = new Date(now);

//연,월,일을 따로 저장

final SimpleDateFormat curYearFormat = new SimpleDateFormat("yyyy", Locale.KOREA);

final SimpleDateFormat curMonthFormat = new SimpleDateFormat("MM", Locale.KOREA);

final SimpleDateFormat curDayFormat = new SimpleDateFormat("dd", Locale.KOREA);



//현재 날짜 텍스트뷰에 뿌려줌

tvDate.setText(curYearFormat.format(date) + "/" + curMonthFormat.format(date));



//gridview 요일 표시

dayList = new ArrayList<String>();

dayList.add("일");

dayList.add("월");

dayList.add("화");

dayList.add("수");

dayList.add("목");

dayList.add("금");

dayList.add("토");



mCal = Calendar.getInstance();



//이번달 1일 무슨요일인지 판단 mCal.set(Year,Month,Day)

mCal.set(Integer.parseInt(curYearFormat.format(date)), Integer.parseInt(curMonthFormat.format(date)) - 1, 1);

int dayNum = mCal.get(Calendar.DAY_OF_WEEK);

//1일 - 요일 매칭 시키기 위해 공백 add

for (int i = 1; i < dayNum; i++) {

dayList.add("");

}

setCalendarDate(mCal.get(Calendar.MONTH) + 1);



gridAdapter = new GridAdapter(getApplicationContext(), dayList);

gridView.setAdapter(gridAdapter);



}



/**

* 해당 월에 표시할 일 수 구함

* @param month


private void setCalendarDate(int month) {

mCal.set(Calendar.MONTH, month - 1);



for (int i = 0; i < mCal.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {

dayList.add("" + (i + 1));

}



}



/**

* 그리드뷰 어댑터

*

*/

private class GridAdapter extends BaseAdapter {



private final List<String> list;



private final LayoutInflater inflater;



/**

* 생성자

*

* @param context

* @param list

*/

public GridAdapter(Context context, List<String> list) {

this.list = list;

this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}



@Override

public int getCount() {

return list.size();

}



@Override

public String getItem(int position) {

return list.get(position);

}



@Override

public long getItemId(int position) {

return position;

}



@Override

public View getView(int position, View convertView, ViewGroup parent) {



ViewHolder holder = null;



if (convertView == null) {

convertView = inflater.inflate(R.layout.item_calendar_gridview, parent, false);

holder = new ViewHolder();



holder.tvItemGridView = (TextView)convertView.findViewById(R.id.tv_item_gridview);



convertView.setTag(holder);

} else {

holder = (ViewHolder)convertView.getTag();

}

holder.tvItemGridView.setText("" + getItem(position));



//해당 날짜 텍스트 컬러,배경 변경

mCal = Calendar.getInstance();

//오늘 day 가져옴

Integer today = mCal.get(Calendar.DAY_OF_MONTH);

String sToday = String.valueOf(today);

if (sToday.equals(getItem(position))) { //오늘 day 텍스트 컬러 변경

holder.tvItemGridView.setTextColor(getResources().getColor(R.color.colorPrimaryDark));

}

return convertView;

}

}



private class ViewHolder {

TextView tvItemGridView;

}

}

옆으로 세어져 나간건 양해부탁... 아무튼 이렇게 만들었다. 이것도 내컴퓨터 사양에 맞게 바꾸고 한것이다. 항상 개발이 그렇듯이..


3. 실행 결과 화면


저걸 저렇게 다 완벽하게 틀린거 없이 짜고 돌리면 다음과 같다.



오늘 날짜는 저런식으로 진하게 표시가 된다. 색깔은 본인이 맘에 드는걸로 넣으면 될 것같다.

반응형