【问题标题】:Problem to remove a backup - ANDROID STUDIO删除备份的问题 - ANDROID STUDIO
【发布时间】:2026-01-08 11:25:03
【问题描述】:

Intent intent1 = new Intent(Questions.this, Questions.class); startActivity(intent1);

我学习中的小问题。 对不起我的法语^^

一个变量每次都会改变,我按下一个按钮,它会备份并分配它++。

在按钮输入中,如果变量 == 在表 REPONSE.Length 中,它会重新启动活动并删除备份。

我的问题是,当活动重新启动良好时,备份不会自行删除。

每次我支持活动时,它都会再次引发,但无法在第 0 阶段重新开始。

    int REPONSE[]= new int[5]; //tableau des reponses
    int Question = 0;
     
     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.questions);
     
     
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
            Question = sharedPreferences.getInt("num", 0);
     
     
     cardView1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
     
       //Restart si Question == REPONSE.length
     if (Question == REPONSE.length){
                        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedPreferences.edit();
                        editor.remove("num");
                        editor.apply();
                        
                        Intent intent1 = new Intent(Questions.this, Questions.class);
                        startActivity(intent1);
     
                    }
     
                 //Sauvegarde de la variable
                    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putInt("num", Question++);
                    editor.apply();
     
                  //Incrementation +1
                    Question++;
       }
            }); }

提前致谢:)

【问题讨论】:

    标签: java android mobile


    【解决方案1】:

    根据documentation remove() 会在调用 commit() 后删除一个值。所以你必须将 editor.apply() 更改为 editor.commit()

    //Restart si Question == REPONSE.length
         if (Question == REPONSE.length){
                            SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
                            SharedPreferences.Editor editor = sharedPreferences.edit();
                            editor.remove("num");
                            editor.commit();  //editor.apply() won't work
    

    【讨论】:

      【解决方案2】:

      我会向你推荐 3 点:

      第 1 点:

      尝试为您的共享偏好设置一个名称。示例:

      sharedPreferences = getSharedPreferences("sharedPrefName", MODE_PRIVATE);

      如果您没有为共享偏好命名,android 可能会陷入歧义并创建一个新的 Sharedpreference 从而不会影响旧的。

      即使你在 onClick 方法中创建了一个新的 SharedPreference(这个过程是错误的),Android 系统也无法理解要使用哪个 SharedPreference,因此不会影响你想要更改的 sharedpreference 数据。

      第 2 点:

      这不如第一个重要,但要更改现有首选项的数据,您无需删除首选项,只需更改值,它将根据您的要求进行更新:

      sharedPreferences.edit().putInt("num", Question++).apply();

      第 3 点:

      • 在类中创建一次 SharedPreference 对象,它可以 具有全局范围。

      • 在一个activity里面只初始化一次SharedPreference onCreate 方法。

      使您的代码如下所示:

      public class MainActivity extends AppCompatActivity {
              SharedPreferences sharedPreferences;
              ConstraintLayout layout;
              int Question = 0;
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.layout_main);
                  layout = findViewById(R.id.layout);
      
                  sharedPreferences = getSharedPreferences("sharedPrefName", MODE_PRIVATE);
                  Question = sharedPreferences.getInt("num",0);
                  layout.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          sharedPreferences.edit().putInt("num", Question++).apply();
                      }
                  });
      
              }
      }
      

      【讨论】:

      • @AudricPazza 首先在您的项目中尝试代码,然后接受并投票帮助您解决问题的答案。在 * 中,这是表示感谢的最佳方式。