Android 方法在DatePicker中调用了两次
我在简单的Android 方法在DatePicker中调用了两次,android,datepickerdialog,Android,Datepickerdialog,我在简单的活动中使用datepickerdialog。当对话框关闭时,下面的方法将被调用2次 private void FetchData(String day, String month, int year) 我不知道为什么当DatepickerDialog只显示1次时,这个方法调用了2次 public class MainActivity extends Activity { ListView listview; Cursor smscursor; SMS_SQL sql; ListAda
活动中使用datepickerdialog
。当对话框关闭时,下面的方法将被调用2次
private void FetchData(String day, String month, int year)
我不知道为什么当DatepickerDialog只显示1次时,这个方法调用了2次
public class MainActivity extends Activity {
ListView listview;
Cursor smscursor;
SMS_SQL sql;
ListAdapter adapter;
final ArrayList<List> list = new ArrayList<List>();
private int year;
private int month;
String monthstr;
private int day;
String dayday, monthmonth;
ArrayList<String> smslist = new ArrayList<String>();
String PhoneNo = "1234567890";
static final int DATE_DIALOG_ID = 999;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewsms);
ActionBar action = getActionBar();
action.setDisplayHomeAsUpEnabled(true);
action.setDisplayShowTitleEnabled(true);
listview = (ListView) findViewById(R.id.listview);
sql = new SMS_SQL(this);
sql.Open();
final Calendar c = Calendar.getInstance();
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
day = c.get(Calendar.DAY_OF_MONTH);
smscursor = sql.FetchSMS();
while (smscursor.moveToNext()) {
list.add(new List(smscursor.getString(smscursor
.getColumnIndexOrThrow(SMS_SQL.SMS_TITLE)), smscursor
.getString(smscursor
.getColumnIndexOrThrow(SMS_SQL.SMS_DATE)),
smscursor.getInt(smscursor
.getColumnIndexOrThrow(SMS_SQL.SMS_ID)),
smscursor.getString(smscursor
.getColumnIndexOrThrow(SMS_SQL.SMS_MESSAGE))));
}
adapter = new ListAdapter(this, R.layout.smsitem, list);
adapter.setNotifyOnChange(true);
listview.setAdapter(adapter);
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
// set date picker as current date
return new DatePickerDialog(this, datePickerListener, year, month,
day);
}
return null;
}
private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {
// when dialog box is closed, below method will be called.
public void onDateSet(DatePicker view, int selectedYear,
int selectedMonth, int selectedDay) {
year = selectedYear;
month = selectedMonth;
day = selectedDay;
month++;
if (day <= 9) {
dayday = 0 + "" + day;
} else {
dayday = "" + day;
}
if (month <= 9) {
monthmonth = 0 + "" + month;
} else {
monthmonth = "" + month;
}
FetchData(dayday, monthmonth, year);
}
};
private void FetchData(String day, String month, int year) {
// TODO Auto-generated method stub
String date1 = day + "-" + month + "-" + year;
Cursor sms = sql.fetchSmsByDate(date1);
while (sms.moveToNext()) {
smslist.add(sms.getString(sms
.getColumnIndexOrThrow(SMS_SQL.SMS_MESSAGE)));
}
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder
.setTitle("Are you Sure To Send All This SMS To 1234567890..??");
alertDialogBuilder
.setMessage(
"If You Press Yes Then All Location Saved On this Date is Send..!!")
.setCancelable(true);
alertDialogBuilder.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
sendit();
dialog.dismiss();
}
}).setNegativeButton("No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
private void sendit() {
for (int i = 0; i < smslist.size(); i++) {
sendSMS(PhoneNo, smslist.get(i));
}
}
private void sendSMS(String phoneNumber, String message) {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
// ---when the SMS has been sent---
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
// ---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@SuppressWarnings("deprecation")
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(MainActivity.this, AddToDB.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
case R.id.Sync:
showDialog(DATE_DIALOG_ID);
return true;
}
return super.onOptionsItemSelected(item);
}
}
公共类MainActivity扩展活动{
列表视图列表视图;
光标smscursor;
SMS_SQL;
列表适配器;
最终ArrayList=新ArrayList();
私人国际年;
私人整数月;
弦月;
私人国际日;
弦日、弦月;
ArrayList smslist=新的ArrayList();
字符串PhoneNo=“1234567890”;
静态最终整数日期对话框ID=999;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.viewsms);
ActionBar action=getActionBar();
action.setDisplayHomeAsUpEnabled(true);
action.setDisplayShowTitleEnabled(true);
listview=(listview)findViewById(R.id.listview);
sql=新的SMS_sql(此);
sql.Open();
最终日历c=Calendar.getInstance();
年份=c.get(日历年);
月=c.get(日历月);
day=c.get(日历,每月的第天);
smscursor=sql.FetchSMS();
while(smscursor.moveToNext()){
添加(新列表)smscursor.getString(smscursor
.getColumnIndexOrThrow(SMS_SQL.SMS_TITLE)),smscursor
.getString(smscursor)
.getColumnIndexOrThrow(SMS_SQL.SMS_日期)),
smscursor.getInt(smscursor
.getColumnIndexOrThrow(SMS_SQL.SMS_ID)),
获取字符串(smscursor
.getColumnIndexOrThrow(SMS_SQL.SMS_MESSAGE));
}
适配器=新的ListAdapter(this,R.layout.smsitem,list);
adapter.setNotifyOnChange(true);
setAdapter(适配器);
}
@凌驾
受保护的对话框onCreateDialog(int id){
开关(id){
案例日期\u对话框\u ID:
//将日期选择器设置为当前日期
返回新的DatePickerDialog(此,datePickerListener,年,月,
日);
}
返回null;
}
私有DatePickerDialog.OnDateSetListener datePickerListener=new DatePickerDialog.OnDateSetListener(){
//当对话框关闭时,将调用下面的方法。
public void onDateSet(日期选择器视图,int selectedYear,
int selectedMonth,int selectedDay){
年份=所选年份;
月份=选择的月份;
day=所选日期;
月份++;
如果自JellyBean之后(第天),调用DatePicker
类的onDateSet()
方法两次,即在按下Ok
按钮时调用一次,然后在解除DatePickerDialog
时调用一次。这是一个已知的“错误”。您可以有如下解决方法:-
int noOfTimesCalled=0;
在类级别,然后用以下代码替换onDateSet()
方法:-
public void onDateSet(DatePicker view, int selectedYear,
int selectedMonth, int selectedDay) {
if(noOfTimesCalled%2==0) {
year = selectedYear;
month = selectedMonth;
day = selectedDay;
month++;
if (day <= 9) {
dayday = 0 + "" + day;
} else {
dayday = "" + day;
}
if (month <= 9) {
monthmonth = 0 + "" + month;
} else {
monthmonth = "" + month;
}
FetchData(dayday, monthmonth, year);
}
noOfTimesCalled++;
}
public void onDateSet(日期选择器视图,int selectedYear,
int selectedMonth,int selectedDay){
如果(称为%2==0){
年份=所选年份;
月份=选择的月份;
day=所选日期;
月份++;
if(day@Abhishek:是这个问题的bug报告的链接。@Abhishek:我还忘了在回答中提到,按下Cancel
按钮也会调用onDateSet()
方法,但只调用一次。