2011-11-08 60 views
0

我正在嘗試製作一個小部件,用戶必須提供一個名稱。根據該名稱收集並顯示數據。在小部件中有一個刷新按鈕來刷新這些數據。小工具:存儲用戶首選項

問題是在配置類和AppWidgetProvider類之間共享此名稱。我試過的東西:

  • 只需使用小部件中的EditText。在配置類中,在EditText中設置名稱,並在AppWidgetProvider類中檢索它。 這不起作用,因爲我無法找到一種方法來檢索AWP中的文本。
  • 使用SharedPreferences:

在配置類:

c = SelectWidgetStationActivity.this; 

// Getting info about the widget that launched this Activity. 
Intent i = getIntent(); 
Bundle extras = i.getExtras(); 
if (extras != null) 
    awID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c); 
prefs.edit().putString("widgetname" + awID, name); 
prefs.edit().commit(); 

在AWP類:

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) { //ACTION_WIDGET_RECEIVER is the action fired by the refresh button 
     this.onUpdate(context, AppWidgetManager.getInstance(context), AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName("com.app.myapp", "com.app.myapp.MyWidgetProvider"))); 
    } 
} 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 

for (int widgetId : appWidgetIds) { 
     name = prefs.getString("widgetname" + widgetId, "N/A")); 
    //more code 

name一直給我 「N/A」。我檢查了awIDwidgetId是相等的。 這可能是由於我使用不同的上下文的事實? (這裏只是猜測)

那麼解決這個問題的方法是什麼?

編輯 當我打印屏幕上的背景下,我得到如下:

回答

3

通過這個剛剛又去了好奇,並注意到了這一點:

prefs.edit().putString("widgetname" + awID, name); 
prefs.edit().commit(); 

這給你2個不同Editor實例。 你在這裏做的是得到一個編輯,放入首選項並保持獨立。然後你得到一個新的(不變的)編輯器,並提交它(=沒有改變被寫入)。剛剛在一個小項目上測試過,沒有按照預期正確執行。

因此,嘗試像這樣的東西來替代代碼:

Editor e = prefs.edit(); 
e.putString("widgetname" + awID, name); 
e.commit(); 

或鏈

prefs.edit().putString("widgetname" + awID, name).commit(); 
+0

好的。有效!這是我第一次沒有存儲編輯器,僅僅是因爲我正在測試這些東西,並希望更快地輸入(2行而不是3)。那麼我猜'更快'一點沒有真正解決^ ^(順便說一句,我現在把它鏈接起來,使它1行= D) – nhaarman

+0

好吧,正如你所說,你總是可以像最後一個代碼片段這樣的鏈接編輯器方法。那只是一條線。 (編輯ehehe我太慢了:) :) – 2011-11-08 14:16:50

+0

哈哈,謝謝! – nhaarman

0

你可能會嘗試

SharedPreferences prefs = context.getSharedPreferences("someName", Context.MODE_PRIVATE); 
+0

我已經嘗試過了,沒有運氣的承諾。 – nhaarman

0
prefs.edit().putString("widgetname" + awID, name); 

確保name寫偏好時不null。否則,當再次讀取它時將返回null,這將返回默認值「N/A」(如未找到密鑰)。

+0

我檢查過,'name'肯定不是'null'。 – nhaarman

-1
public static final String PREFS_NAME = "MyPrefsFile"; 
private static final String PREF_USERNAME = "username"; 


SharedPreferences pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
//to access data from preference 

uid.setText(pref.getString(PREF_USERNAME, null)); 

//to set value in preference 
    getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit() 
        .putString(PREF_USERNAME, uid.getText().toString()).commit(); 
+0

你甚至讀過這個問題嗎? – nhaarman