캘린더가 들어있는 앱을 만들고 있습니다.

 

우선 앱 구조를 간단히 설명해 드리자면,

 

시작 엑티비티가 있고, 버튼을 눌러 메인메뉴 엑티비티로 들어갑니다.

 

메인 메뉴 엑티비티는 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> 필요하신 정보가 있다면 말씀하시면 추가로 올리도록 하겠습니다.

 

길지만 부탁드립니다.