需要在setOnClickListener方法中加入变量

时间:2017-09-23 15:45:51

标签: java android

我希望变量r是全局的,我希望SharedPreferences能够在全局级别加载变量r(String s)。

我制作的东西就像人工机器人HUNGER变量。我点击按钮,它增加了+1饥饿,但每一秒我想给它-1时间戳的饥饿。此外,时间戳还可用作指示设备离线多长时间,并按比例提供-xx。

截至目前,我只能在onClickListener中添加+1到R的局部变量,如果(时间已经过时)我不能给它{r = r-1},因为r是localy声明的。我不知道如何解决它。

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

    }
}

2 个答案:

答案 0 :(得分:1)

您可以创建公共类说Hunger.java并向其添加静态变量public static int r。然后使用Handler或Looper在您的Activity

中按时间戳递减r

onCreate(),按时间戳递增:

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

在退出onDestroy()中的应用之前,您可以将Hunger.r的值保存在SharedPreferences中。

<强>的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。以这种方式写入数据会不必要地影响性能。

希望这有帮助!

答案 1 :(得分:1)

我找到了解决方案。 setter getter方法帮助我使变量r可以随处访问。现在我的按钮单击(textView)上的代码给出+1,如果应用程序处于离线状态,则每10秒给出一个r变量整数。

我找到了解决方案。 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();
                }
            });

    }
}