我想存储一个时间值,需要检索和编辑它。我如何使用SharedPreferences来做到这一点?


当前回答

在任何应用程序中,都有可以通过PreferenceManager实例及其相关方法getDefaultSharedPreferences(Context)访问的默认首选项。

使用SharedPreference实例,可以使用getInt(String key, int defVal)检索任意首选项的int值。在这种情况下,我们更倾向于使用计数器。

在我们的例子中,我们可以使用edit()并使用putInt(String key, int newVal)来修改SharedPreference实例。我们增加了应用程序的计数,这些计数超出了应用程序并相应地显示。

为了进一步演示这一点,再次重新启动应用程序,您将注意到每次重新启动应用程序时计数都会增加。

PreferencesDemo.java

代码:

package org.example.preferences;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.widget.TextView;

public class PreferencesDemo extends Activity {
   /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Get the app's shared preferences
        SharedPreferences app_preferences = 
        PreferenceManager.getDefaultSharedPreferences(this);

        // Get the value for the run counter
        int counter = app_preferences.getInt("counter", 0);

        // Update the TextView
        TextView text = (TextView) findViewById(R.id.text);
        text.setText("This app has been started " + counter + " times.");

        // Increment the counter
        SharedPreferences.Editor editor = app_preferences.edit();
        editor.putInt("counter", ++counter);
        editor.commit(); // Very important
    }
}

main。xml

代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" >

        <TextView
            android:id="@+id/text"  
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:text="@string/hello" />
</LinearLayout>

其他回答

人们推荐使用SharedPreferences的方法有很多。我在这里做了一个演示项目。示例中的关键点是使用ApplicationContext &单个sharedpreferences对象。本示例演示了如何使用SharedPreferences与以下特性

使用singelton类访问/更新SharedPreferences 不需要总是为读/写SharedPreferences传递上下文 它使用apply()而不是commit() Apply()是异步保存,不返回任何东西,它首先在内存中更新值,然后将更改写入磁盘 asynchronusly。 Commit()是同步保存,它根据结果返回true/false。更改以同步方式写入磁盘 适用于android 2.3+版本

使用示例如下:-

MyAppPreference.getInstance().setSampleStringKey("some_value");
String value= MyAppPreference.getInstance().getSampleStringKey();

点击这里获取源代码 &详细的API可以在developer.android.com上找到

我想在这里补充一点,当使用SharedPreferences时,这个问题的大多数代码片段都有类似MODE_PRIVATE的东西。MODE_PRIVATE意味着无论您写入这个共享首选项的是什么,都只能由您的应用程序读取。

Whatever key you pass to getSharedPreferences() method, android creates a file with that name and stores the preference data into it. Also remember that getSharedPreferences() is supposed to be used when you intend to have multiple preference files for your application. If you intend to use single preference file and store all key-value pairs into it then use the getSharedPreference() method. Its weird why everyone (including myself) simply uses getSharedPreferences() flavor without even understanding the difference between the above two.

下面的视频教程应该会有所帮助 https://www.youtube.com/watch?v=2PcAQ1NBy98

在共享首选项中存储值:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("Name","Harneet");
editor.apply();

从共享首选项中检索值:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String name = preferences.getString("Name", "");
if(!name.equalsIgnoreCase(""))
{
    name = name + "  Sethi";  /* Edit the value here*/
}

简单的方法:

保存:

getPreferences(MODE_PRIVATE).edit().putString("Name of variable",value).commit();

检索:

your_variable = getPreferences(MODE_PRIVATE).getString("Name of variable",default value);

简单和无麻烦::"Android-SharedPreferences-Helper"库

迟到总比不到好:我创建了“Android-SharedPreferences-Helper”库来帮助降低使用SharedPreferences的复杂性和工作量。它还提供了一些扩展功能。它提供的一些东西如下:

一行初始化和设置 轻松选择是使用默认首选项还是自定义首选项文件 每种数据类型的预定义(默认数据类型)和自定义(您可以选择的)默认值 能力设置不同的默认值为单一使用,只是一个额外的参数 你可以注册和取消注册OnSharedPreferenceChangeListener,因为你做的默认类

dependencies {
    ...
    ...
    compile(group: 'com.viralypatel.sharedpreferenceshelper', name: 'library', version: '1.1.0', ext: 'aar')
}

SharedPreferencesHelper对象的声明:(建议在类中 级)

SharedPreferencesHelper sph; 

SharedPreferencesHelper对象的实例化:(建议在 onCreate()方法)

// use one of the following ways to instantiate
sph = new SharedPreferencesHelper(this); //this will use default shared preferences
sph = new SharedPreferencesHelper(this, "myappprefs"); // this will create a named shared preference file
sph = new SharedPreferencesHelper(this, "myappprefs", 0); // this will allow you to specify a mode

将价值观融入到共同的偏好中

非常简单!不像默认的方式(当使用SharedPreferences类时),你不需要调用.edit()和.commit()。

sph.putBoolean("boolKey", true);
sph.putInt("intKey", 123);
sph.putString("stringKey", "string value");
sph.putLong("longKey", 456876451);
sph.putFloat("floatKey", 1.51f);

// putStringSet is supported only for android versions above HONEYCOMB
Set name = new HashSet();
name.add("Viral");
name.add("Patel");
sph.putStringSet("name", name);

就是这样!您的值存储在共享首选项中。

从共享首选项中获取值

同样,这只是一个使用键名的简单方法调用。

sph.getBoolean("boolKey");
sph.getInt("intKey");
sph.getString("stringKey");
sph.getLong("longKey");
sph.getFloat("floatKey");

// getStringSet is supported only for android versions above HONEYCOMB
sph.getStringSet("name");

它还有很多其他扩展功能

在GitHub知识库页面上查看扩展功能的详细信息,使用和安装说明等。