2015-01-10 20 views
5

Şu anda birkaç Düğme içeren ve bir onClickListener içeren bir Parçam var. Bu düğmelerden biri her tıklandığında, bir sayaç değişkeni 1 ile artırılır ve PaylaşılanPreferences'ı kullanarak başka bir Parçada bir TextView için metin olarak ayarlanır.Günün Belirli Bir Saatinde Tamsayı Değerini Sıfırla

Uygulama tamamen kapatıldıktan sonra sayaç aynı kalacaktır ve uygulamanın sonraki işlemlerinde görünecektir.

Yeni hedefim, sayaçların her günün sonunda 0'a geri sıfırlanmasıdır (tam olarak 23:59:00).

ben bu anlamaya bir Google araması önlemek karar verdi ve TimerTask, Takvim, Timer bulundu ve Android Geliştirici dokümanlar üzerinde tarihi API'leri; Bu API'larla çalışmayı denedim. Ne yazık ki planladığım şekilde çalışmıyor. değişkenleri 0'a geri ayarlıdır, ancak sıfırda kalırlar ve yalnızca 1'e kadar artar ve uygulamadan her çıktığımda 0'a geri döner.

Buna yaklaşmanın daha iyi bir yolu var mı? Ya da benim yöntemim yeterli, ve sadece kodun bazılarını değiştirmem/değiştirmem gerekiyor mu? sorunların

Bir Ben de sayaç değişkeni referans değiştiriyorum (ve eğer öyleyse, bunu nerede değiştirmelisiniz) nerede olabilir? İşte

Ben girişiminde aşağıdadır:

FirstFragment

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflating the layout 
     View v = inflater.inflate(R.layout.starting_fragment, container, false); 

     //Instantiate new Timer 
     Timer timer = new Timer(); 
     // Creates a Calendar object that specifies a specific time of day 
     Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(System.currentTimeMillis()); 
     cal.set(Calendar.HOUR_OF_DAY, 20); 
     cal.set(Calendar.MINUTE, 57); 
     cal.set(Calendar.SECOND, 00); 
     cal.set(Calendar.MILLISECOND, 00); 

     // Instantiate a day object and use the time of day from cal object as its data 
     Date date = cal.getTime(); 

     TimerTask tt = new TimerTask() { 
      // Sets the counter variables back to 0 
      @Override 
      public void run() { 
       COUNT_OOL = 0; 
       COUNT_WTE = 0; 
       COUNT_BLO = 0; 
       COUNT_BLK = 0; 
       COUNT_HBL = 0; 
       COUNT_GRN = 0; 
       COUNT_MTE = 0; 

      } 
     }; 
     // Resets the counter variables (to 0) at the time specified by the date object 
     timer.schedule(tt, date); 

     // Stores count for each button back into their respective count variable 
     // Initializes the value from previous runs of app to subsequent runs of app 
     // This way, count variables will never get set back to 0 after onDestroy() 
     COUNT_OOL = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("oolongCount", 0); 
     COUNT_WTE = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("whiteCount", 0); 
     COUNT_BLO = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("bloomingCount", 0); 
     COUNT_BLK = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("blackCount", 0); 
     COUNT_HBL = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("herbalCount", 0); 
     COUNT_GRN = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("greenCount", 0); 
     COUNT_MTE = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("mateCount", 0); 

sayaç değişkenlerini artırır onClick yöntemi:

@Override 
    public void onClick(View view) { 
     int id = view.getId(); 
     /* 
     * Use the View interface with OnClickListener to get the Button ID's 
     * Then you can run a switch on the Buttons (because normally switches 
     * cannot be run on buttons 
     */ 

     if (id == R.id.tea_type1) { 
      Builder oolongBuilder = new AlertDialog.Builder(StartingFragment.this.getActivity(), 
        AlertDialog.THEME_HOLO_LIGHT); 

      oolongBuilder.setPositiveButton("Hot", 
        //Starts OolongTeaActivity for hot tea when clicked 
        new DialogInterface.OnClickListener() { 

         @Override 
         public void onClick(DialogInterface arg0, int arg1) { 
          Intent i = new Intent(StartingFragment.this.getActivity(), 
            OolongTeaActivity.class); 
          StartingFragment.this.getActivity().startActivity(i); 
         } 
        }); 

      oolongBuilder.setNeutralButton("Iced", 

        new DialogInterface.OnClickListener() { 

         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          Intent i = new Intent(StartingFragment.this.getActivity(), 
            ColdOolongTeaActivity.class); 
          StartingFragment.this.getActivity().startActivity(i); 

         } 
        }); 

      oolongBuilder.setTitle("Oolong Tea"); 
      oolongBuilder.setMessage("How Do You Like Your Tea?"); 

      AlertDialog oolongDialog = oolongBuilder.create(); 
      oolongDialog.show(); 

      COUNT_OOL++; 
      SharedPreferences pref1 = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE); 
      SharedPreferences.Editor editor1 = pref1.edit(); 
      editor1.putInt("oolongCount", COUNT_OOL); 
      editor1.commit(); 

     } 

SecondFragment (için metin olarak sayaç kurar TextViews):

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_tea_counter, container, false); 

     oolongCounterText = (TextView) rootView.findViewById(R.id.oolong_counter_tv); 

     SharedPreferences pref1 = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE); 
     Integer counter1 = pref1.getInt("oolongCount", 0); 
     String s1 = String.valueOf(counter1); 
     oolongCounterText.setText(s1); 
+0

Gecikme sayacınızı programlamak için 'AlarmManager' kullanmak istiyorsunuz. –

+0

@MikeM. Bunu nasıl yapardım? Şu anda belgelere bakıyorum ve öyle görünüyor ki 'AlarmManager am = (AlarmManager) getActivity(). GetSystemService (Context.ALARM_SERVICE); am.setExact (AlarmManager.RTC, System.currentTimeMillis(), pendingintent); ' – freddiev4

+0

@MikeM. Belgelere baktım ama anlamadığım şey PendingIntent. Bir niyet kullanmaya çalışmıyorum çünkü herhangi bir etkinlik kullanmıyorum. Değişkenlerin güncellenmesi sadece iki Fragman arasındadır. Bunu benim için biraz daha açıklayabilir misin? – freddiev4

cevap

-1

Bazı tavsiyelerde:

1.

COUNT_OOL = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("oolongCount", 0); 
COUNT_WTE = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("whiteCount", 0); 
COUNT_BLO = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("bloomingCount", 0); 
COUNT_BLK = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("blackCount", 0); 
COUNT_HBL = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("herbalCount", 0); 
COUNT_GRN = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("greenCount", 0); 
COUNT_MTE = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE).getInt("mateCount", 0); 

bu

private SharedPreferences sharedPreferences; 
sharedPreferences = getActivity().getSharedPreferences("keyname", Context.MODE_PRIVATE); 
COUNT_OOL = sharedPreferences.getInt("oolongCount", 0); 

vb

  1. Named gibi düzenlenmesi gerekir speci ihtiyaçlarına göre fication

  2. Bence kod probleminiz daha düzensiz yazmak, ilk bakışta bitirmek, önce bir göz atmak, şimdi yazıyorum. Belki android sisteminin saatini kullanmalısın.

+0

, söylediklerinize tamamen uygun olmanıza rağmen, soruya cevap vermiyor. – rds

3

Ben şahsen saatini ayarlamak için Calendar ile AlarmManager kullanarak bakmak istiyorum. Daha sonra yapmanız gereken her şeyi yapmak bir Service ateşlenmesine.hizmeti yapabilirsiniz başladığında

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 23); 
calendar.set(Calendar.MINUTE, 59); 
calendar.set(Calendar.SECOND, 59); 
calendar.set(Calendar.MILLISECOND, 0); 
PendingIntent pi = PendingIntent.getService(context, 0, 
      new Intent(context, MyService.class),PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
           AlarmManager.INTERVAL_DAY, pi); 

, gerçek bir Service ile MyService değiştirin: 1) 0 2'ye geri numarayı Reset hemen textboxes güncellemeniz gerekiyorsa Uygulamanın görmesine çalışıp çalışmadığını kontrol edin) ya da tamam servisi durdurmak, bu kodu uygulamadan önce araştırmak için

şeyler uygulamasını 3) başlatmak için kullanıcı için beklemek durumunda:

AlarmManager sizin için doğru olduğundan emin olun, bir yinelenen alarmı reklamları YAYINLAMAYACAĞINI yeniden başlatıldıktan sonra (Bu açıklığa kavuşturmak için Jawnnypoo'a teşekkürler) BroadcastReceiver'a bağlandığı aşağıdaki yorumuna bakın, böylece AlarmManager yeniden başlatmadan sonra çalışacaktır.

+2

Bu, bu sorun için iyi bir çözümdür ve yinelenen bir alarmın yeniden başlatıldıktan sonra ÇALIŞTIRILMADIĞINI% 100 kesin olarak söyleyebilirim. Tekrar eden alarmınızı bir yayın alıcısı kurarak ve izninizdeki izni ayarlayarak yeniden başlatma sırasında yeniden kaydetmeniz gerekir. Burada daha fazla örnek görmek için: http://stackoverflow.com/questions/26138587/android-alarm-manager-set-repeating-at-specific-timing – Jawnnypoo

+1

Beni düzeltdiğiniz için teşekkür ederim, cevabımı tavsiyenizle düzenledim (cevapta) – apmartin1991

+1

Bir "BroadcasterReceiver" kullanarak alarmı kaydetmek için bir overkill olduğunu düşünüyorum. Belki de uygulama günlerce kullanılmayacak. – rds

2
  • Sadece son kez sayacın bir pref.
  • fragmanı ilk kez başladığında:
    • o sayaçlar sıfırlandı son bir kere kontrol belki bunları sıfırlar o niyet yayın atar sonraki gece yarısı, için AlarmManager aracılığıyla alarm kaydeder
    • Bir yayın alıcısını kaydeder.
  • Yayın alıcısı amacı aldığında, sayaçları sıfırlar, parçayı bilgilendirir ve sonraki gece yarısı için alarmı kaydeder.
  • Etkinlik durdurulursa, yayın alıcınızı kaldırın ve alarmınızı iptal edin, böylece uygulama zaten görünmeyecek bir iş yapmaz.
1

Bu görev için AlarmManager'ı kullanmak yorucu bir iş gibi görünüyor. SharedPreferences'larınıza başka bir değişken ekleyin. Sayacın güncellendiği en son süreyi saklayın (Muhtemelen - Calendar.getInstance(). GetTimeInMillis())

Sayaç değerini alırken parçayı açtığınızda, en son ne zaman güncellendiğini almanız gerekir. Bulunduğunuz güne göre saklanan zamanı kontrol edin. Eşleşmiyorsa, sayaç değerini sıfırlayın. Ben bana bildirin şey kaçırmak .. yaptıysak

:)

+0

Ekranın 23: 59: 59'da açık olabileceğini ve sayaçların sıfırlanması gerektiğinde sayaçların bir sonraki saniye değişmeden kalacağını görüyorsunuz. Aksi takdirde, aynı zamanda bir AlarmManager, Servis, BroadcastReceiver sahip olmanın çok fazla fazla olduğu konusunda hemfikirim. – rds

3

Belki sadece yılın gününü saklamak ve yılın Geçerli gün ile karşılaştırmak.

dayOfYear = DateFormat.format("D", new Date()) 

if (dayOfYear != lastResetDay) { 
    resetCounters(); 
} 
+0

Uygulama kullanımdan tam bir yıl sonra açılırsa hata. – rds

+0

Ana soru cevaplanmadı: Bu kontrolü ne zaman gerçekleştirdiniz? – rds

+0

'dayOfYear = DateFormat.format (" YD ", yeni Tarih())' Bu, kullanımdan sonraki bir yıl sonra giderilebilir. İdeal olanı bilmek için Android'e aşina olmamasına rağmen bu kontrol herhangi bir zamanda çalıştırılabilir. – rockerBOO

İlgili konular