【问题标题】:Saving data in application在应用程序中保存数据
【发布时间】:2015-03-06 15:10:35
【问题描述】:

我已经申请了。这是一个按钮,显示您按下它的时间。每次我“杀死”应用程序时,计时器都会再次从 0 开始(自然)。我怎样才能让应用程序保存按下按钮的时间,所以当应用程序被杀死,然后你打开它时,计时器就是你停止的时间。我有一些关于这是如何完成的,我认为它与 SharedPreferences 有关。

我的代码:

public class MainActivity extends ActionBarActivity {

    Button button1;
    Chronometer chromo;
    protected long time;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1=(Button)findViewById(R.id.button1);
        chromo=(Chronometer)findViewById(R.id.chromo);

        button1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    chromo.setBase(SystemClock.elapsedRealtime()+time);
                    chromo.start();
                }
                else if( event.getAction() == MotionEvent.ACTION_UP){
                    time =chromo.getBase()-SystemClock.elapsedRealtime();
                    chromo.stop();
                }
                return true;
            }
    });
}}

【问题讨论】:

  • 不多,因为我不太明白这是如何工作的,这就是为什么我不得不问:) 你能帮我吗?

标签: java android time save sharedpreferences


【解决方案1】:

保存在 SharedPreferences 中:

SharedPreferences prefs= getSharedPreferences("prefs", Context.MODE_PRIVATE);
// We use an editor to insert values in SharedPreferences
Editor editor = prefs.edit(); 
// Saving the values
editor.putLong("myTime", time); 
// Committing the changes
editor.commit(); 

检索保存的值:

long savedValue = 0l;
SharedPreferences prefs= getSharedPreferences("prefs", Context.MODE_PRIVATE);

if (prefs.contains("hello")){
    savedValue = sharedpreferences.getLong("myTime", 0l));
}

【讨论】:

  • 我对编码很陌生,所以我不知道如何使用您刚刚给我的这些代码,以及使用哪些代码。你能帮我描述一下我是如何用我的特殊代码做到这一点的吗?
  • 如果我理解正确,您想在活动关闭时保存时间并在再次打开时检索它?在这种情况下,您可以覆盖 Activity 中的 onDestroy 方法,将时间保存在该方法中的 SharedPreferences 中,并在 onCreate 中,在获得对计时器的引用后,根据您从 SharedPreferences 中检索的值设置时间。这更清楚吗?如果没有,请详细说明您遇到的问题,以便我可以帮助您解决此问题;)
  • 是的,这正是我想要的!但我仍然不了解它是如何工作的。你能把它编码给我吗,或者只是给我一个例子。你有我的代码并且确切地知道我需要什么帮助:)
  • 我不会为你编码,因为我通常会为此收费 :) 更严肃的一点是,我为你编码对你没有多大帮助,这就是“给男人一个钓鱼或教他如何钓鱼”的故事。但是我会引导您查看有关管理活动生命周期的官方教程,并使用我为您提供的共享首选项代码,您应该到达那里:developer.android.com/training/basics/activity-lifecycle/… 我强烈建议您在官方页面上完成有关常见主题的基本培训。永远不要害怕尝试样品并与它们一起玩;)
  • 我会试试的!感谢您的帮助。
【解决方案2】:

在 Preference 中设置值:

SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
 editor.putString("name", "slama");
 editor.putInt("idName", 28);
 editor.commit();

从偏好中检索数据:

// MY_PREFS_NAME - a static String variable like: 
//public static final String MY_PREFS_NAME = "MyPrefsFile";
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String restoredText = prefs.getString("text", null);
if (restoredText != null) {
  String name = prefs.getString("name", "No name defined");//"No name defined" is the default value. String name = prefs.getString("name", "");
  int idName = prefs.getInt("idName", 0); //0 is the default value.
}

这是一个 Android 共享首选项教程:http://www.tutorialspoint.com/android/android_shared_preferences.htm

它可以帮助您解决问题

【讨论】:

  • 请避免仅链接的答案。有关详细信息,请参阅帮助部分。
  • 2Dee & Micael Berkowski:没关系
【解决方案3】:

编辑:

public class MainActivity extends ActionBarActivity {

    Button button1;
    Chronometer chromo;
    protected long time = 0;
    private SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1=(Button)findViewById(R.id.button1);
        chromo=(Chronometer)findViewById(R.id.chromo);
        prefs = getSharedPreferences("prefs", Context.MODE_PRIVATE);
        long savedValue = prefs.getLong("my_chrono", 0);

        if(savedValue == 0)
            chromo.setBase(SystemClock.elapsedRealtime());
        else
            chromo.setBase(SystemClock.elapsedRealtime() + savedValue);

        button1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    chromo.start();
                }
                else if( event.getAction() == MotionEvent.ACTION_UP){
                    time =chromo.getBase()-SystemClock.elapsedRealtime();
                    chromo.stop();
                    prefs.edit().putLong("my_chrono", time).apply();
                }
                return true;
            }
    });
}}

================================================ ==============================

要使用共享首选项,请在您的 onCreate 中初始化它

SharedPreferences prefs = getSharedPreferences("the_package_of_your_app", Context.MODE_PRIVATE);

然后,尝试获取保存的值

int my_saved_value = prefs.getInt("the_package_of_your_app.my_int_1", 0);
if(my_saved_value != 0)
    //your value of your timer was saved, do what's needed with it
else
    //there was no value saved, or the timer was at 0

现在您必须在需要时保存该值(当计时器停止或应用程序关闭时)

prefs.edit().putInt("the_package_of_your_app.my_int_1", my_value).apply();

【讨论】:

  • 感谢您的回答。我在问题中解释了我想做什么。你能帮我写代码吗? (或者只是告诉我帮助我)。我想我需要这样:“保存一个值(比如说一个 int)”。我对编码很陌生。
  • 我已经更新了上面的代码,因为我认为你必须在 onStop 方法中保存你的值,并遵循你的 chromo.stop()
  • 太棒了。 1 个问题:my_value、my_saved_value 和 my_int_1 是什么? :)
  • my_saved_value 是您将从sharedPreferences 返回的值,您保存的my_value 是您传递给要保存的sharedPreferences 的值(在您的情况下应该是您的chrono 的值)my_int_1 只是一个用于在 sharedPreferences 中标识您的值的字符串,如果您愿意,它是 id
  • 这样对吗?? gyazo.com/5daa9bf7e363b7e03f7be41713af3c0b 为什么我在 putInt 上出现错误?非常感谢您的回答!
【解决方案4】:

详细说明@2Dee 的回答:

SharedPreferences prefs= getSharedPreferences("prefs", Context.MODE_PRIVATE);
// We use an editor to insert values in SharedPreferences
Editor editor = prefs.edit(); 
// Saving the values
editor.putLong("myTime", time); 
// Committing the changes
editor.commit(); 

可以进去

protected void onDestroy();

方法。此方法可以在 Activity 中重载,以便在 Activity 被销毁(杀死、关闭等)时调用,以便保存任何数据(这是您想要做的)。

同样,

SharedPreferences prefs= getSharedPreferences("prefs", Context.MODE_PRIVATE);
time = sharedpreferences.getLong("myTime", 0l);

可以进入

protected void onCreate(Bundle savedInstanceState);

方法。首次创建活动时调用此方法。这会将您的时间设置为保存的值(如果没有,则默认为 0)。

如果由于某种原因需要在不同时间调用它们(例如在 Activity 生命周期的后期或早期),您可以阅读更多相关信息 here

如果您喜欢这个答案,也请点赞 2Dee 的答案。一些代码实际上是从那里复制/粘贴的。

编码愉快!如果您有更多问题,请发表评论。

【讨论】:

  • 感谢您的帮助。但是 Tr4X 编写了一个对我有用的代码(我现在尝试修复一些小问题)。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 2013-05-05
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多