2013-11-27 22 views
0

我必须开发一个Android日历应用程序。所选日期显示在横向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

当改变取向然后Android的重新启动运行的活动(的onDestroy()被调用,随后的onCreate())和在的onCreate ()你正在设置当前日期,这就是为什么你的应用程序显示方向变化的今天日期。

的onSaveInstanceState覆盖(捆绑savedInstanceState)和写要更改的捆绑参数是这样的值:

@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. 
} 

它将获得通过到的onCreate(),也onRestoreInstanceState(),您会提取这样的值:

@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

我更新了我的代码,希望它能帮助你。如果有帮助,那么你可以接受答案。 –

相关问题