检索共享首选项

时间:2012-08-27 11:48:33

标签: java android

我有两个活动A和B.

B:是一项设置活动,用于保存共享偏好设置中的所有设置。

答:是主要活动,我检索B活动中保存的共享偏好

问题是如果用户第一次使用该应用程序并启动其强制关闭的A活动。

我认为因为尚未保存共享偏好...

A活动:

public class DawaaActivity extends ListActivity implements View.OnClickListener {

Button add;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SharedPreferences emportPref = getSharedPreferences("dawaaData",MODE_PRIVATE);
if (emportPref.getInt("exists", 0) == 1){
String dawaaList[] = {emportPref.getString("subject", null)};
setListAdapter(new ArrayAdapter<String>(DawaaActivity.this,
android.R.layout.simple_list_item_1,dawaaList));
}
initialaiz();
}

private void initialaiz() {

add = (Button) findViewById(R.id.button3);
add.setOnClickListener(this);
}

public void onClick(View v) {

Intent data = new Intent(DawaaActivity.this,SettingActivity.class);
startActivity(data);
}
}

B活动:

public class SettingActivity extends Activity implements View.OnClickListener {
EditText et;
EditText et1;
Spinner list;
TimePicker startTime;
Button save;
Button cancel;
private SharedPreferences exportPref;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.setting);
initialaiz();
}
private void initialaiz() {

et = (EditText) findViewById(R.id.text);
et1 = (EditText) findViewById(R.id.text1);
list = (Spinner) findViewById(R.id.spinner);
startTime = (TimePicker) findViewById(R.id.timePicker);
save = (Button) findViewById(R.id.save);
cancel = (Button) findViewById(R.id.cancel);
save.setOnClickListener(this);
cancel.setOnClickListener(this);
}
public void onClick(View v) {

switch(v.getId()){
case R.id.save:
save();
Intent transferData = new Intent(SettingActivity.this,DawaaActivity.class);
startActivity(transferData);
break;
case R.id.cancel:
finish();
break;
}
}
private void save() {

exportPref = getSharedPreferences("dawaaData",MODE_PRIVATE);
SharedPreferences.Editor editor = exportPref.edit();
editor.putString("subject", et.getText().toString());
editor.putString("dosesC", et1.getText().toString());
editor.putString("doses", list.getSelectedItem().toString());
editor.putInt("hour", startTime.getCurrentHour());
editor.putInt("minute", startTime.getCurrentMinute());
editor.putInt("exists", 1);
editor.commit();
Toast.makeText(SettingActivity.this,"data has been saved" ,Toast.LENGTH_SHORT).show();
}

}

我怎么能解决问题???

修改

我在布局中添加了ListView

我按照这样编辑类:

public class DawaaActivity extends Activity implements View.OnClickListener {

ListView myList;
SharedPreferences emportPref = getSharedPreferences("dawaaData",MODE_PRIVATE);
String dawaaList[] = {emportPref.getString("subject", "no data yet")};
myList = (ListView) findViewById(R.id.ListView);
myList.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, dawaaList));

这是logcat:

08-28 14:56:41.112: E/AndroidRuntime(273):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
08-28 14:56:41.112: E/AndroidRuntime(273):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-28 14:56:41.112: E/AndroidRuntime(273):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-28 14:56:41.112: E/AndroidRuntime(273):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-28 14:56:41.112: E/AndroidRuntime(273):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-28 14:56:41.112: E/AndroidRuntime(273):  at android.os.Looper.loop(Looper.java:123)
08-28 14:56:41.112: E/AndroidRuntime(273):  at android.app.ActivityThread.main(ActivityThread.java:4627)
08-28 14:56:41.112: E/AndroidRuntime(273):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-28 14:56:41.112: E/AndroidRuntime(273):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-28 14:56:41.112: E/AndroidRuntime(273):  at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
08-28 14:56:41.112: E/AndroidRuntime(273):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
08-28 14:56:41.112: E/AndroidRuntime(273):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.os.Looper.loop(Looper.java:123)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.app.ActivityThread.main(ActivityThread.java:4627)
08-28 14:59:54.272: E/AndroidRuntime(303):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-28 14:59:54.272: E/AndroidRuntime(303):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
08-28 14:59:54.272: E/AndroidRuntime(303):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
08-28 15:02:26.632: E/AndroidRuntime(331):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)

08-28 15:02:26.632:E / AndroidRuntime(331):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)    08-28 15:02:26.632:E / AndroidRuntime(331):在android.app.ActivityThread.access $ 2300(ActivityThread.java:125)    08-28 15:02:26.632:E / AndroidRuntime(331):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)    08-28 15:02:26.632:E / AndroidRuntime(331):在android.os.Handler.dispatchMessage(Handler.java:99)    08-28 15:02:26.632:E / AndroidRuntime(331):在android.os.Looper.loop(Looper.java:123)    08-28 15:02:26.632:E / AndroidRuntime(331):在android.app.ActivityThread.main(ActivityThread.java:4627)    08-28 15:02:26.632:E / AndroidRuntime(331):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)    08-28 15:02:26.632:E / AndroidRuntime(331):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)    08-28 15:02:26.632:E / AndroidRuntime(331):在android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)    08-28 15:02:26.632:E / AndroidRuntime(331):在android.app.Instrumentation.newActivity(Instrumentation.java:1021)    08-28 15:02:26.632:E / AndroidRuntime(331):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)

3 个答案:

答案 0 :(得分:2)

问题可能在这里:

String dawaaList[] = {emportPref.getString("subject", null)};
setListAdapter(new ArrayAdapter<String>(DawaaActivity.this,
android.R.layout.simple_list_item_1, dawaaList));

如果你没有任何主题,你会得到一个null,然后可能是某个地方的nullpointer。

尝试检查null,或者使用null(例如:

)初始化它
if (dawaaList[] == null) { 
   new String[]{"No subjects"}; 
}

并且请发布您的logcat以获得进一步的帮助。

修改

你可以这样处理:

只需在布局中添加ListView

即可
    <ListView
        android:id="@+id/myListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />

并在您的活动

中填充它
    setContentView(R.layout.main);
    ListView listView = (ListView) findViewById(R.id.myListView);
    SharedPreferences pref = getSharedPreferences("dawaaData", MODE_PRIVATE);
    String items = pref.getString("subject", "item1,item2,item3");
    String[] listItems = items.split(",");
    listView.setAdapter(new ArrayAdapter<String>(this,  android.R.layout.simple_list_item_1, listItems));

我选择逗号作为分隔符,因为SharedPreferences无法存储数组。您应该使用Set和pref.getStringSet(来自api 11),或序列化列表(json o anything)。

答案 1 :(得分:0)

App A因为第一次没有初始化值而关闭。 最简单的方法是在try catch(Throwable t)中包装从SharedPreferences读取值的代码

答案 2 :(得分:0)

这两个功能将解决您的问题,首先是保存您需要在A类中进行cal的首选项,您要在其中存储值

public void saveSharedPreference() {
        SharedPreferences myPrefs = this.getSharedPreferences("myPrefs",
                MODE_WORLD_READABLE);
        SharedPreferences.Editor prefsEditor = myPrefs.edit();
        prefsEditor.putString(stringname, stringvalue);
        prefsEditor.commit();
    }

在你的B活动中,你必须调用LoadPreferences函数

private void LoadPreferences() {
        SharedPreferences sharedPreferences = this.getSharedPreferences(
                "myPrefs", MODE_WORLD_READABLE);
        String yourvariable= sharedPreferences.getString(name, "0"); // it will take 0 as default value if variable is empty and you can set you own default value  }