캘린더가 들어있는 앱을 만들고 있습니다.
우선 앱 구조를 간단히 설명해 드리자면,
시작 엑티비티가 있고, 버튼을 눌러 메인메뉴 엑티비티로 들어갑니다.
메인 메뉴 엑티비티는 8개의 버튼으로 구성되어 있는데,
첫번째 버튼을 눌러 캘린더 엑티비티로 들어갑니다.
시작엑티비티 - 메인메뉴 - 캘린더
이런 구조이죠.
그리고 나서 캘린더 엑티비티에서 각 날짜를 누르면 날짜 내의 시간별 일정을 볼 수 있게 만들고 싶은 건데요,
즉,
시작엑티비티 - 메인메뉴 - 캘린더 - 각 날짜의 시간별 일정 엑티비티
입니다.
다른 부분은 다 되었는데,
캘린더 엑티비티에서 각 날짜를 눌러 날짜 내의 시간 별 일정을 읽어와 띄워주는 부분에서 자꾸 NullPointerException 가 나는군요.
시작엑티비티 - 메인메뉴 - 캘린더 <-요 부분-> 각 날짜의 시간별 일정 엑티비티
위의 빨간 부분입니다. 일정은 핸드폰 내장 캘린더에서 가져옵니다.
소스 입니다.
아래는 시작 엑티비티 부분. 버튼을 눌러 메인메뉴 엑티비티를 호출합니다.
public class ForForiActivity extends Activity {
Button MainMenuButton;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
MainMenuButton = (Button) findViewById(R.id.main_menu_button);
MainMenuButton.setOnClickListener(mMainMenuButton);
}
Button.OnClickListener mMainMenuButton = new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), Main_Menu.class);
startActivity(intent);
}
};
}메인 메뉴 부분입니다. 버튼이 8개지만 2개만 우선 만들었습니다. 첫번째가 캘린더 입니다.
public class Main_Menu extends Activity {
Button MenuButton_1;
Button MenuButton_2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main_menu);
MenuButton_1 = (Button) findViewById(R.id.menu_button_1);
MenuButton_2 = (Button) findViewById(R.id.menu_button_2);
MenuButton_1.setOnClickListener(mMenuButton_1);
MenuButton_2.setOnClickListener(mMenuButton_2);
}
Button.OnClickListener mMenuButton_1 = new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), Calendar_Class.class); // 캘린더 클래스
startActivity(intent);
}
};
Button.OnClickListener mMenuButton_2 = new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), Google_Calendar_Main.class); // 요부분!!!!!!!!! 캘린더에서 일정을 읽어오는 부분.
startActivity(intent);
}
};
}첫번째 버튼을 눌러 호출되는 캘린더를 엑티비티 부분입니다.
소스를 보시면 아시겠지만, 캘린더 부분은 gsCalendar라는 클래스를 상속 받습니다.
public class Calendar_Class extends Activity implements OnClickListener
{
TextView tvs[] ;
Button btns[] ;
class myGsCalendar extends gsCalendar
{
public myGsCalendar(Context context, LinearLayout layout)
{
super(context, layout);
// TODO Auto-generated constructor stub
}
@Override
public void myClickEvent(int yyyy, int MM, int dd)
{
// TODO Auto-generated method stub
cal.redraw( ) ;
cal.applyHoliday( ) ;
/// 선택된 날짜는 배경 이미지를 변경
cal.setSelectedDay( Calendar_Class.this.getResources( ).getDrawable( R.drawable.icon ) ) ;
/// 선택된 날짜는 글씨를 변경
cal.setSelectedDayTextColor( 0xff009999 ) ;
super.myClickEvent(yyyy, MM, dd);
Intent intent = new Intent(m_context, Google_Calendar_Main.class); /////////// 여기가 바로 에러부분 NullPointer!!!!!!!!!!!
startActivity(intent);
}
}
myGsCalendar cal;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.set2);
/// 달력을 띄울 대상 레이아웃
LinearLayout lv = (LinearLayout)findViewById( R.id.calendar_lLayout ) ;
/// 년 월 일 표시할 텍스트뷰
tvs = new TextView[3] ;
tvs[0] = (TextView)findViewById( R.id.tv1 ) ;
tvs[1] = (TextView)findViewById( R.id.tv2 ) ;
tvs[2] = null ; /// 일은 표시하지 않음
/// 누르면 년 월 일 조절할 버튼
btns = new Button[4] ;
btns[0] = null ; // 년도는 조절하지 않음
btns[1] = null ; // 위와 동일
btns[2] = (Button)findViewById( R.id.Button03 ) ;
btns[3] = (Button)findViewById( R.id.Button04 ) ;
/// 달력객체 생성
cal = new myGsCalendar( this, lv ) ;
//cal = new myGsCalendar( getApplicationContext(), lv ) ;
/// 색상 설정할 객체 생성
gsCalendarColorParam cParam = new gsCalendarColorParam( ) ;
cParam.m_cellColor = 0x00000000 ;
cParam.m_textColor = 0xffffffff ;
cParam.m_saturdayTextColor = 0xff33ccff ;
cParam.m_lineColor = 0x99999999 ;
cParam.m_topCellColor = 0xff003333 ;
cParam.m_topTextColor = 0xffffffff ;
cParam.m_topSundayTextColor = 0xffffffff ;
cParam.m_topSaturdatTextColor = 0xffffffff ;
/// 셋팅한 값으로 색상값 셋~
cal.setColorParam( cParam ) ;
/// 배경으로 사용할 이미지 얻기
Drawable img = getResources( ).getDrawable( R.drawable.bg ) ;
// 배경 이미지 셋~
cal.setBackground( img ) ;
/// 달력을 띄울 크기 지정
cal.setCalendarSize( 478, 600 ) ;
/// 최상단은 높이를 35로 준다(전체높이중 한 셀의 높이 600/7한 값에서 35로 변경되니 달력의 총 높이가 줄어든다.)
cal.setTopCellSize( 35 ) ;
/// 누르면 반응할 버튼들 셋팅
cal.setControl( btns ) ;
/// 년 월 일을 띄울 텍스트뷰 셋팅
cal.setViewTarget( tvs ) ;
cal.initCalendar( ) ;
/// 선택된 날짜는 배경 이미지를 변경
cal.setSelectedDay( getResources( ).getDrawable( R.drawable.icon ) ) ;
/// 선택된 날짜는 글씨를 변경
cal.setSelectedDayTextColor( 0xff009999 ) ;
///// 선택된 날짜는 글씨와 배경을 변경
//cal.setSelectedDay( 0xff000000, 0xffffffff ) ;
/// 3월 24일은 휴일이라고 계산
cal.addHoliday( 324 ) ;
/// 휴일은 일요일과 같은 글씨색으로 변경한다.
cal.applyHoliday( ) ;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
}
아래는 캘린더 클래스가 상속받는 gsCalendar 소스입니다.
public class gsCalendar extends Activity
{
final static int ROWS = 7 ; /// 줄/행수
final static int COLS = 7 ; /// 칸/열수
// final static int ROWS = 4 ; /// 줄/행수
// final static int COLS = 14 ; /// 칸/열수
//
Context m_context ; /// context
LinearLayout m_targetLayout ; /// 달력을 넣을 레이아웃
Button [] m_controlBtn ; /// 달력 컨트롤할 버튼 4개 [전년도, 다음년도, 전달, 다음달]
TextView [] m_viewTv ; /// 년 월 일 표시할 텍스트뷰 3개[년, 월 , 일]
Calendar m_Calendar ; /// 사용할 달력
LinearLayout [ ] m_lineLy ; /// 7라인 요일표시 + 최대 6주
LinearLayout [ ] m_cellLy ; /// 7칸
TextView [ ] m_cellTextBtn ; /// 각 칸마다 넣을 텍스트뷰 (버튼처럼 이벤트 주려고 Btn 이라 붙였음)
/// 사실 버튼으로 하고싶은데 버튼에 텍스트 넣으면 죽어도 상하좌우 여백이 들어가서
/// 텍스트가 짤려서 TextView로 만들 수 밖에 없음
LinearLayout [ ] m_horizontalLine ; /// 경계선 라인 가로
LinearLayout [ ] m_verticalLine ; /// 경계선 라인 세로
int m_startPos ; /// 요일을 찍기 시작 할 위치
int m_lastDay ; /// 그 달의 마지막날
int m_selDay ; /// 현재 선택된 날짜
////////////////////////////////////////
float m_displayScale ; /// 화면 사이즈에 따른 텍스트 크기 보정값 저장용
float m_textSize ; /// 텍스트 사이즈(위 라인의 변수와 곱해짐)
float m_topTextSize ; /// 요일텍스트 사이즈(역시 보정값과 곱해짐)
int m_tcHeight = 50 ; /// 요일 들어가는 부분 한칸의 높이
int m_cWidth = 50 ; /// 한칸의 넓이
int m_cHeight = 50 ; /// 한칸의 높이
int m_lineSize = 1 ; /// 경계선의 굵기
static public class gsCalendarColorParam
{
int m_lineColor = 0xff000000 ; /// 경계선 색
int m_cellColor = 0xffffffff ; /// 칸의 배경색
int m_topCellColor = 0xffcccccc ; /// 요일 배경색
int m_textColor = 0xff000000 ; /// 글씨색
int m_sundayTextColor = 0xffff0000 ; /// 일요일 글씨색
int m_saturdayTextColor = 0xff0000ff ; /// 토요일 글씨색
int m_topTextColor = 0xff000000 ; /// 요일 글씨색
int m_topSundayTextColor = 0xffff0000 ; /// 요일 일요일 글씨색
int m_topSaturdatTextColor = 0xff0000ff ; /// 요일 토요일 글씨색
int m_todayCellColor = 0x999999ff ; /// 선택날짜의 배경색
int m_todayTextColor = 0xffffffff ; /// 선택날짜의 글씨색
}
gsCalendarColorParam m_colorParam ;
/// 있으면 적용하고 없으면 bgcolor로 처리함( 각각 개별적으로 )
Drawable m_bgImgId = null ; /// 전체 배경이미지
Drawable m_cellBgImgId = null ; /// 한칸의 배경 이미지
Drawable m_topCellBgImgId = null ; /// 상단 요일 들어가는 부분의 배경 이미지
Drawable m_todayCellBgImgId = null ; /// 선택 날짜의 배경 이미지
/// 상단에 표시하는 요일 텍스트
String [] m_dayText ={ "일", "월", "화", "수", "목", "금", "토" } ;
///////////////////////////////////////////
Button m_preYearBtn ; /// 전년도 버튼
Button m_nextYearBtn ; /// 다음년도 버튼
Button m_preMonthBtn ; /// 전월 버튼
Button m_nextMonthBtn ; /// 다음월 버튼
TextView m_yearTv ; /// 년 표시용 텍스트
TextView m_mothTv ; /// 월 표시용 텍스트
TextView m_dayTv ; /// 날짜 표시용 텍스트
ArrayList< Integer > m_holiDay = new ArrayList< Integer >( ) ;
/// 생성자
public gsCalendar( Context context, LinearLayout layout )
{
/// context저장
m_context = context ;
/// 타겟 레이아웃 저장
m_targetLayout = layout ;
/// 오늘 잘짜로 달력 생성
m_Calendar = Calendar.getInstance( ) ;
/// 표시할 각각의 레이어 생성
m_lineLy = new LinearLayout[ COLS ] ; /// 7줄의 레이아웃 생성
m_cellLy = new LinearLayout[ COLS * ROWS ] ; /// 그안에 줄당 7개씩 총 49개의 레이아웃 생성
m_cellTextBtn = new TextView[ COLS * ROWS ] ; /// 동일한 갯수의 버튼도 생성
m_horizontalLine = new LinearLayout[ COLS - 1 ] ; /// 세로 구분선 레이아웃
m_verticalLine = new LinearLayout[ ( COLS - 1 ) * ROWS ] ; /// 가로 구분선 레이아웃
/// 화면의 크기에 따른 보정값
m_displayScale = context.getResources( ).getDisplayMetrics( ).density ;
m_topTextSize = m_displayScale * 12.0f ;
m_textSize = m_displayScale * 12.0f ;
m_colorParam = new gsCalendarColorParam( ) ;
// ROWS = 7 ; /// 줄/행수
// COLS = 14 ; /// 칸/열수
}
/// 달력을 생성한다.( 모든 옵션들[컬러값, 텍스트 크기 등]을 설정한 후에 마지막에 출력 할 때 호출)
public void initCalendar( )
{
createViewItem( ) ;
setLayoutParams( ) ;
setLineParam( ) ;
setContentext( ) ;
setOnEvent( ) ;
printView( ) ;
}
/// 컬러값 파라메터 설정
public void setColorParam( gsCalendarColorParam param )
{
m_colorParam = param ;
}
/// 배경으로 쓸 이미지를 설정
public void setBackground( Drawable bg )
{
m_bgImgId = bg ;
}
public void setCellBackground( Drawable bg )
{
m_cellBgImgId = bg ;
}
public void setTopCellBackground( Drawable bg )
{
m_topCellBgImgId = bg ;
}
public void setCalendarSize( int width, int height )
{
m_cWidth = ( width - ( m_lineSize * COLS - 1 ) ) / COLS ;
m_cHeight = ( height - ( m_lineSize * ROWS - 1 ) ) / ROWS ;
m_tcHeight = ( height - ( m_lineSize * COLS - 1 ) ) / COLS ;
}
public void setCellSize( int cellWidth, int cellHeight, int topCellHeight )
{
m_cWidth = cellWidth ;
m_cHeight = cellHeight ;
m_tcHeight = topCellHeight ;
}
public void setTopCellSize( int topCellHeight )
{
m_tcHeight = topCellHeight ;
}
public void setCellSize( int allCellWidth, int allCellHeight )
{
m_cWidth = allCellWidth ;
m_cHeight = allCellHeight ;
m_tcHeight = allCellHeight ;
}
public void setTextSize( float size )
{
m_topTextSize = m_displayScale * size ;
m_textSize = m_displayScale * size ;
}
public void setTextSize( float textSize, float topTextSize )
{
m_topTextSize = m_displayScale * topTextSize ;
m_textSize = m_displayScale * textSize ;
}
public void redraw( )
{
m_targetLayout.removeAllViews( ) ;
initCalendar( ) ;
}
//////////////////// 선택한 날짜칸에 변화를 주는 함수 //////////////////////////
/// 이녀석이 불러졌을때 상태는 날짜가 오늘로 선택되어있거나 뭔가 선택했을 것임
/// 그럼으로 m_cellLy[ 날짜 + m_startPos ].setTextColor( ) ;
/// m_startPos가 구해져 있으니 날짜를 더하면 해당 날짜칸을 마음대로 바꿀 수 있음
/// ////////////////////////////////////////////////////////////////////
/// 선택된 날짜칸에 변화를 주기위한 함수 1호
public void setSelectedDay( int cellColor, int textColor )
{
m_colorParam.m_todayCellColor = cellColor ;
m_colorParam.m_todayTextColor = textColor ;
m_cellTextBtn[ m_Calendar.get( Calendar.DAY_OF_MONTH ) + m_startPos - 1 ].setTextColor( textColor ) ;
m_cellTextBtn[ m_Calendar.get( Calendar.DAY_OF_MONTH ) + m_startPos - 1 ].setBackgroundColor( cellColor ) ;
}
/// 선택된 날짜칸에 변화를 주기위한 함수 2호
public void setSelectedDayTextColor( int textColor )
{
m_colorParam.m_todayTextColor = textColor ;
m_cellTextBtn[ m_Calendar.get( Calendar.DAY_OF_MONTH ) + m_startPos - 1 ].setTextColor( textColor ) ;
}
/// 선택된 날짜칸에 변화를 주기위한 함수 3호
public void setSelectedDay( Drawable bgimg )
{
m_todayCellBgImgId = bgimg ;
m_colorParam.m_todayCellColor = 0x00000000 ;
m_cellTextBtn[ m_Calendar.get( Calendar.DAY_OF_MONTH ) + m_startPos - 1 ].setBackgroundDrawable( bgimg ) ;
Log.d("===",(m_Calendar.get( Calendar.DAY_OF_MONTH ) -1)+ "" ) ;
}
///////////////////////////// 공휴일 처리 ///////////////////////
/// 휴일을 MMdd형식으로 넣는다.
/// 구정이 2월 4 5 6이라면
/// [0204] [0205] [0206] 이렇게 넣음
public void addHoliday( int holiday_MMdd )
{
m_holiDay.add( holiday_MMdd ) ;
}
/// 공휴일 리스트를 루프돌면서 해당 날짜를 일요일과 같은 색으로 변경
public void applyHoliday( )
{
/// 현재 달력의 월을 구함
Integer iMonth = m_Calendar.get( Calendar.MONTH ) + 1 ;
/// 휴일로 저장된 모든 날짜 루프 줄줄 돌음
for( int k = 0 ; k < m_holiDay.size( ) ; k++ )
{
int holiday = m_holiDay.get( k ) ; /// 월과 일을 구한다음
if( holiday / 100 == iMonth ) /// 월이 동일할 경우
{
/// 해당 날짜를 휴일 컬러로 변경
m_cellTextBtn[ holiday % 100 + m_startPos ].setTextColor( m_colorParam.m_sundayTextColor ) ;
}
}
}
/// 세로줄 수만큼 루프 세로줄은 날짜 표기되는 줄 + 경계선 줄수
public void createViewItem( )
{
/// 7줄이면 경계선 라인까지 합해서 13줄을 생성해야한다.
for( int i = 0 ; i < ROWS * 2 - 1 ; i++ )
{
/// 짝수라인일때는
if( i % 2 == 0 )
{
/// 라인은 13개 라인이지만 내용이 표시되는 라인은 7개임
m_lineLy[i/2] = new LinearLayout( m_context ) ;
m_targetLayout.addView( m_lineLy[i/2] ) ; // 만든 레이아웃을 자식으로 등록
/// 날짜표기 칸과 경계선 합해서 13개의 칸을 생성
for( int j = 0 ; j < COLS * 2 - 1 ; j++ )
{
/// 달력 내용이 들어가는 칸
if( j % 2 == 0 )
{
int pos = ( ( i / 2 ) * COLS ) + ( j / 2 ) ;
Log.d( "pos1", "" + pos ) ;
m_cellLy[ pos ] = new LinearLayout( m_context ) ;
m_cellTextBtn[ pos ] = new TextView( m_context ) ;
m_lineLy[ i / 2 ].addView( m_cellLy[ pos ] ) ;
m_cellLy[ pos ].addView( m_cellTextBtn[ pos ] ) ;
}
else /// 이건 단순한 경계선
{
int pos = ( ( i / 2 ) * (COLS - 1) ) + ( j - 1 ) / 2 ;
Log.d( "pos2", "" + pos ) ;
m_verticalLine[ pos ] = new LinearLayout( m_context ) ;
m_lineLy[ i / 2 ].addView( m_verticalLine[ pos ] ) ;
}
}
}
else /// 이건 가로줄 경계선
{
m_horizontalLine[ ( i - 1 ) / 2 ] = new LinearLayout( m_context ) ;
m_targetLayout.addView( m_horizontalLine[ ( i - 1 ) / 2 ] ) ;
}
}
}
/// 레이아웃과 버튼의 배경색, 글씨색 등 ViewParams를 셋팅
public void setLayoutParams( )
{
/// 메인 레이아웃은 세로로 나열
m_targetLayout.setOrientation( LinearLayout.VERTICAL ) ;
/// 만약 전체 배경이 있으면 넣어줌
if( m_bgImgId != null )
{
m_targetLayout.setBackgroundDrawable( m_bgImgId ) ;
}
/// 세로줄 수만큼 루프 세로줄은 날짜 표기되는 줄 + 경계선 줄수
for( int i = 0 ; i < ROWS * 2 - 1 ; i++ )
{
if( i % 2 == 0 )
{
/// 각 라인을 구성하는 레이아웃들은 가로로 나열~
m_lineLy[i/2].setOrientation( LinearLayout.HORIZONTAL ) ;
m_lineLy[i/2].setLayoutParams( /// 레이아웃 사이즈는 warp_content로 설정
new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ) ) ;
/// 한칸한칸 옵션을 설정
for( int j = 0 ; j < COLS ; j++ )
{
int cellnum = ( ( i / 2 ) * COLS ) + j ;
/// 한칸한칸을 구성하는 레이아웃 사이즈는 역시 wrap_content로 설정
LinearLayout.LayoutParams param = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ) ;
//param.setMargins( 1, 1, 1, 1 ) ; /// 마진을 1씩 줘서 라인을 그린다.
m_cellLy[ cellnum ].setLayoutParams( param ) ;
/// 한칸한칸 들어가는 버튼
m_cellTextBtn[ cellnum ].setGravity( Gravity.CENTER ) ;
/// 이하는 배경색 글씨색 글씨 크기 설정하는 부분
/// 첫라인은 월화수목금토일 표시하는 부분
if( i == 0 )
{
/// 요일 표시하는 부분의 넓이 높이
m_cellTextBtn[ cellnum ].setLayoutParams( new LinearLayout.LayoutParams( m_cWidth, m_tcHeight ) ) ;
/// 배경과 글씨색
if( m_topCellBgImgId != null )
{
m_cellLy[ cellnum ].setBackgroundDrawable( m_topCellBgImgId ) ;
}
else
{
m_cellLy[ cellnum ].setBackgroundColor( m_colorParam.m_topCellColor ) ;
}
/// 토요일과 일요일은 다른 컬러로 표시한다.
switch( j )
{
case 0:
m_cellTextBtn[ cellnum ].setTextColor( m_colorParam.m_topSundayTextColor ) ;
break ;
case 6:
m_cellTextBtn[ cellnum ].setTextColor( m_colorParam.m_topSaturdatTextColor ) ;
break ;
default:
m_cellTextBtn[ cellnum ].setTextColor( m_colorParam.m_topTextColor ) ;
break ;
}
/// 글씨 크기
m_cellTextBtn[ cellnum ].setTextSize( m_topTextSize ) ;
}
else /// 이하는 날짜 표시하는 부분
{
/// 숫자 표시되는 부분의 넓이와 높이
m_cellTextBtn[ cellnum ].setLayoutParams( new LinearLayout.LayoutParams( m_cWidth, m_cHeight ) ) ;
/// bg와 글씨색
if( m_cellBgImgId != null )
{
m_cellLy[ cellnum ].setBackgroundDrawable( m_cellBgImgId ) ;
}
else
{
m_cellLy[ cellnum ].setBackgroundColor( m_colorParam.m_cellColor ) ;
}
/// 토요일과 일요일은 다른 컬러로 표시한다.
switch( j )
{
case 0:
m_cellTextBtn[ cellnum ].setTextColor( m_colorParam.m_sundayTextColor ) ;
break ;
case 6:
m_cellTextBtn[ cellnum ].setTextColor( m_colorParam.m_saturdayTextColor ) ;
break ;
default:
m_cellTextBtn[ cellnum ].setTextColor( m_colorParam.m_textColor ) ;
break ;
}
/// 글씨 크기
m_cellTextBtn[ cellnum ].setTextSize( m_textSize ) ;
}
}
}
}
}
public void setLineParam( )
{
for( int i = 0 ; i < ROWS - 1 ; i ++ )
{
m_horizontalLine[ i ].setBackgroundColor( m_colorParam.m_lineColor ) ; /// 라인색
m_horizontalLine[ i ].setLayoutParams( /// 가로 라인이니까 가로는 꽉 세로는 두께만큼
new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, m_lineSize ) ) ;
}
for( int i = 0 ; i < ROWS ; i ++ )
{
for( int j = 0 ; j < COLS - 1 ; j++ )
{
int pos = ( i * ( COLS - 1 ) ) + j ;
m_verticalLine[ pos ].setBackgroundColor( m_colorParam.m_lineColor ) ; /// 라인색
m_verticalLine[ pos ].setLayoutParams( /// 세로 라인이니까 세로는 쭉~ 가로는 두께만큼
new LinearLayout.LayoutParams( m_lineSize, LayoutParams.FILL_PARENT ) ) ;
}
}
}
/// 달력을 구성하는 년 월 일을 셋팅하기
public void setContentext( )
{
/// 달력을 하나 복사해서 작업한다.
Calendar iCal = (Calendar) m_Calendar.clone( ) ;
/// 날짜를 겟~
m_selDay = iCal.get( Calendar.DATE ) ;
/// 날짜를 1로 셋팅하여 달의 1일이 무슨 요일인지 구함
iCal.set( Calendar.DATE, 1 ) ;
/// 요일표기하는 맨 위 7칸 + 요일이 첫 시작하는 칸임
m_startPos = COLS + iCal.get( Calendar.DAY_OF_WEEK ) - Calendar.SUNDAY ;
/// 1달 더해서 다음달 1일로 만들었다가 1일을 빼면 달의 마지막날이 구해짐
iCal.add( Calendar.MONTH, 1 ) ;
iCal.add( Calendar.DATE, -1 ) ;
m_lastDay = iCal.get( Calendar.DAY_OF_MONTH ) ; /// 해달 달의 마지막날 겟~
/// 0부터 6번칸까지는 월화수목금토일~ 로 채워넣음
for( int k = 0 ; k < COLS ; k++ )
{
m_cellTextBtn[ k ].setText( m_dayText[ k % 7 ] ) ;
}
/// 7번부터 처음 시작위치 전까지는 공백으로 채움
for( int i = COLS ; i < m_startPos ; i++ )
{
m_cellTextBtn[ i ].setText( "" ) ;
}
/// 시작위치부터는 1부터 해서 달의 마지막날까지 숫자로 채움
for( int i = 0 ; i < m_lastDay ; i++ )
{
m_cellTextBtn[ i + m_startPos ].setText( ( i + 1 ) + "" ) ;
}
/// 마지막날부터 끝까지는 공백으로 채움
for( int i = m_startPos + m_lastDay ; i < COLS * ROWS ; i++ )
{
m_cellTextBtn[ i ].setText( "" ) ;
}
}
/// 각 버튼들에 setOnClickListener 주기
public void setOnEvent( )
{
/// 월화수목금토일 들어가있는 부분에는 눌러도 반응할 필요 없음
for( int i = COLS ; i < COLS * ROWS ; i++ )
{
final int k = i ;
m_cellTextBtn[i].setOnClickListener( new Button.OnClickListener( )
{
@Override
public void onClick(View v)
{
if( m_cellTextBtn[k].getText( ).toString( ).length() > 0 )
{
m_Calendar.set( Calendar.DATE, Integer.parseInt( m_cellTextBtn[k].getText( ).toString( ) ) ) ;
if( m_dayTv != null )
m_dayTv.setText( m_Calendar.get( Calendar.DAY_OF_MONTH ) + "" ) ;
printView( ) ;
myClickEvent( m_Calendar.get( Calendar.YEAR ),
m_Calendar.get( Calendar.MONTH ),
m_Calendar.get( Calendar.DAY_OF_MONTH ) ) ;
}
}
} ) ;
}
}
/// 달력을 띄운 다음 년 월 일을 출력해줌
public void printView( )
{
/// 텍스트 뷰들이 있으면 그 텍스트 뷰에다가 년 월 일을 적어넣음
if( m_yearTv != null )
m_yearTv.setText( m_Calendar.get( Calendar.YEAR ) + "" ) ;
if( m_mothTv != null )
{
//int imonth = iCal.get( Calendar.MONTH ) ;
m_mothTv.setText( ( m_Calendar.get( Calendar.MONTH ) + 1 ) + "" ) ;
}
if( m_dayTv != null )
m_dayTv.setText( m_Calendar.get( Calendar.DAY_OF_MONTH ) + "" ) ;
}
/// 년도와 월을 앞~ 뒤~로
public void preYear( )
{
m_Calendar.add( Calendar.YEAR, -1 ) ;
setContentext( ) ;
printView( ) ;
}
public void nextYear( )
{
m_Calendar.add( Calendar.YEAR, 1 ) ;
setContentext( ) ;
printView( ) ;
}
public void preMonth( )
{
m_Calendar.add( Calendar.MONTH, -1 ) ;
setContentext( ) ;
printView( ) ;
}
public void nextMonth( )
{
m_Calendar.add( Calendar.MONTH, 1 ) ;
setContentext( ) ;
printView( ) ;
}
/// 텍스트뷰를 넣어주면 각각 뿌려줌 (빈게 들어있으면 안뿌림)
public void setViewTarget( TextView [] tv )
{
m_yearTv = tv[0] ;
m_mothTv = tv[1] ;
m_dayTv = tv[2] ;
}
/// 버튼을 넣어주면 알아서 옵션 넣어줌 (역시나 빈게 있으면 이벤트 안넣음)
public void setControl( Button [] btn )
{
m_preYearBtn = btn[0] ;
m_nextYearBtn = btn[1] ;
m_preMonthBtn = btn[2] ;
m_nextMonthBtn = btn[3] ;
if( m_preYearBtn != null )
m_preYearBtn.setOnClickListener( new Button.OnClickListener( )
{
@Override
public void onClick(View v)
{
preYear( ) ;
}
} ) ;
if( m_nextYearBtn != null )
m_nextYearBtn.setOnClickListener( new Button.OnClickListener( )
{
@Override
public void onClick(View v)
{
nextYear( ) ;
}
} ) ;
if( m_preMonthBtn != null )
m_preMonthBtn.setOnClickListener( new Button.OnClickListener( )
{
@Override
public void onClick(View v)
{
preMonth( ) ;
}
} ) ;
if( m_nextMonthBtn != null )
m_nextMonthBtn.setOnClickListener( new Button.OnClickListener( )
{
@Override
public void onClick(View v)
{
nextMonth( ) ;
}
} ) ;
}
/// 원하는 포멧대로 날짜를 구해줌
public String getData( String format )
{
SimpleDateFormat sdf = new SimpleDateFormat( format, Locale.US ) ;
return sdf.format( new Date( m_Calendar.getTimeInMillis( ) ) ) ;
}
/// 달력에서 날짜를 클릭하면 이 함수를 부른다.
public void myClickEvent( int yyyy, int MM, int dd )
{
Log.d( "yyyy", "" + yyyy ) ;
Log.d( "MM", "" + MM ) ;
Log.d( "dd", "" + dd ) ;
}
public int pixelToDip( int arg )
{
m_displayScale = m_context.getResources( ).getDisplayMetrics( ).density ;
return (int) ( arg * m_displayScale ) ;
}
public gsCalendarColorParam getBasicColorParam( )
{
return new gsCalendarColorParam( ) ;
}
}그리고 약간 지저분 하지만 에러 로그파일을 포함하겠습니다.
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): java.lang.NullPointerException
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at android.app.Activity.startActivityForResult(Activity.java:2827)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at android.app.Activity.startActivity(Activity.java:2933)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at calendar.Calendar_Class$myGsCalendar.myClickEvent(Calendar_Class.java:53)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at calendar.gsCalendar$1.onClick(gsCalendar.java:548)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at android.view.View.performClick(View.java:2538)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at android.view.View$PerformClick.run(View.java:9152)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at android.os.Handler.handleCallback(Handler.java:587)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at android.os.Handler.dispatchMessage(Handler.java:92)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at android.os.Looper.loop(Looper.java:123)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at android.app.ActivityThread.main(ActivityThread.java:3687)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at java.lang.reflect.Method.invokeNative(Native Method)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at java.lang.reflect.Method.invoke(Method.java:507)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
12-23 02:36:13.589: ERROR/AndroidRuntime(28852): at dalvik.system.NativeStart.main(Native Method)
재밌는 것은 위에 소스에서 [ 요부분!!!!!!!!! 캘린더에서 일정을 읽어오는 부분.] 이라고 되어 있는 곳을 보시면
캘린더에서 날짜를 눌러 그 날짜의 일정을 읽어와 리스트뷰로 띄워주는 엑티비티를 띄우게 되어 있는데요,
이 부분은 동작 동작합니다. 즉, 캘린더를 거치지 않고 바로 핸드폰 내장 캘린더에서 일정을 가져와서 리스트 뷰로 뿌려주는 건 잘 됩니다.
이 이야기는 Manifest의 문제는 아니라고 볼 수 있다는 거겠죠.
소스에서 [/////////// 여기가 바로 에러부분 NullPointer!!!!!!!!!!!] 이라고 되어 있는 부분은 사실은
[ 요부분!!!!!!!!! 캘린더에서 일정을 읽어오는 부분.] 라고 써 있는 곳과 완전히 소스가 같은데,
하나는 되고 하나는 안 된다는 것으로 봐서, 아마도 Context의 문제일 거라고 생각되기는 합니다만,
디버깅을 해본 결과 Null은 아니라는 것을 확인했거든요.
그러다 보니 대체 어디서 문제가 일어나는 건지는 모르겠습니다.
도움을 주실 분을 찾습니다.
PS> 필요하신 정보가 있다면 말씀하시면 추가로 올리도록 하겠습니다.
길지만 부탁드립니다.




Main_Menu 액티비티가 myGsCalendar를 멤버로 가지고 있는데, myGsCalendar 자체도 액티비티네요...
이게 모든 문제의 근원인것 같습니다.
Activity를 멤버로 가지려면 Main_Menu가 ActivityGroup이 되어야 할 것 같은데,자세한것은 안파봐서 모르겠습니다.
A
dd
ㅇ