亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SharedPreferences 的問題 - 如何使用?

SharedPreferences 的問題 - 如何使用?

慕沐林林 2023-06-21 16:13:24
我正在制作一個帶有計數器的應用程序,當我點擊 ImageView 時計數器會上升。這行得通,但現在我想將計數器保存到 SharedPreferences 對象。我試圖在 onCreate 方法中初始化 SP 對象,這顯然不起作用。當我嘗試在全局范圍內使用 sp.getInt(...) 時,它也不起作用。我明白為什么會出現問題(嘗試在 sp 對象初始化之前從它獲取 Integer),但我不知道如何解決它。public class MainActivity extends AppCompatActivity {    int counterint;    TextView counter;    String stringnumber;    SharedPreferences sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE);    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sharedPreferences.getInt("hugcounter", 0);    }    public void hughim(View view){        counter = findViewById(R.id.countertv);        stringnumber = counter.getText().toString();        counterint = Integer.parseInt(stringnumber);        counterint++;        counter.setText(Integer.toString(counterint));        sharedPreferences.edit().putInt("hugcounter", counterint);    }}java.lang.RuntimeException:無法實例化活動 ComponentInfo {com.example.hugelon/com.example.hugelon.MainActivity}:java.lang.NullPointerException:嘗試調用虛擬方法'android.content.SharedPreferences android.content.Context。空對象引用上的 getSharedPreferences(java.lang.String, int)'Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 對空對象引用
查看完整描述

4 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

getSharedPreferences()您在實際創建之前調用Activity。您需要初始化SharedPreferencesin onCreate():


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE); // Here, this is initialized AFTER super.onCreate

    ...

}

Activity延伸自Context且 是Context所需要的SharedPreferences。我建議您在這里閱讀有關 Android 活動生命周期的信息:


https://developer.android.com/guide/components/activities/activity-lifecycle


為了證明該值確實被保存,您可以嘗試使用以下代碼來測試保存的值:


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE); // Here, this is initialized AFTER super.onCreate


    int storedValue = sharedPreferences.getInt("hugcounter", 0);

    Toast.makeText(this, "Saved value: " + storedValue, Toast.LENGTH_LONG).show();

}

并且,不要忘記通過調用來存儲值apply():


SharedPreferences.Editor editor = sharedPreferences.edit();

editor.putInt("hugcounter", counterint);

editor.apply();


查看完整回答
反對 回復 2023-06-21
?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

你只是沒有在 oncreate 設置初始值


      public class MainActivity extends AppCompatActivity {


            int counterint;

            TextView counter;

            String stringnumber;

            SharedPreferences sharedPreferences;


            @Override

            protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_main);

    counter = findViewById(R.id.countertv);

        sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE);


                stringnumber=String.valueOf(sharedPreferences.getInt("hugcounter", 0));

counter.setText(stringnumber);

            }



            public void hughim(View view){


                counter = findViewById(R.id.countertv);


                stringnumber = counter.getText().toString();

                counterint = Integer.parseInt(stringnumber);

                counterint++;

                counter.setText(Integer.toString(counterint));


                sharedPreferences.edit().putInt("hugcounter", counterint);


            }


        }


查看完整回答
反對 回復 2023-06-21
?
DIEA

TA貢獻1820條經驗 獲得超2個贊

SharedPreferences 在初始化之前需要一個活動引用,這就是thisin 的目的:


SharedPreferences sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE);

您的代碼的問題是this在您初始化 SharedPreferences 對象時它為空。這樣做的原因是它this在onCreate(). 因此,一個快速的解決方案是將 SharedPreferences 對象的初始化移動到 onCreate 中。這是您的課程之后的樣子的片段:


public class MainActivity extends AppCompatActivity {


int counterint;

TextView counter;

String stringnumber;

SharedPreferences sharedPreferences;


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);


    sharedPreferences = this.getSharedPreferences("com.example.hugelon", Context.MODE_PRIVATE);

    sharedPreferences.getInt("hugcounter", 0);

  }


}

附錄:

將 的值sharedPreferences.getInt("hugcounter", 0)放入變量中,如下所示:


int myValue = sharedPreferences.getInt("hugcounter", 0);

我希望這有幫助。編碼愉快!


查看完整回答
反對 回復 2023-06-21
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

  1. 在 onCreate 方法中初始化 SharedPreference

  2. 您嘗試將 Int 放入 SharedPreference 但沒有保存它,因為您需要調用

    sharedPreferences.edit().putInt("hugcounter",?counterint).apply()

    或者

    sharedPreferences.edit().putInt("hugcounter",?counterint).commit()

為了這個目的。因此使用commit()apply()保存在本地存儲中。

查看完整回答
反對 回復 2023-06-21
  • 4 回答
  • 0 關注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號