【问题标题】:How to use shared preferences in Android?如何在 Android 中使用共享首选项?
【发布时间】:2013-11-28 09:50:10
【问题描述】:

我正在 Android 中使用 SQLite 实现切换按钮。我想将切换按钮值保存在共享首选项中,并且共享首选项值存储在 SQLite 中。当我运行应用程序时,我得到了切换按钮的空指针异常。

我不知道如何将布尔值存储在共享首选项中。这是我的代码和日志猫。

这是我的切换按钮代码

toggleButton_Addto_Contacts = (ToggleButton) findViewById(R.id.toggleButton_Add_To_Contacts);

toggleButton_Addto_Contacts.setOnCheckedChangeListener(new OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // TODO Auto-generated method stub


        if(isChecked)
        {
            System.out.println("Toggle Button Is On");

            SharedPreferences.Editor editor = preferences.edit();
            editor.putBoolean("YES",  true); // value to store
            strBooleanValue=sharedPref.getBoolean("YES",true);
            strToggleVlaue=String.valueOf(strBooleanValue);
            System.out.println("Toggle Button Value Is =" + strToggleVlaue);
            editor.commit();

        }
        else
        {

                System.out.println("Toggle Button Is Off");
                SharedPreferences.Editor editor = preferences.edit();
                editor.putBoolean("NO",  false); // value to store
                strBooleanValue=sharedPref.getBoolean("NO", false);
                strToggleVlaue=String.valueOf(strBooleanValue);
                System.out.println("Toggle Button Value Is =" + strToggleVlaue);
                editor.commit();

        }
    }
});



11-28 15:13:26.054: E/AndroidRuntime(707): FATAL EXCEPTION: main
11-28 15:13:26.054: E/AndroidRuntime(707): java.lang.NullPointerException
11-28 15:13:26.054: E/AndroidRuntime(707):  at com.lead_management_project.New_Lead_Activity5$5.onCheckedChanged(New_Lead_Activity5.java:172)
11-28 15:13:26.054: E/AndroidRuntime(707):  at android.widget.CompoundButton.setChecked(CompoundButton.java:124)
11-28 15:13:26.054: E/AndroidRuntime(707):  at android.widget.ToggleButton.setChecked(ToggleButton.java:69)
11-28 15:13:26.054: E/AndroidRuntime(707):  at android.widget.CompoundButton.toggle(CompoundButton.java:86)
11-28 15:13:26.054: E/AndroidRuntime(707):  at android.widget.CompoundButton.performClick(CompoundButton.java:98)
11-28 15:13:26.054: E/AndroidRuntime(707):  at android.view.View$PerformClick.run(View.java:9080)
11-28 15:13:26.054: E/AndroidRuntime(707):  at android.os.Handler.handleCallback(Handler.java:587)
11-28 15:13:26.054: E/AndroidRuntime(707):  at android.os.Handler.dispatchMessage(Handler.java:92)
11-28 15:13:26.054: E/AndroidRuntime(707):  at android.os.Looper.loop(Looper.java:123)
11-28 15:13:26.054: E/AndroidRuntime(707):  at android.app.ActivityThread.main(ActivityThread.java:3683)
11-28 15:13:26.054: E/AndroidRuntime(707):  at java.lang.reflect.Method.invokeNative(Native Method)
11-28 15:13:26.054: E/AndroidRuntime(707):  at java.lang.reflect.Method.invoke(Method.java:507)
11-28 15:13:26.054: E/AndroidRuntime(707):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-28 15:13:26.054: E/AndroidRuntime(707):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-28 15:13:26.054: E/AndroidRuntime(707):  at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 文件New_Lead_Activity5.java第172行的内容
  • 在第 172 行 = strBooleanValue=sharedPref.getBoolean("YES",true);在文件 New_Lead_Activity5.java 中。
  • 你有没有初始化你的sharedPref
  • 是的,我已经在 onCreate() 方法中初始化了首选项,就像这个首选项 = getPreferences(MODE_PRIVATE);
  • 是的,你初始化了你的preferences,但是你在 172 写的是strBooleanValue=sharedPref.getBoolean("YES",true);。在这里你访问了sharedPref,所以只有我要求sharedPref

标签: java android


【解决方案1】:

尝试如下改变,

    if(isChecked)
            {
                System.out.println("Toggle Button Is On");

                SharedPreferences.Editor editor = preferences.edit();
                editor.putBoolean("YES",  true); // value to store
                editor.commit();
                strBooleanValue=preferences.getBoolean("YES",true);
                strToggleVlaue=String.valueOf(strBooleanValue);
                System.out.println("Toggle Button Value Is =" + strToggleVlaue);


            }
 else
        {

                System.out.println("Toggle Button Is Off");
                SharedPreferences.Editor editor = preferences.edit();
                editor.putBoolean("NO",  false); // value to store
                editor.commit();
                strBooleanValue=preferences.getBoolean("NO", false);
                strToggleVlaue=String.valueOf(strBooleanValue);
                System.out.println("Toggle Button Value Is =" + strToggleVlaue);


        }

【讨论】:

    【解决方案2】:

    请看下面的答案

       creating sharedpreferences
        SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
        Editor editor = pref.edit();
    
        Storevalues
        editor.putBoolean("key_name", true); // Storing boolean - true/false
        editor.putString("key_name", "string value"); // Storing string
        editor.putInt("key_name", "int value"); // Storing integer
        editor.putFloat("key_name", "float value"); // Storing float
        editor.putLong("key_name", "long value"); // Storing long
    
       editor.commit(); // commit changes
    
      retrive from shared preference
    
        SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
       pref.getString("key_name", null); // getting String
       pref.getInt("key_name", null); // getting Integer
       pref.getFloat("key_name", null); // getting Float
       pref.getLong("key_name", null); // getting Long
      pref.getBoolean("key_name", null); // getting boolean
    

    【讨论】:

      【解决方案3】:

      您没有在代码中的任何地方初始化 preferencessharedPref,这就是您得到 NullPointerException

      您的以下代码也有一些不正确的地方:-

      editor.putBoolean("YES",  true); // value to store
      strBooleanValue=sharedPref.getBoolean("YES",true);
      

      您必须先调用commit(),然后尝试访问您在首选项中输入的值。

      【讨论】:

      • 我已经在 onCreate() 方法中初始化了首选项,就像这个首选项 = getPreferences(MODE_PRIVATE);
      【解决方案4】:

      setContentView 之后只需调用 loadSavedPreferences()

          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.setting);
               loadSavedPreferences();
                //remaining code
       }
      

      并在 onCheckedChanged 中调用 savePreferences(Boolean toggle)

         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          // TODO Auto-generated method stub
            savePreferences(Boolean toggle);
        if(isChecked)
          {
              System.out.println("Toggle Button Is On");
              System.out.println("Toggle Button Value Is =" + strToggleVlaue);
      
      
          }
          else
          {
      
                  System.out.println("Toggle Button Is Off");
                  System.out.println("Toggle Button Value Is =" + strToggleVlaue);
      
      
          }
      }
       });
      
      
      private void loadSavedPreferences() {
                  SharedPreferences sharedPreferences =PreferenceManager.getDefaultSharedPreferences(this);
                  strToggleVlaue==getBoolean("Checked_State",true);
              }
      
        private void savePreferences(Boolean toggle) {
      
                  SharedPreferences sharedPreferences  PreferenceManager.getDefaultSharedPreferences(this);
                  Editor editor = sharedPreferences.edit();
                  editor.putBoolean("Checked_State",toggle);
                   editor.commit();
      
              }
      

      注意:为共享首选项编写一个单独的方法来加载和保存,以便将来在您想要保存任何其他值时可以轻松地修改这些函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        • 2012-09-20
        • 2015-07-20
        • 2012-03-20
        相关资源
        最近更新 更多