我正在使用一種方法將事件添加到手機上的內部日曆。背景一直困擾着我,這一次也不例外。方法契約需要應用程序上下文。該方法的調用是:上下文和日曆
addToCalendar(Context context, String title, long dtstart, long dtend);
這是我的代碼來調用方法時按下按鈕:
public class DateAdder extends Activity {
String shiftType;
Date d = new Date();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button AShift = (Button) findViewById(R.id.AShift);
AShift.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
TextView BtmTxt = (TextView) findViewById(R.id.BtmTxt);
shiftType="A Shift";
addToCalendar(DateAdder.this.getApplicationContext(), shiftType, d.getDate(), d.getDate()+1000);
BtmTxt.setText("Done");
}});
} //END of onCreate
/**
* Adds the event to a calendar. It lets the user choose the calendar
* @param ctx Context (Please use the application context)
* @param title title of the event
* @param dtstart Start time: The value is the number of milliseconds since Jan. 1, 1970, midnight GMT.
* @param dtend End time: The value is the number of milliseconds since Jan. 1, 1970, midnight GMT.
*/
private static void addToCalendar(Context ctx, final String title, final long dtstart, final long dtend) {
final ContentResolver cr = ctx.getContentResolver();
Cursor cursor ;
if (Integer.parseInt(Build.VERSION.SDK) == 8)
cursor = cr.query(Uri.parse("content://com.android.calendar/calendars"), new String[]{ "_id", "displayname" }, null, null, null);
else
cursor = cr.query(Uri.parse("content://calendar/calendars"), new String[]{ "_id", "displayname" }, null, null, null);
if (cursor.moveToFirst()) {
final String[] calNames = new String[cursor.getCount()];
final int[] calIds = new int[cursor.getCount()];
for (int i = 0; i < calNames.length; i++) {
calIds[i] = cursor.getInt(0);
calNames[i] = cursor.getString(1);
cursor.moveToNext();
}
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setSingleChoiceItems(calNames, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ContentValues cv = new ContentValues();
cv.put("calendar_id", calIds[which]);
cv.put("title", title);
cv.put("dtstart", dtstart);
cv.put("dtend", dtend);
cv.put("allday", 1);
cv.put("hasAlarm", 0);
Uri newEvent ;
if (Integer.parseInt(Build.VERSION.SDK) == 8)
newEvent = cr.insert(Uri.parse("content://com.android.calendar/events"), cv);
else
newEvent = cr.insert(Uri.parse("content://com.android.calendar/events"), cv);
if (newEvent != null) {
long id = Long.parseLong(newEvent.getLastPathSegment());
ContentValues values = new ContentValues();
values.put("event_id", id);
values.put("method", 1);
values.put("minutes", 15); // 15 minuti
if (Integer.parseInt(Build.VERSION.SDK) == 8)
cr.insert(Uri.parse("content://com.android.calendar/reminders"), values);
else
cr.insert(Uri.parse("content://calendar/reminders"), values);
}
dialog.cancel();
}
});
builder.create().show();
}
cursor.close();
}
}
當我把這個從我的代碼,我收到了強制關閉。在logcat中寫道:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
我認爲你的問題在別處。只有在向您的佈局動態添加視圖時纔會看到此消息(更具體地說,將佈局附加到應用的窗口時)。如何粘貼(a)更多的代碼,以及(b)來自logcat的完整堆棧跟蹤? – 2010-12-10 12:59:41