Soru Android: DatePicker Dialog'dan onDateSet İkizini İçeren Android 4.1 Emulator


Uygulamam Android 2.2 öykünücemde mükemmel çalışıyordu. Daha sonra bir Android 4.1 emülatörü üzerinde test etmeye karar verdim. DatePickerDialog biraz farklı görünüyor ve "Bitti" ye bastığımda nedense onDateSet() Dinleyici iki kez çağrılır ve uygulamada sorunlara neden olur.

Bunu biliyorum çünkü "Bitti" ye tıkladığımda, kodda aşağıda gösterilen kayıt iki kez yazdırılır

mDateSetListener = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            Log.v("onDateSet", "ENTERED");
            //rest of code...
    }};

Android 2.2 DatePicker

Working Android 2.2 DatePicker

Android 4.1 DatePicker

Not Working Android 4.1 DatePicker


18
2017-07-08 13:41


Menşei


emulator 30 Ağustos 2012 aynı sorun android 4.1, oy code.google.com/p/android/issues/detail?id=34860 - Moak
olası kopyası Jelly Bean DatePickerDialog --- iptal etmek için bir yol var mı? - Paul Lammertsma


Cevaplar:


Aynı diyalog içinde bir çift ateşi kontrol etmek için bir boole ayarlamayı deneyin. Benzer bir şey:

Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_YEAR, 1);
final DatePickerDialog dateDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
    boolean fired = false;
    public void onDateSet(final DatePicker view, final int year, final int monthOfYear, final int dayOfMonth) {
        Log.i("PEW PEW", "Double fire check");
        if (fired) {
            Log.i("PEW PEW", "Double fire occured. Silently-ish returning");
            return;
        } else {
            //first time fired
            fired = true;
        }
        //Normal date picking logic goes here
    }
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
dateDialog.show();

Bu çift yangın sorunu da bir TimePickerDialog onTimeSet ile olur ve bu kontrol de bunlar için çalışır.


24
2017-07-31 20:12



Evet, işe yaramalı. Umarım yakında bu sorunu giderir. - Nouran H
Geri geçiş fired değişken false böylece DatePicker daha sonra çalışmaya devam eder. Bu arada, sorun ayrıca TimePicker iletişim kutularında da ortaya çıkar. - Siklab.ph
Bu çalışma konsepti aynı zamanda TimePicker diyalogları için yaratılış üzerine benzer bir “ateşli” kontrol kullanarak da çalışır. - lodlock
OMG - Tarihçiden onDateSet'teki kodun neden doğru çalışmadığını ve bazı toastİşaretlerin neden iki kez ateş ettiğini anladıktan sonra çıldırmaya çalışıyorum. Çok teşekkür ederim - 11 saat hata ayıklamaya çalışıyor ve bu o lanet sorun oldu. TEŞEKKÜR EDERİM!!!!! - gbotha
Bu eksik bir çözümdür. Böcek arıyor onDateSet() "Bitti" düğmesine basıldığında ve diyalog reddedildiğinde. İkincisi, sorunludur, çünkü kullanıcı, kullanıcı iptal ettiğinde (yani, geri basar veya diyaloğun dışına dokunduğunda) ayarlanır. Burada yayınlanan çözüm bu sorunu çözmez. - Paul Lammertsma


Ankur Chaudhary'ın parlaklığına göre Cevap benzer TimePickerDialog içinde kontrol ettiğimizde sorun onDateSet eğer verilen görüş isShown() ya da değil, tüm meseleyi en az çabayla, seçiciyi genişletmeye ya da kod etrafında dolaşan bazı çirkin bayraklara bakmaya ya da işletim sistemi sürümünü kontrol etmeye gerek kalmadan çözecek, sadece aşağıdakileri yapın:

public void onDateSet(DatePicker view, int year, int month, int day) {
    if (view.isShown()) {
        // read the date here :)
    }
}

ve tabii ki aynı şey için yapılabilir onTimeSet Ankur'un cevabına göre


1
2018-03-16 17:35





Ben bununla ilgili olduğunu düşünüyorum, bugün 4.1'de test etmeye başladım ve bazı javascript olaylarının iki kez ateşlendiğini fark ettim. Çoğunlukla şu anda tıklayın. Garip bir uyarı eklerseniz, 'bazen' bir kez ateşler. Davranış tuhaf bir şekilde tutarsız.

Javascript olayları sadece android 4.1 bu şekilde yanıt. iPhone Android'in tüm önceki sürümlerinde olduğu gibi gayet iyi görünüyor (4.0.x dahil).

Tarayıcıda bir hata ya da işleme biçimi bana javascript gibi görünüyor ama bu sadece bir tahmin.


0
2017-07-13 11:43



Bu hatayı çözmek için herhangi bir öneriniz var mı? Herhangi bir çözüm var mı? :) - Nouran H
Şimdiye kadar bulduğum bir şey yok. Ayrıca, yukarıdakilere ek olarak yalnızca tıklama veya dokunma etkinliklerinde görünüyor. tüm olaylar değil. (biraz zaman aldığımda) android hata listesinde bir hata raporu oluşturacağım. - Dan


Tekrarlamak için: Bu Android'de onaylanmış bir hatadır. İki geçici çözüm önerildi, durumu bir (instance) değişkeni olarak kaydetme veya Dialog'a sorma isShown(). Fakat isShown() güvenilmez gibi görünüyor (göre bu yanıtın yorumları örneğin) ve diyaloğu tekrar göstermek isterseniz durumu kurtarırsınız.
Daha iyi bir çözüm, diyaloğun içerisindeki durumu kurtarmaktır:

public void onDateSet(DatePicker picker, int year, int monthOfYear, int dayOfMonth) {
    if (picker.getTag() == null) {
        picker.setTag("TAGGED");
        // Only gets called once per Dialog
    }
}

Temiz ve etkili.


0
2018-04-29 13:29