Контекст и календарь - PullRequest
       2

Контекст и календарь

1 голос
/ 29 ноября 2010

Я использую метод для добавления события во внутренний календарь на телефоне. Контекст всегда смущал меня, и это время ничем не отличается. Контракт метода хочет контекст приложения. Вызов метода:

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

Ответы [ 4 ]

3 голосов
/ 10 декабря 2010

Ваша проблема в том, что вы создаете диалог, связанный с контекстом приложения, который не является визуальным. На мой взгляд, контекст приложения в любом случае вам не нужен, поскольку все, что вы делаете, - это получаете доступ к распознавателю контента.

Вам просто нужно изменить эту строку:

addToCalendar(DateAdder.this.getApplicationContext(), 
    shiftType, d.getDate(), d.getDate()+1000);

к этому:

addToCalendar(DateAdder.this, 
    shiftType, d.getDate(), d.getDate()+1000);

И ошибка исчезает. (Я проверял это).

ДОПОЛНЕНИЕ:

Также измените первую строку addToCalendar (), чтобы использовать контекст приложения и тем самым выполнить закомментированное требование, но я не уверен, что это имеет значение. I.e.:

final ContentResolver cr = ctx.getApplicationContext().getContentResolver();
0 голосов
/ 11 декабря 2010

Иногда вы также можете сделать

(активность) view.getParent ()

Вместо Dateadder.this или dateadder.this.getapplicationContext ()

0 голосов
/ 10 декабря 2010

Если вы находитесь внутри действия, вы можете напрямую передать this вместо getApplicationContext, так как действие расширяет контекст.ApplicationContext - это контекст для всего приложения, тогда как передача this позволяет передавать текущий контекст.Это может решить вашу проблему.

0 голосов
/ 10 декабря 2010

изменить это

addToCalendar(getApplicationContext(), shiftType, d.getDate(), d.getDate()+1000);

до

addToCalendar(---yourClassName---.this.getApplicationContext(), shiftType, d.getDate(), d.getDate()+1000); 

пример:

addToCalendar(MainActivity.this.getApplicationContext(), shiftType, d.getDate(), d.getDate()+1000); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...