2013-11-27 5 views
0

Android 캘린더 응용 프로그램을 개발해야합니다.선택한 날짜가 안드로이드 앱의 가로 방향으로 표시됩니다.

캘린더를 보여주는 내 애플리케이션을 실행해야합니다. 기본적으로 오늘 날짜는 파란색으로 강조 표시됩니다. 이제 다른 날짜를 선택하려면 선택한 날짜가 파란색으로 강조 표시됩니다. 세로 모드에서 완벽하게 작동합니다. 세로 모드에서 다른 날짜를 선택하고 방향을 변경하면 선택한 날짜가 파란색 배경 만 강조 표시됩니다. 하지만 오늘은 파란색 배경으로 강조 표시된 날짜에만 적용됩니다. 내 코드를 확인하고 해결책을 제공해 주시겠습니까? 왜 그렇게되는거야?

방향을 변경할 때 선택한 날짜가 파란색 배경으로 강조 표시되어야합니다. 어떻게해야합니까?

나는 다음과 같은 코드를 사용하여 한 :

public class CalendarView extends Activity { 

public GregorianCalendar month, itemmonth;// calendar instances. 

public CalendarAdapter adapter;// adapter instance 
public Handler handler;// for grabbing some event values for showing the dot 
         // marker. 
public ArrayList<String> items; // container to store calendar items which 

ArrayList<String> event; 
ArrayList<String> date; 
ArrayList<String> desc; 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.calendar); 
    Locale.setDefault(Locale.US); 
    month = (GregorianCalendar) GregorianCalendar.getInstance(); 
    itemmonth = (GregorianCalendar) month.clone(); 
    items = new ArrayList<String>(); 
    adapter = new CalendarAdapter(this, month); 
    GridView gridview = (GridView) findViewById(R.id.gridview); 
    gridview.setAdapter(adapter); 
    handler = new Handler(); 
    handler.post(calendarUpdater); 
    TextView title = (TextView) findViewById(R.id.title); 
    title.setText(android.text.format.DateFormat.format("MMMM yyyy", month)); 
    RelativeLayout previous = (RelativeLayout) findViewById(R.id.previous); 
    previous.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      setPreviousMonth(); 
      refreshCalendar(); 
     } 
    }); 

    RelativeLayout next = (RelativeLayout) findViewById(R.id.next); 
    next.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      setNextMonth(); 
      refreshCalendar(); 

     } 
    }); 

    gridview.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
       int position, long id) { 
      desc = new ArrayList<String>(); 
      date = new ArrayList<String>(); 
      ((CalendarAdapter) parent.getAdapter()).setSelected(v); 
      String selectedGridDate = CalendarAdapter.dayString 
        .get(position); 
      String[] separatedTime = selectedGridDate.split("-"); 
      String gridvalueString = separatedTime[2].replaceFirst("^0*", 
        "");// taking last part of date. ie; 2 from 2012-12-02. 
      int gridvalue = Integer.parseInt(gridvalueString); 
      // navigate to next or previous month on clicking offdays. 
      if ((gridvalue > 10) && (position < 8)) { 
       setPreviousMonth(); 
       refreshCalendar(); 
      } else if ((gridvalue < 7) && (position > 28)) { 
       setNextMonth(); 
       refreshCalendar(); 
      } 
      ((CalendarAdapter) parent.getAdapter()).setSelected(v); 

      for (int i = 0; i < Utility.startDates.size(); i++) { 
       if (Utility.startDates.get(i).equals(selectedGridDate)) { 
        desc.add(Utility.nameOfEvent.get(i)); 
       } 
      } 

      if (desc.size() > 0) { 
       for (int i = 0; i < desc.size(); i++) { 
        TextView rowTextView = new TextView(CalendarView.this); 

        // set some properties of rowTextView or something 
        rowTextView.setText("Event:" + desc.get(i)); 
        rowTextView.setTextColor(Color.BLACK); 

        // add the textview to the linearlayout 
       // rLayout.addView(rowTextView); 

       } 
      } 
      desc = null; 
     } 
    }); 
} 

protected void setNextMonth() { 
    if (month.get(GregorianCalendar.MONTH) == month 
      .getActualMaximum(GregorianCalendar.MONTH)) { 
     month.set((month.get(GregorianCalendar.YEAR) + 1), 
       month.getActualMinimum(GregorianCalendar.MONTH), 1); 
    } else { 
     month.set(GregorianCalendar.MONTH, 
       month.get(GregorianCalendar.MONTH) + 1); 
    } 

} 

protected void setPreviousMonth() { 
    if (month.get(GregorianCalendar.MONTH) == month 
      .getActualMinimum(GregorianCalendar.MONTH)) { 
     month.set((month.get(GregorianCalendar.YEAR) - 1), 
       month.getActualMaximum(GregorianCalendar.MONTH), 1); 
    } else { 
     month.set(GregorianCalendar.MONTH, 
       month.get(GregorianCalendar.MONTH) - 1); 
    } 

} 

protected void showToast(String string) { 
    Toast.makeText(this, string, Toast.LENGTH_SHORT).show(); 

} 

public void refreshCalendar() { 
    TextView title = (TextView) findViewById(R.id.title); 
    adapter.refreshDays(); 
    adapter.notifyDataSetChanged(); 
    handler.post(calendarUpdater); // generate some calendar items 
    title.setText(android.text.format.DateFormat.format("MMMM yyyy", month)); 
} 

public Runnable calendarUpdater = new Runnable() { 

    @Override 
    public void run() { 
     items.clear(); 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
     String itemvalue; 
     event = Utility.readCalendarEvent(CalendarView.this); 
     Log.d("=====Event====", event.toString()); 
     Log.d("=====Date ARRAY====", Utility.startDates.toString()); 
     for (int i = 0; i < Utility.startDates.size(); i++) { 
      itemvalue = df.format(itemmonth.getTime()); 
      itemmonth.add(GregorianCalendar.DATE, 1); 
      items.add(Utility.startDates.get(i).toString()); 
     } 
     adapter.setItems(items); 
     adapter.notifyDataSetChanged(); 
    } 
}; 
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

} 
} 

이 내 어댑터 클래스입니다 :

public class CalendarAdapter extends BaseAdapter { 
private Context mContext; 

private java.util.Calendar month; 
public GregorianCalendar pmonth; // calendar instance for previous month 
/** 
* calendar instance for previous month for getting complete view 
*/ 
public GregorianCalendar pmonthmaxset; 
private GregorianCalendar selectedDate; 
int firstDay; 
int maxWeeknumber; 
int maxP; 
int calMaxP; 
int lastWeekDay; 
int leftDays; 
int mnthlength; 
String itemvalue, curentDateString; 
DateFormat df; 
private ArrayList<String> items; 
public static List<String> dayString; 
private View previousView; 

public CalendarAdapter(Context c, GregorianCalendar monthCalendar) { 
    CalendarAdapter.dayString = new ArrayList<String>(); 
    Locale.setDefault(Locale.US); 
    month = monthCalendar; 
    selectedDate = (GregorianCalendar) monthCalendar.clone(); 
    mContext = c; 
    month.set(GregorianCalendar.DAY_OF_MONTH, 1); 
    this.items = new ArrayList<String>(); 
    df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
    curentDateString = df.format(selectedDate.getTime()); 
    refreshDays(); 
} 

public void setItems(ArrayList<String> items) { 
    for (int i = 0; i != items.size(); i++) { 
     if (items.get(i).length() == 1) { 
      items.set(i, "0" + items.get(i)); 
     } 
    } 
    this.items = items; 
} 

public int getCount() { 
    return dayString.size(); 
} 

public Object getItem(int position) { 
    return dayString.get(position); 
} 

public long getItemId(int position) { 
    return 0; 
} 

// create a new view for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    TextView dayView; 
    if (convertView == null) { // if it's not recycled, initialize some 
           // attributes 
     LayoutInflater vi = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.calendar_item, null); 

    } 
    dayView = (TextView) v.findViewById(R.id.date); 
    // separates daystring into parts. 
    String[] separatedTime = dayString.get(position).split("-"); 
    // taking last part of date. ie; 2 from 2012-12-02 
    String gridvalue = separatedTime[2].replaceFirst("^0*", ""); 
    // checking whether the day is in current month or not. 
    if ((Integer.parseInt(gridvalue) > 1) && (position < firstDay)) { 
     // setting offdays to white color. 
     dayView.setTextColor(Color.WHITE); 
     dayView.setClickable(false); 
     dayView.setFocusable(false); 
    } else if ((Integer.parseInt(gridvalue) < 7) && (position > 28)) { 
     dayView.setTextColor(Color.WHITE); 
     dayView.setClickable(false); 
     dayView.setFocusable(false); 
    } else { 
     // setting curent month's days in blue color. 
     dayView.setTextColor(Color.BLUE); 
    } 

    if (dayString.get(position).equals(curentDateString)) { 
     setSelected(v); 
     previousView = v; 
    } else { 
     v.setBackgroundResource(R.drawable.list_item_background); 
    } 
    dayView.setText(gridvalue); 

    // create date string for comparison 
    String date = dayString.get(position); 

    if (date.length() == 1) { 
     date = "0" + date; 
    } 
    String monthStr = "" + (month.get(GregorianCalendar.MONTH) + 1); 
    if (monthStr.length() == 1) { 
     monthStr = "0" + monthStr; 
    } 

    // show icon if date is not empty and it exists in the items array 
    // 
    ImageView iw = (ImageView) v.findViewById(R.id.date_icon); 
    if (date.length() > 0 && items != null && items.contains(date)) { 
     iw.setVisibility(View.VISIBLE); 
    } else { 
     iw.setVisibility(View.INVISIBLE); 
    } 
    return v; 
} 

public View setSelected(View view) { 
    if (previousView != null) { 
     previousView.setBackgroundResource(R.drawable.list_item_background); 
    } 
    previousView = view; 
    view.setBackgroundResource(R.drawable.calendar_cel_selectl); 
    return view; 
} 

public void refreshDays() { 
    // clear items 
    items.clear(); 
    dayString.clear(); 
    Locale.setDefault(Locale.US); 
    pmonth = (GregorianCalendar) month.clone(); 
    // month start day. ie; sun, mon, etc 
    firstDay = month.get(GregorianCalendar.DAY_OF_WEEK); 
    // finding number of weeks in current month. 
    maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH); 
    // allocating maximum row number for the gridview. 
    mnthlength = maxWeeknumber * 7; 
    maxP = getMaxP(); // previous month maximum day 31,30.... 
    calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ... 
    /** 
    * Calendar instance for getting a complete gridview including the three 
    * month's (previous,current,next) dates. 
    */ 
    pmonthmaxset = (GregorianCalendar) pmonth.clone(); 
    /** 
    * setting the start date as previous month's required date. 
    */ 
    pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1); 

    /** 
    * filling calendar gridview. 
    */ 
    for (int n = 0; n < mnthlength; n++) { 
     itemvalue = df.format(pmonthmaxset.getTime()); 
     pmonthmaxset.add(GregorianCalendar.DATE, 1); 
     dayString.add(itemvalue); 
    } 
} 

private int getMaxP() { 
    int maxP; 
    if (month.get(GregorianCalendar.MONTH) == month 
      .getActualMinimum(GregorianCalendar.MONTH)) { 
     pmonth.set((month.get(GregorianCalendar.YEAR) - 1), 
       month.getActualMaximum(GregorianCalendar.MONTH), 1); 
    } else { 
     pmonth.set(GregorianCalendar.MONTH, 
       month.get(GregorianCalendar.MONTH) - 1); 
    } 
    maxP = pmonth.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); 

    return maxP; 
}} 

내 로그인 및 코드의 문제점은 무엇입니까? 당신이 방향을 변경하면

 <activity 
    android:name=".CalendarView" 
    android:configChanges="keyboardHidden|orientation|screenSize" 
    android:label="@string/app_name" > 
     </activity> 

답변

0

다음 안드로이드 (에서 onCreate() 다음에 호출들의 OnDestroy()) 실행중인 활동을 다시 시작과에서 onCreate에서 :

파일 참고에서 나는 또한 코드 아래에 추가 한() 현재 날짜를 설정하기 때문에 응용 프로그램이 방향 변경에 대한 현재 날짜를 표시합니다.

무시 onSaveInstanceState (번들 savedInstanceState)과이 같은 번들 매개 변수로 변경하려는 값 쓰기 : 그것은 또한에서 onCreate()와 onRestoreInstanceState()에 전달 얻을 것이다

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    // Save UI state changes to the savedInstanceState. 
    // This bundle will be passed to onCreate if the process is 
    // killed and restarted. 

    savedInstanceState.putInt("MyInt", 1); 
    // etc. 
} 

하면 좋겠를

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    // Restore UI state from the savedInstanceState. 
    // This bundle has also been passed to onCreate. 

    int myInt = savedInstanceState.getInt("MyInt"); 
} 

보통이 기술을 사용하여 응용 프로그램의 인스턴스 값 (선택 사항, 저장하지 않은 텍스트 등)을 저장합니다.

+0

내 데이터를 저장하기위한 코드를 제공해 주시겠습니까? – user2218667

+0

제 코드를 업데이트했습니다. 도움이 될 것입니다. 도움이된다면 답을 받아 들일 수 있습니다. –

관련 문제