2017-09-23 59 views
0

我希望變量r是全局變量,並且我希望SharedPreferences能夠在全局級別上加載變量r(String s)。需要在setOnClickListener方法中輸入變量

我在做什麼就像一個人工機器人HUNGER變量。我點擊按鈕,它增加了+1飢餓感,但是我想每秒鐘給它-1飢餓時間戳。此外,時間戳用作指示器設備已脫機多久,並且它會按比例提供-xx。

從現在起,我只能在onClickListener中增加+1給R,因爲r是本地聲明的,所以如果(時間已經縮短){r = r-1},我不能給它。我不知道如何把它弄出來。

import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.os.Handler; 
import android.preference.PreferenceManager; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

    private TextView broj; 
    private TextView tekst1; 
    private TextView posljednjeVrijeme; 
    String stringTStamp; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
       /** 
       * Ponavlja radnju svakih 4 sekunde, učitava vrijeme systema 
       */ 
         final Handler ha=new Handler(); 
         ha.postDelayed(new Runnable() { 

          @Override 
          public void run() { 
           Long tStamp = System.currentTimeMillis()/1000; 
           stringTStamp = tStamp.toString(); 
           Toast.makeText(MainActivity.this, stringTStamp, Toast.LENGTH_SHORT).show(); 
           SharedPreferences preferences3 = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
           SharedPreferences.Editor editor = preferences3.edit(); 
           editor.putString("posljednjeVrijeme", stringTStamp); 
           editor.apply(); 



           ha.postDelayed(this, 4000); 
          } 
         }, 4000); 
       /** 
       * ************************************************************** 
       */ 



     broj = (TextView)findViewById(R.id.broj); 
     posljednjeVrijeme = (TextView)findViewById(R.id.posljednjeVrijeme); 

     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     final String name = preferences.getString("vrijednost je ", ""); 
     final String name2 = preferences.getString("posljednjeVrijeme", ""); 
     if(!name.equalsIgnoreCase("")) 
     { 

      broj.setText("vrijednost je "+name); 
      posljednjeVrijeme.setText("Zadnje vrijeme "+name2); 
     } 
     Long tStamp = System.currentTimeMillis()/1000; 
     stringTStamp = tStamp.toString(); 
     if(Integer.parseInt(stringTStamp)-Integer.parseInt(name2)>10){ 
      Toast.makeText(this, "POZDRAV GAZDA DUGO SE NE VIDJEH, UGASIO SI ME PRIJE " + (Integer.parseInt(stringTStamp)-Integer.parseInt(name2))+ " SEKUNDI" , Toast.LENGTH_SHORT).show(); 


     }else{ 

     } 


     tekst1 = (TextView)findViewById(R.id.tekst1); 
     final SharedPreferences preferences2 = PreferenceManager.getDefaultSharedPreferences(this); 
      tekst1.setOnClickListener(new View.OnClickListener() { 
       int r = 0+Integer.parseInt(name); 
       @Override 
       public void onClick(View v) { 

        r = r+1; 


        broj.setText("vrijednost je "+r); 

        String s= String.valueOf(r); 
        SharedPreferences.Editor editor = preferences2.edit(); 
        editor.putString("vrijednost je ", s); 
        editor.apply(); 
       } 
      }); 

    } 
} 
+0

那麼不要在本地聲明它嗎? –

+0

使用Firebase Job Scheduler(更具電池友好性)或Alarm Manager - >以定時間隔啓動服務 - >檢索並編輯sharedPreferences變量。你的r,如果它只是一個int,所以可以把它作爲一個首選項存儲。 –

+0

如果我將其聲明爲globaly,則需要進行最終處理。我無法完成它,因爲它一直在改變價值。 –

回答

1

您可以創建一個公共類說Hunger.java,並添加靜態變量public static int r它。然後使用一個處理器或活套遞減通過時間戳的R您的活動

的onCreate()通過時間戳遞增:

new Handler(Looper.getMainLooper()).post(new Runnable() { 
    @Override 
    public void run() { 
     while(<your timestamp condition>){ 
     Hunger.r = Hunger.r - 1; 
     } 
    } 
}); 

onDestroy()退出應用,然後才能保存SharedPreferencesHunger.r值。

的onDestroy()

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 
SharedPreferences.Editor editor = sharedPref.edit(); 
editor.putInt("myvar",Hunger.r); 
editor.commit(); 

可以加載從SharedPreferences當應用程序重新啓動的r最後一個值。如果您想要在應用程序離線時保持遞減r,則可以在AsyncTask中執行此操作,或者聲明Service

您可以onCreate()檢索SharedPreferences的r值和設定靜態變量Hunger.r 的onCreate()的值正在初始化靜態變量時,應用程序重新啓動]

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 
    Hunger.r = pref.getInt("myvar"); 

你textView.onClickListerner可能像這樣

tekst1.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         Hunger.r = Hunger.r + 1; 

         broj.setText("vrijednost je "+r); 

        } 

    } 

在您的原始代碼中,您每次更新飢餓變量時都會重複寫入SharedPreferences。以這種方式寫數據會不必要地影響性能。

希望這會有所幫助!

+0

如果我想將Hunger.java添加到我的textView.setOnClickListener中,該方法如何看起來像隊友? –

+0

爲您的查詢更新了答案 – sziraqui

1

我找到了解決方案。 setter getter方法幫助我使變量在任何地方都可訪問。現在我點擊按鈕(textView)的代碼給出+1和每隔10秒,如果應用程序處於脫機狀態,則在r變量整數上給出-10。

我找到了解決方案。 getter setter方法幫助我聲明瞭我的r變量,並且能夠在每個函數中控制我的變量。解決方案,即使代碼看起來很醜。

import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.os.Handler; 
import android.preference.PreferenceManager; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

    private TextView broj; 
    private TextView tekst1; 
    private TextView posljednjeVrijeme; 
    String stringTStamp; 
    private int r; 

    public int getDefaultR(){ 
     return r; 
    } 

    public void setDefaultR(int r){ 
     this.r=r; 
    } 




    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
       /** 
       * Ponavlja radnju svakih 4 sekunde, učitava vrijeme systema 
       */ 
         final Handler ha=new Handler(); 
         ha.postDelayed(new Runnable() { 

          @Override 
          public void run() { 
           Long tStamp = System.currentTimeMillis()/1000; 
           stringTStamp = tStamp.toString(); 
           Toast.makeText(MainActivity.this, stringTStamp, Toast.LENGTH_SHORT).show(); 
           SharedPreferences preferences3 = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
           SharedPreferences.Editor editor = preferences3.edit(); 
           editor.putString("posljednjeVrijeme", stringTStamp); 
           editor.apply(); 



           ha.postDelayed(this, 4000); 
          } 
         }, 4000); 
       /** 
       * ************************************************************** 
       */ 



     broj = (TextView)findViewById(R.id.broj); 
     posljednjeVrijeme = (TextView)findViewById(R.id.posljednjeVrijeme); 

     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     final String name = preferences.getString("vrijednost je ", ""); 
     final String name2 = preferences.getString("posljednjeVrijeme", ""); 
     if(!name.equalsIgnoreCase("")) 
     { 

      broj.setText("vrijednost je "+name); 
      posljednjeVrijeme.setText("Zadnje vrijeme "+name2); 
     } 



     Long tStamp = System.currentTimeMillis()/1000; 
     stringTStamp = tStamp.toString(); 

     if(Integer.parseInt(stringTStamp)-Integer.parseInt(name2)<10){ 
      r = 0+Integer.parseInt(name); 
      setDefaultR(0+Integer.parseInt(name)-10); 
      broj.setText("vrijednost je "+r); 
      final SharedPreferences preferences2 = PreferenceManager.getDefaultSharedPreferences(this); 
      String s= String.valueOf(getDefaultR()); 
      SharedPreferences.Editor editor = preferences2.edit(); 
      editor.putString("vrijednost je ", s); 
      editor.apply(); 
     } 

     else if(Integer.parseInt(stringTStamp)-Integer.parseInt(name2)>10){ 
      Toast.makeText(this, "POZDRAV GAZDA DUGO SE NE VIDJEH, UGASIO SI ME PRIJE " + (Integer.parseInt(stringTStamp)-Integer.parseInt(name2))+ " SEKUNDI" , Toast.LENGTH_SHORT).show(); 
      r = 0+Integer.parseInt(name)-10; 
      setDefaultR(0+Integer.parseInt(name)-10); 
      broj.setText("vrijednost je "+r); 
      final SharedPreferences preferences2 = PreferenceManager.getDefaultSharedPreferences(this); 
      String s= String.valueOf(getDefaultR()); 
      SharedPreferences.Editor editor = preferences2.edit(); 
      editor.putString("vrijednost je ", s); 
      editor.apply(); 

     }else{} 





     tekst1 = (TextView)findViewById(R.id.tekst1); 
     final SharedPreferences preferences2 = PreferenceManager.getDefaultSharedPreferences(this); 
      tekst1.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        r = r+1; 


        broj.setText("vrijednost je "+r); 

        String s= String.valueOf(getDefaultR()); 
        SharedPreferences.Editor editor = preferences2.edit(); 
        editor.putString("vrijednost je ", s); 
        editor.apply(); 
       } 
      }); 

    } 
} 
相關問題