2015-01-10 78 views
5

我目前有一個片段有幾個按鈕幷包含一個onClickListener。每次單擊其中一個按鈕時,計數器變量將增加1,並使用SharedPreferences在另一個Fragment中設置爲TextView的文本。在特定時間復位整數值

即使應用程序完全關閉,計數器也會保持不變,並且會在應用程序的後續運行中出現。

我的新目標是在每一天結束時計數器復位回到0(23:59:00的時間,是精確的)。

我決定避免了谷歌搜索摸不着頭腦,發現TimerTask的,日曆,定時器,並在Android開發者文檔日期的API;我試圖讓這個與這些API一起工作。不幸的是,它沒有按照我計劃的方式工作。變量設置爲0,但它們保持爲零,並且只會增加到1,並且每次退出應用程序時都會回到0。

有沒有更好的方法來解決這個問題?或者我的方法足夠了,我只需要調整/更改一些代碼?

的問題之一可能是在那裏我改變計數器變量引用,以及(如果是的話,我應該在哪裏改變它)?

以下是我嘗試:

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); 

遞增計數器變量的onclick方法:

@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(設置計數器的文本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

想要使用AlarmManager來安排夜間計數器復位。 –

+0

@MikeM。我將如何做到這一點?我正在查看文檔,所以看起來我不得不從類似'AlarmManager am =(AlarmManager)getActivity()。getSystemService(Context.ALARM_SERVICE); am.setExact(AlarmManager.RTC,System.currentTimeMillis(),pendingintent);' – freddiev4

+0

@MikeM。我查看了文檔,但我不明白的是PendingIntent。我沒有嘗試使用意圖,因爲我沒有使用任何活動。這種變量更新僅在兩個片段之間。你能爲我解釋一下嗎? – freddiev4

回答

-1

一些建議:

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); 

應該被編輯這樣

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

  • 命名根據特定的需要我想你的代碼問題是寫得比較雜亂,整理第一眼看它,你先看看,我現在寫一下,順便說一下。也許你應該使用android系統的時鐘。

  • +0

    即使你對所說的話完全正確,它也不回答這個問題。 – rds

    3

    我會親自看一下使用AlarmManagerCalendar設置時間。然後,您將發射Service以完成您需要做的一切。

    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); 
    

    與實際Service更換爲MyService,當服務啓動時,它可以: 1)復位回數爲0 2)檢查應用程序正在運行,看看是否需要立即更新,文本框或如果好等待用戶啓動應用程序 3)停止服務

    事情你遵循此代碼之前調查:

    確保AlarmManager是適合你的,重複報警將無法運行重新啓動後(感謝Jawnnypoo澄清這一點)請參閱下面的他的評論,他鏈接到BroadcastReceiver,以便AlarmManager將在重新啓動後運行。

    +2

    這是這個問題的一個很好的解決方案,我可以100%肯定地告訴你,重新啓動後不會運行重複警報。您需要在重新啓動時重新註冊重複鬧鐘,方法是設置一個廣播接收器,然後在清單中設置權限。在這裏看到更多的例子:http://stackoverflow.com/questions/26138587/android-alarm-manager-set-repeating-at-specific-timing – Jawnnypoo

    +1

    感謝糾正我,我已經編輯我的答覆與你的意見(我聯繫你在回答中) – apmartin1991

    +1

    我認爲在啓動時使用'BroadcasterReceiver'來註冊警報是一種矯枉過正的行爲。也許應用程序甚至不會被使用幾天。 – rds

    2
    • 只需將上次計數器重置的時間保存在前綴中即可。
    • 當片段啓動第一次:
      • 它檢查上次計數器進行復位,也許它們重置
      • 它通過AlarmManager註冊了報警的下一個午夜,會拋出廣播意圖
      • 它註冊一個廣播接收器。
    • 當廣播接收機接收到該意圖時,它重置計數器,通知該片段並在下一個午夜註冊警報。
    • 如果該活動已停止,請移除您的廣播接收器並取消您的鬧鐘,以免應用程序無法正常播放。
    1

    對此任務使用AlarmManager看起來很乏味。只需在SharedPreferences中添加另一個變量即可。 (可能是 - Calendar.getInstance()。getTimeInMillis())

    因此,當您在獲取計數器值時打開片段時,必須在上次更新計數器值時進行。查看當前存儲的時間。如果不匹配,則重置計數器值。

    如果我沒有錯過任何東西讓我知道.. :)

    +0

    您錯過了屏幕可以在23:59:59開啓的事實,並且計數器在下一秒保持不變,當它們應該被重置時。否則,我也同意,有一個AlarmManager,服務,廣播接收器有很多矯枉過正。 – rds

    3

    也許只是存儲一年的一天,與去年的當天進行比較。

    dayOfYear = DateFormat.format("D", new Date()) 
    
    if (dayOfYear != lastResetDay) { 
        resetCounters(); 
    } 
    
    +0

    如果應用程序在使用後一年後打開,則會出現問題。 – rds

    +0

    主要問題沒有回答:您什麼時候執行此檢查? – rds

    +0

    'dayOfYear = DateFormat.format(「YD」,new Date())'這將修復使用後一年的問題。這個檢查可以隨時運行,但我不熟悉Android知道什麼是理想的。 – rockerBOO