共享首选项不保存价值

时间:2014-07-07 12:33:22

标签: android android-activity preferences shared lifecycle

我正在学习在Android中构建一些应用程序。出于好奇,我使用共享首选项有一个小而奇怪的问题。如果有人可以帮我解决这个问题,我会非常感谢他们。无论如何,这里出了问题。我有2个活动。 1.活动1:只包含一个按钮,可以帮助您进行下一个活动。 2.活动2:包含复选框的列表视图(simple_list_item_checked或simple_list_multi_choice_item)。

我的问题是:我打开我的应用程序,点击我第一个活动屏幕上的按钮,这将我带到第二个活动。我检查列表视图中的项目。我点击手机上的后退按钮,转到第一个活动,再次按下我的活动1屏幕上的按钮,这会再次将我带到列表中。现在我只保留我的列表项(我不会更改之前已经检查过的任何内容)。再一次,我按下手机上的按钮,回到活动一。现在再次按下我的活动按钮上的一个屏幕。它带我回到列表视图但是没有任何东西被检查。为了说明这一点,我还设置并检索了我的共享偏好。

我在单行中的问题是:如果我在该活动中没有更改检查清单中的值,然后返回主活动,并返回相同的检查列表活动,我的共享首选项不会加载之前保存的内容。这是共享首选项的正常行为还是编码中的问题。

我想知道保存和检索偏好值的方式以及首选项保存值的时间长短?我的意思是优先保存的值的生命周期。

我的第二个问题:另外,我想在活动生命周期中再了解一件事。当我进入第二个活动时,如上例所述。现在我按下主页按钮,现在我转到后台任务并清除正在运行的所有任务(应用程序)。现在,我的问题是在我从后台清除所有应用程序之前,遵循哪个活动生命周期状态或最终活动生命周期是什么?请有人帮我解决这个问题。感谢所有那些有创意的开发人员。希望有人能解决我的问题。

public class Secondact extends ListActivity {
    ListView list;
    SharedPreferences pref;
     int pos,itemposition,positionvalue;
     boolean boolval,checkvalue;
     SharedPreferences.Editor editor;
     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
          // setContentView(R.layout.secondact);
            Toast.makeText(getApplicationContext(), "ONCREATE", 50).show();

            list=getListView();

           String[] family_array=this.getResources().getStringArray(R.array.family);
           ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,family_array);
           list.setAdapter(adapter);
           list.setChoiceMode(1);
           pref=PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
         pos=pref.getInt("itempos", pos);
             boolval=pref.getBoolean("boolvalue", true);
            list.setItemChecked(pos, boolval);
            Toast.makeText(getApplicationContext(), "DATA LOADED ITEM NO:"+pos, 50).show();

           list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub


                pos=position;
                list.setItemChecked(pos, true);
                pref=PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                editor=pref.edit();
                editor.putInt("itempos", pos);
                editor.putBoolean("boolvalue", list.isItemChecked(pos));
                editor.commit();
            }
        });

}

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        pref=PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
     editor=pref.edit();
        editor.putInt("itempos", pos);
        editor.putBoolean("boolvalue", list.isItemChecked(pos));
        editor.commit();
    //  Toast.makeText(getApplicationContext(), "PAUSE", 50).show();

    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        pref=PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
         pos=pref.getInt("itempos", pos);
         boolval=pref.getBoolean("boolvalue", true);
        list.setItemChecked(pos, boolval);
        //Toast.makeText(getApplicationContext(), "RESUME", 50).show();

    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        pref=PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
         editor=pref.edit();
        editor.putInt("itempos", pos);
        editor.putBoolean("boolvalue", list.isItemChecked(pos));
        editor.commit();
        Toast.makeText(getApplicationContext(), "DESTROY", 50).show();
        Toast.makeText(getApplicationContext(), "DATA SAVED ITEM NO:"+pos, 50).show();

    }

    @Override
    protected void onRestart() {
        // TODO Auto-generated method stub
        super.onRestart();
        pref=PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
     pos=pref.getInt("itempos", pos);
         boolval=pref.getBoolean("boolvalue", true);
        list.setItemChecked(pos, boolval);
        //Toast.makeText(getApplicationContext(), "RESTART", 50).show();

    }

    @Override
    protected void onSaveInstanceState(Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        savedInstanceState.putInt("itempositionno", positionvalue);
        savedInstanceState.putBoolean("checkvalue", true);
        Toast.makeText(getApplicationContext(), "ONSAVEINSTANCE", 50).show();
        list.setItemChecked(pos, checkvalue);
        super.onSaveInstanceState(savedInstanceState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        pos=savedInstanceState.getInt("itempositionno", pos);
         checkvalue=savedInstanceState.getBoolean("checkvalue", true);
        list.setItemChecked(pos, checkvalue);
        Toast.makeText(getApplicationContext(), "ONRESTOREINSTANCE", 50).show();
        super.onRestoreInstanceState(savedInstanceState);
    }




}

2 个答案:

答案 0 :(得分:4)

  

我想知道如何保存偏好值   检索并优先保存值多长时间?我的意思是   优先保存值的生命周期。

单行回复您的单行问题 -

  • 除非您自己清除,否则它会在应用程序的整个生命周期中保存。

获取共享首选项:

SharedPreferences prefs = this.getSharedPreferences(
      "com.example.app", Context.MODE_PRIVATE);

阅读首选项:

String dateTimeKey = "com.example.app.datetime";

// use a default value using new Date()
long l = prefs.getLong(dateTimeKey, new Date().getTime()); 

编辑和保存首选项

为了编辑(清除) -

SharedPreferences.Editor editor = prefs.edit();
    editor.clear();
    editor.commit();

为了保存 -

Date dt = getSomeDate();
prefs.edit().putLong(dateTimeKey, dt.getTime()).commit();

阅读 - how-to-use-sharedpreferences-in-android-to-store-fetch-and-edit-values

  

遵循哪种活动生命周期或将是什么   在我清除所有应用程序之前的最终活动生命周期   背景?

取决于您的要求。无需遵循最终活动生命周期来执行此操作。例如 - 当用户从应用程序注销时,与用户相关的首选项没有用,并且可以在注销按钮按下后独立于生命周期进行清除。

答案 1 :(得分:1)

好吧,对于那些遭受共同偏好相同问题而没有保持活动开关价值的人。这条逻辑可以解决问题:

在列表视图中设置行的默认值,如下所示

sp.getInt("CheckedValue",

将ealier检查行的位置作为默认行

    viz.Listitem.getCheckedItemPosition());

这将在整个应用程序的生命周期和/或活动生命周期中保存选中的值。

注意

请务必在commit()之前清除共享偏好设置,以避免应用程序占用大量内存。