2013-07-19 53 views
0

我有一個項目有兩個活動(MainActivity和CustomPreferenceActivity)。我有一些代碼,當一個按鈕被點擊時,它會啓動CustomPreferenceActivity。根據在CustomPreferenceActivity上所做的選擇,TextView的字體顏色將會改變。但是,我不喜歡我的解決方案(綁定到onResume來更新UI)。還有其他建議嗎?提前致謝。更好的方法來處理SharedPreferences變化

MainActivity

public class MainActivity extends Activity { 

private int colorResId; 
private int fontSize; 
private OnClickListener buttonListener = getButtonListener(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button button = (Button)findViewById(R.id.preferenceButton); 
    button.setOnClickListener(buttonListener); 


} 

@Override 
public void onResume() 
{ 
    super.onResume(); 
    updateUiBasedOnPreferences(); 
} 

private void updateUiBasedOnPreferences() 
{ 
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 
    String colorPreference = pref.getString("colorPreference", "default"); 

    colorResId = convertStringToColorResId(colorPreference); 
    fontSize = pref.getInt("fontSize", 24); 

    TextView textView = (TextView)findViewById(R.id.textView); 
    textView.setTextColor(colorResId); 
    textView.setTextSize(fontSize); 

} 
private int convertStringToColorResId(String input) 
{ 
    if (input.equals("GREEN")) 
     return Color.GREEN; 
    else if (input.equals("RED")) 
     return Color.RED; 
    else if (input.equals("BLUE")) 
     return Color.BLUE; 
    else 
     return Color.BLACK; 
} 

private OnClickListener getButtonListener() 
{ 
    return new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(getApplicationContext(), CustomPreferencesActivity.class); 
      startActivity(intent); 
     } 
    }; 
} 

CustomPreferencesActivity

public class CustomPreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener 
{ 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    addPreferencesFromResource(R.xml.preferences); 
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    pref.registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 
{ 
    Preference pref = findPreference(key); 
    pref.setSummary(sharedPreferences.getString(key, "")); 
} 
} 
+1

我不明白你的問題反正只是看這對sharedpreferences HTTP:/ /rajeshvijayakumar.blogspot.in/2013/03/shared-preferences-example-in-android.html – Aravin

+0

這並不是非常清楚你實際上想要達到什麼目的。你能否詳細說明你的用例? –

+0

我想知道是否有一個「更清潔」的解決方案,我現在擁有。它確實有效,但我不喜歡我必須重寫MainActivity上的onResume。 – MrAppa

回答

0

您可以讓您的偏好活動通過Intent通過使用startActivityForResult(Intent, int)而不是在主要活動中僅使用startActivity(Intent)將色彩信息包含回您的主要活動。然後可以在onActivityResult(int, int, Intent)期間讀取意圖數據,當首選項活動結束時會自動調用該數據。該代碼是這樣的:

public class MainActivity extends Activity { 

    // ... 

    public static final int TEXT_COLOR_REQUEST_CODE = 1; 

    private OnClickListener getButtonListener() { 
     return new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getApplicationContext(), CustomPreferencesActivity.class); 
       startActivityForResult (intent, TEXT_COLOR_REQUEST_CODE); 
      } 
     }; 
    } 

    @Override 
    protected void onActivityResult (int requestCode, int resultCode, Intent data) { 
     if ((requestCode == TEXT_COLOR_REQUEST_CODE) && (resultCode == RESULT_OK)) { 
      // Extract color information from data and update UI. 
      updateUI(data); 
     } 
    } 
} 

當你的偏好活動中的顏色變化,你會添加此代碼:

Intent intent = new Intent(); 
intent.putExtra("key", colorData); 
setResult(RESULT_OK, colorData); 
+0

這完全適合我。十分感謝你的幫助。 – MrAppa

0

你可以實現一個單獨的類和一個監聽器接口,使這一招。

  1. OnPreferenceChangeListener,MainActivity實現該接口來更新UI

  2. OnPreferenceChangeHeler,保持OnPreferenceChangeListener的基準(即MainActivity)OnPreferenceChangeHeler時更新

  • CustomPreferencesActivity呼叫的方法

  • +0

    我對singleton類的問題是他們使測試代碼非常困難。另外,我不喜歡在類之間共享助手的想法。感謝您的幫助。 – MrAppa

    相關問題