我正在学习在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);
}
}
答案 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()
之前清除共享偏好设置,以避免应用程序占用大量内存。