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()
方法,但只调用一次。