我一直在玩Transfuse(http://androidtransfuse.org/),现在正试图解决SharedPreferences
问题。文档使这看起来非常简单:
@Activity
public class Example{
@Inject @Preference(value = "favorite_color", default = "green")
String favColor;
}
但是,据我所知,SharedPreferences
是按名称检索的,而不仅仅是按键。那么,Transfuse如何知道我试图访问的SharedPreferences
文件的名称?
我尝试过这样的事情无济于事:
@Activity
public class MainActivity{
public static final String PREF_NAME = "pref_name";
@Inject
android.app.Activity mActivity;
@Inject @Preference(value = PREF_NAME, defaultValue = "")
String mPreference;
@Inject @View(R.id.preference)
EditText mPreferenceEditText;
@RegisterListener(R.id.button_2)
android.view.View.OnClickListener mSavePrefListener = new android.view.View.OnClickListener() {
@Override
public void onClick(android.view.View v) {
String val = mPreferenceEditText.getText().toString();
mActivity.getSharedPreferences("the_shared_prefs", Context.MODE_PRIVATE)
.edit()
.putString(PREF_NAME, val)
.apply();
}
};
@OnResume
private void displayPrefText(){
mPreferenceEditText.setText(mPreference);
}
}
感谢您的帮助!
答案 0 :(得分:2)
@Preference
注入使用PreferenceManager.getDefaultSharedPreferences()
方法(如CommonsWare建议的那样)来查找SharedPreferences
对象。这样可以直接使用默认首选项。您的示例基本上会生成以下注入:
delegate.favColor = activity.getDefaultSharedPreferences()
.getString("favorite_color", "green");
如果您愿意,可以设置Transfuse以通过Provider
或@Provides
方法和限定符注入特定的SharedPreferences对象:
@TransfuseModule
class Module{
@Provides @Named("the_shared_prefs")
public SharedPreferences build(Activity activity){
return activity.getSharedPreferences("the_shared_prefs", Context.MODE_PRIVATE)
}
}
然后你可以像这样注入你的活动:
@Activity
public class MainActivity{
public static final String PREF_NAME = "pref_name";
@Inject @Named("the_shared_prefs")
SharedPreferences theSharedPreferences;
@Inject @View(R.id.preference)
EditText mPreferenceEditText;
@RegisterListener(R.id.button_2)
android.view.View.OnClickListener mSavePrefListener = new android.view.View.OnClickListener() {
@Override
public void onClick(android.view.View v) {
String val = mPreferenceEditText.getText().toString();
theSharedPreferences
.edit()
.putString(PREF_NAME, val)
.apply();
}
};
}
我们可能希望扩展@Preference
注入,以允许您指定非默认的共享首选项。这会有帮助吗?