2

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

谢谢你的帮助!

4

1 回答 1

2

@Preference注入使用该方法PreferenceManager.getDefaultSharedPreferences()(如 CommonsWare 建议的那样)来查找SharedPreferences对象。这是直接使用默认首选项的便利。您的示例基本上会生成以下注入:

delegate.favColor = activity.getDefaultSharedPreferences()
                        .getString("favorite_color", "green");

如果你喜欢,你可以设置 Transfuse 通过Provideror@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注入以允许您指定非默认共享首选项。这会有帮助吗?

于 2014-07-17T17:50:59.770 回答