如何使用Transfuse检索SharedPreferences值

时间:2014-07-16 23:42:13

标签: android transfuse

我一直在玩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);
    }
}

感谢您的帮助!

1 个答案:

答案 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注入,以允许您指定非默认的共享首选项。这会有帮助吗?