2012-08-27 193 views
0

我有兩個活動A和B.檢索共享首選項

B:是一項設置活動,它將所有設置保存在共享首選項中。

答:是主要的活動,我檢索保存在B活性

的問題是,如果用戶使用的應用程序首次並啓動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):at a ndroid.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 08-28 15:02:26.632:E/AndroidRuntime(331):at android.app.ActivityThread.access $ 2300(ActivityThread.java:125) 08- 28 15:02:26.632:E/AndroidRuntime(331):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033) 08-28 15:02:26.632:E/AndroidRuntime(331):at android .os.Handler.dispatchMessage(Handler.java:99) 08-28 15:02:26.632:E/AndroidRuntime(331):at android.os.Looper.loop(Looper.java:123) 08-28 15 :02:26.632:E/AndroidRuntime(331):at 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.intern ZygoteInit.main(ZygoteInit.java:626) 08-28 15:02:26.632:E/AndroidRuntime(331):at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146) 08-28 15:02:26.632:E/AndroidRuntime(331):at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 08-28 15:02:26.632:E/AndroidRuntime(331):at android.app。 ActivityThread.performLaunchActivity(ActivityThread.java:2577)

+4

發佈您的logcat錯誤? –

回答

2

這個問題可能是在這裏:

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

如果您沒有任何受你會得到一個空值,然後可能是一個空指針。

嘗試檢查無效,或有一些初始化,如果無效,如:

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

,並請發表您的進一步幫助lo​​gcat的。

編輯:

你可以這樣處理:

只需添加一個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任何東西)。

+0

我弄清楚A佈局中的問題我添加一個按鈕,並在A活動中擴展ListActivity的公共類DawaaActivity擴展ListActivity實現View.OnClickListener {'但我如何在A佈局中顯示共享首選項內容而不使用ListActivity –

+0

而不是使用ListActivity,您可以在普通的Activity中使用ListView。 :) – Enrichman

+0

你能給我一個這樣做的例子:-) –

0

應用程序A因爲第一次沒有初始化值而被關閉。 最簡單的方法是來包裝在嘗試捕捉讀取來自SharedPreferences值(的Throwable t)的代碼

0

這兩個功能將解決您的問題,第一個是節約優先,你將需要在A類,要存儲值

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

並在您的B活性到CAL,你必須調用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 } 
+0

這並不能解決問題,因爲OP在這部分沒有錯。 – nkr