2017-09-23 18 views
0

変数rをグローバルにして、SharedPreferencesで変数r(String s)をグローバルレベルでロードできるようにします。setOnClickListenerメソッドで変数をアクセントする必要があります

私が作っているのは、人工ロボットHUNGER変数のようなものです。私はボタンをクリックして+1空腹を追加しますが、毎秒私はそれにタイムスタンプ付きの空腹を与えたいと思います。また、タイムスタンプは、デバイスがオフラインになっている時間を示すインジケータとして機能し、-xxの比例を与えます。

現在のところ、私はローカル変数がonClickListenerであるため、Rに+1を加えることしかできません。rがlocaly宣言されているため、(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ジョブスケジューラ(よりバッテリにやさしい)またはAlarm Managerを使用して、一定時間内にサービスを開始する - > sharedPreferences変数を取得および編集します。それがちょうどintの場合はあなたのrだから、好みとしてそれを保存するのは大丈夫です。 –

+0

もしそれがグローバルに宣言されていれば、finalにする必要があります。私はいつも価値を変えるので、最終的にはできません。 –

答えて

1

あなたはHunger.javaを言うと、それに静的変数public static int rを追加するパブリッククラスを作成することができます。あなたはSharedPreferencesHunger.rの値を保存することができますonDestroy()でアプリを終了する前に

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

:次にタイムスタンプでインクリメントするため、あなたの活動

のonCreate()にタイムスタンプでRをデクリメントするハンドラまたはルーパーを使います。

onDestroy()

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

アプリを再起動する必要がSharedPreferencesからrの最後の値を読み込むことができます。アプリがオフラインであっても減量し続けたい場合は、AsyncTaskで行うか、Serviceと宣言してください。

あなたはonCreate()でSharedPreferencesからrの値を取得し、静的変数Hunger.r のonCreate()の値を設定することができます[静的変数を初期化するとき、アプリの再起動]

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

あなたtextView.onClickListernerができましたあなたの飢餓変数が更新されるたびにSharedPreferencesに繰り返し書いています。この方法でデータを書き込むと、パフォーマンスが不必要に影響を受けます。

希望すると便利です。

+0

そしてHunger.javaをtextView.setOnClickListenerに追加したい場合、メソッドはどのようにメイトのように見えますか? –

+0

更新された質問に対する回答 – sziraqui

1

解決策が見つかりました。 setter getterメソッドは私の変数rを至る所に渡すことができました。今ボタンクリック(textView)の私のコードは+1を与え、アプリケーションがオフラインならば10秒ごとにr変数の整数に-10を与えます。

解決策を見つけました。 getter setterメソッドは私の変数を宣言するのに役立ち、すべての関数内で変数を制御することができます。解決策は、コードが醜いように見える。

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

    } 
} 
関連する問題