【问题标题】:Storing an int value using Shared preferences使用共享首选项存储 int 值
【发布时间】:2013-09-16 10:17:13
【问题描述】:

我有一个 int "flag" 变量,它有两个可能的 int 值,0 和 1。

这里应用的主题是:询问用户是或否?

如果用户选择“是”,则分配 int=1。 else if Selects No, 赋值 int=0;

我正在使用:

public static int flag;


    @Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.flag0:
        flag=0;
        System.err.println("Flag : " + flag);
        break;
    case R.id.flag1:
        flag=1;
        System.err.println("Flag : " + flag);
        break;
    default:
        break;
    }
}

我的问题在这里:没关系,将首选项保存到我的应用程序正在前台或后台运行。

一旦我们关闭/杀死应用程序,所有存储的首选项都会被清除,即设置为默认值零。

当我刚开始研究 STORAGE Options 时,我只是尝试实现 SHARED PREFERENCES,但仍然存在上述相同的问题。我使用共享首选项存储 int 值的方法是;

编辑:我刚刚尝试了以下答案,但徒劳无功,这是我发布的总代码,将有助于您测试(也许)

xml 文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/text"
    android:textSize="30sp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<Button android:id="@+id/flag0"
    android:layout_marginTop="10dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/text"
    android:text="set to 0"/>

<Button android:id="@+id/flag1"
    android:layout_marginTop="10dp"
    android:layout_below="@+id/text"
    android:layout_toRightOf="@+id/flag0"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="set to 1"/>

<Button android:id="@+id/test0"
    android:layout_marginTop="10dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/flag1"
    android:text="Test for 0"/>

主活动:

public class MainActivity extends Activity implements OnClickListener {
TextView textView;
Button bt1,bt2,testbt1;
public static int flag;
SharedPreferences pref;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.text);
    bt1 = (Button) findViewById(R.id.flag0);
    bt2 = (Button) findViewById(R.id.flag1);
    testbt1 = (Button) findViewById(R.id.test0);

    bt1.setOnClickListener(this);
    bt2.setOnClickListener(this);
    testbt1.setOnClickListener(this);


    pref=getSharedPreferences("Sai", MODE_PRIVATE);
    pref.getInt("lang_us", 0);
    System.err.println("Flag Value in Main method : " + flag);
}
public void saveFlag(){

    pref=getSharedPreferences("Sai",MODE_PRIVATE);
    Editor editor = pref.edit();
    editor.putInt("lang_us", flag);
    editor.commit();

}
@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.flag0:
        flag=0;
        saveFlag();
        System.err.println("Flag : " + flag);
        break;
    case R.id.flag1:
        flag=1;
        saveFlag();
        System.err.println("Flag : " + flag);
        break;
    case R.id.test0:
        System.err.println("Flag : " + flag);
        if (flag == 0) {
            textView.setText("flag is zero");
        } else {
            textView.setText("flag is not zero");
        }

        break;

    default:
        break;
    }
}

}

哪里出错了?

【问题讨论】:

    标签: android int local-storage sharedpreferences


    【解决方案1】:

    为什么不使用布尔值 SharedPreferences 我认为这对你来说是最好的。

    这是一个例子

    SharedPreferences prefs = PreferenceManager
                        .getDefaultSharedPreferences(this);
                if (!prefs.getBoolean("firstTime", false)) {
    
                    SharedPreferences.Editor editor = prefs.edit();
                    editor.putBoolean("firstTime", true);
                    editor.commit();
                }
    

    【讨论】:

      【解决方案2】:

      你的做法不对

      1.> 使用 Mode_PRIVATE(当您希望您的共享首选项文件只能由您的应用访问时使用)而不是 MODE_WORLD_WRITABLE(当您希望您的共享首选项文件只能在您的应用程序外部访问时使用)

      2.> 制作一个保存flag状态的方法

      public void saveFlag(){
      
          pref=getSharedPreferences("Sai",Context.MODE_PRIVATE);
          Editor editor = pref.edit();
          editor.putInt("lang_us", flag);
          editor.commit();
      
      }
      

      3.> 更改标志时调用此方法

           @Override
           public void onClick(View v) {
      // TODO Auto-generated method stub
      switch (v.getId()) {
      case R.id.flag0:
          flag=0;
          saveFlag();
          System.err.println("Flag : " + flag);
          break;
      case R.id.flag1:
          flag=1;
          saveFlag();
          System.err.println("Flag : " + flag);
          break;
      default:
          break;
      }
      

      4.> 然后在你的 onCreate() 方法中你应该检索这个值。

      pref=getSharedPreferences("Sai",Context.MODE_PRIVATE);
      flag  = prefs.getInt("lang_us", 0); 
      

      【讨论】:

      • 好吧,我在我的应用程序中使用了类似的代码,并且运行良好。您确定在关闭应用程序之前没有按下标志 0 的按钮吗?还有一件事,如果您卸载您的应用程序,那么您的 sharedPreference 将被清除
      • 好吧,当您从共享首选项获取标志时,您没有将其分配给标志,因此采用了静态 int 0 的默认值,这是一个愚蠢的错误。这样做 flag = pref.getInt("lang_us", 0);
      【解决方案3】:

      将此代码放入您的 onClick 方法中:

      pref=getSharedPreferences("Sai",Context.MODE_PRIVATE);
      Editor editor = pref.edit();
      editor.putInt("lang_us", flag);
      editor.commit();
      

      然后在你的onCreate() 方法中你应该检索这个值。

        pref=getSharedPreferences("Sai",Context.MODE_PRIVATE);
        flag  =prefs.getInt("lang_us", 0); 
      

      flag 现在应该具有您保存的值。

      【讨论】:

      • 感谢您的帮助。
      【解决方案4】:

      试试这个:

          SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
          SharedPreferences.Editor sharedEditor = preferences.edit();
      
         sharedEditor.putInt("lang_us", flag);
         sharedEditor.commit();
      

      它对我有用。

      别忘了用sharedEditor.getInt(..);检索值

      【讨论】:

      • 会检查这个。谢谢
      猜你喜欢
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 2012-11-14
      • 2015-04-10
      • 2011-09-03
      • 1970-01-01
      相关资源
      最近更新 更多