我正在尝试创建一个可以从用户输入中编写Google日历事件的应用,还可以从我的Google日历中读取事件列表。我试图寻找很多例子,但大多数只展示了非常基本的例子。
我正在使用alertdialog从用户那里获取输入,并希望将数据发送到AsyncTask。我想在createEvent()
mActivity.updateResultsText1(createEvent())
时我错了
这是我的calendar_activity代码。
public class CalendarActivity extends FragmentActivity implements OnClickListener {
private ListView listevent;
private Button addeventbtn;
private Button deleteeventbtn;
public String nama, tanggal, mulai, beres;
private ArrayAdapter<String> adapter;
List<String> eventlist =new ArrayList<String>();
com.google.api.services.calendar.Calendar mService;
GoogleAccountCredential credential;
private TextView mStatusText;
final HttpTransport transport = AndroidHttp.newCompatibleTransport();
final JsonFactory jsonFactory = GsonFactory.getDefaultInstance();
static final int REQUEST_ACCOUNT_PICKER = 1000;
static final int REQUEST_AUTHORIZATION = 1001;
static final int REQUEST_GOOGLE_PLAY_SERVICES = 1002;
private static final String PREF_ACCOUNT_NAME = "accountName";
private static final String[] SCOPES = { CalendarScopes.CALENDAR };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calendar);
listevent=(ListView)findViewById(R.id.kalenderlist);
addeventbtn=(Button) findViewById(R.id.addeventbutton);
addeventbtn.setOnClickListener(this);
deleteeventbtn=(Button)findViewById(R.id.deleteevent);
deleteeventbtn.setOnClickListener(this);
adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,eventlist);
mStatusText = (TextView)findViewById(R.id.statustext);
mStatusText.setTypeface(null, Typeface.BOLD);
mStatusText.setText("Retrieving data...");
// Initialize credentials and service object.
SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
credential = GoogleAccountCredential.usingOAuth2(
getApplicationContext(), Arrays.asList(SCOPES))
.setBackOff(new ExponentialBackOff())
.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
mService = new com.google.api.services.calendar.Calendar.Builder(
transport, jsonFactory, credential)
.setApplicationName("Google Calendar API Android")
.build();
}
public void onClick(View v) {
if (v.getId()==R.id.addeventbutton) {
AlertDialog.Builder addeventdialog = new AlertDialog.Builder(CalendarActivity.this);
View mViewaddevent = getLayoutInflater().inflate(R.layout.activity_addevent,null);
final EditText namaevent=(EditText)mViewaddevent.findViewById(eventname);
final EditText tanggalevent=(EditText)mViewaddevent.findViewById(eventdate);
final EditText mulaievent=(EditText)mViewaddevent.findViewById(R.id.eventtimestart);
final EditText beresevent=(EditText)mViewaddevent.findViewById(R.id.eventtimeend);
addeventdialog.setView(mViewaddevent);
final AlertDialog dialog = addeventdialog.create();
dialog.show();
Button addbutton=(Button)mViewaddevent.findViewById(R.id.eventsavebutton);
addbutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (!namaevent.getText().toString().isEmpty()&&!tanggalevent.getText().toString().isEmpty()&&!mulaievent.getText().toString().isEmpty()&&!beresevent.getText().toString().isEmpty()){
nama = namaevent.getText().toString();
tanggal = tanggalevent.getText().toString();
mulai = mulaievent.getText().toString();
beres = beresevent.getText().toString();
dialog.dismiss();
}
else {
Toast.makeText(CalendarActivity.this,"Masukan tidak lengkap",Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
}
});
Button cancelbtn=(Button)mViewaddevent.findViewById(R.id.eventcancelbutton);
cancelbtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
}
if (v.getId()==R.id.deleteevent) {
}
}
public void updateResultsText(final List<String> dataStrings) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (dataStrings == null) {
mStatusText.setText("Error retrieving data!");
} else if (dataStrings.size() == 0) {
mStatusText.setText("No data found.");
} else {
mStatusText.setText("Data retrieved using" +
" the Google Calendar API:");
eventlist.addAll(dataStrings);
listevent.setAdapter(adapter);
}
}
});
}
public void updateResultsText1(final String dataStrings1) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (dataStrings1 == null) {
mStatusText.setText("Error retrieving data!");
} else if (dataStrings1 == "") {
mStatusText.setText("No data found.");
} else {
mStatusText.setText("Data retrieved using" +
" the Google Calendar API:");
}
}
});
}
这是我的AsyncTask代码。
public class ApiAsyncTask extends AsyncTask<Void, Void, String> {
private CalendarActivity mActivity;
ApiAsyncTask(CalendarActivity activity) {
this.mActivity = activity;
}
@Override
protected String doInBackground(Void... params) {
try {
mActivity.clearResultsText();
mActivity.updateResultsText(getDataFromApi());
mActivity.updateResultsText1(createEvent());
} catch (final GooglePlayServicesAvailabilityIOException availabilityException) {
mActivity.showGooglePlayServicesAvailabilityErrorDialog(
availabilityException.getConnectionStatusCode());
} catch (UserRecoverableAuthIOException userRecoverableException) {
mActivity.startActivityForResult(
userRecoverableException.getIntent(),
CalendarActivity.REQUEST_AUTHORIZATION);
} catch (IOException e) {
mActivity.updateStatus("The following error occurred: " +
e.getMessage());
}
return null;
}
private List<String> getDataFromApi() throws IOException {
// List the next 20 events from the primary calendar.
DateTime now = new DateTime(System.currentTimeMillis());
List<String> eventStrings = new ArrayList<String>();
Events events = mActivity.mService.events().list("primary")
.setMaxResults(20)
.setTimeMin(now)
.setOrderBy("startTime")
.setSingleEvents(true)
.execute();
List<Event> items = events.getItems();
for (Event event : items) {
DateTime start = event.getStart().getDateTime();
if (start == null) {
// All-day events don't have start times, so just use
// the start date.
start = event.getStart().getDate();
}
eventStrings.add(
String.format("%s (%s)", event.getSummary(), start));
}
return eventStrings;
}
private String createEvent() throws IOException {
Event event2 = new Event()
.setSummary(mActivity.nama);
DateTime startDateTime = new DateTime(mActivity.tanggal+"T"+mActivity.mulai+":00+07:00");
EventDateTime start = new EventDateTime()
.setDateTime(startDateTime)
.setTimeZone("Asia/Jakarta");
event2.setStart(start);
DateTime endDateTime = new DateTime(mActivity.tanggal+"T"+mActivity.beres+":00+07:00");
EventDateTime end = new EventDateTime()
.setDateTime(endDateTime)
.setTimeZone("Asia/Jakarta");
event2.setEnd(end);
String[] recurrence = new String[] {"RRULE:FREQ=DAILY;COUNT=1"};
event2.setRecurrence(Arrays.asList(recurrence));
String calendarId = "primary";
try {
event2 = mActivity.mService.events().insert(calendarId, event2).execute();
} catch (IOException e) {
e.printStackTrace();
}
System.out.printf("Event created: %s\n", event2.getHtmlLink());
Log.e("Event", "created : " + event2.getHtmlLink());
String eventStrings = "created : " + event2.getHtmlLink();
return eventStrings;
}
以下是我的应用{%3}和Calendar activity的内容。我还有另一个问题。将事件列表放在阅读Google日历活动的列表视图中仅显示1个事件。如果我使用textview而不是Listview,并将所有事件连接成一个字符串,则可以显示20个事件。
感谢您阅读我的问题并完成我的错误代码。希望你能回答他们。