我想避免重复需要在Activity上使用方法的代码(比如getActivity()。getString())。
创建一个保持对Activity的引用的对象似乎不起作用(对象一直在重新创建,并且在您需要时对Activity的任何引用都为null。)
// This won't work, it seems
public class MyUtils {
public MyUtils(Activity activity) {
this.activity = activity;
}
public String getSomeStuff() {
return this.activity.getString(R.string.foo);
}
}
// In a Fragment created by the activity
MyUtils utils = new MyUtils(getActivity());
myUtils.getSomePref();
那么如何避免重复代码呢? 有没有安全的"如何计算需要活动的代码? 您是否应该将所有代码放入Activity本身,并将其从Fragments中转换出来?
编辑:为了澄清我的问题,我特别想找到一种在片段之间共享代码的方法,它们在一个Activity中显示为Tabs(使用TabsPagerAdapter)。 他们都需要访问一些保存为几个首选项的结构化数据。 当片段不可见时,他们还需要在onSharedPreferencesChanged事件处理程序中访问此数据。 根据我的经验,每当我停止并恢复应用程序时,在片段之间导航,更改首选项等...我对活动的所有变量都为空。
答案 0 :(得分:1)
另一种方法是将Activity作为参数提供给每个效用函数。 (您甚至可以通过这种方式将它们设置为静态。)此外,如果您不需要特定于Activity的函数,请使用Context代替更通用的方法。
public class MyUtils {
public static String getSomeStuff(Context a) {
return a.getString(R.string.foo);
}
// more static utility function here
}
答案 1 :(得分:0)
我通常使用SuperActivity分享我的SharedPreferences:
public class SuperActivity extends Activity {
protected SharedPreferences prefs;
public static final String PREFS_FILE = "PreferencesFile";
public static final String STRING_VALUE_KEY = "StringVal";
protected void onResume() {
super.onResume();
prefs = this.getSharedPreferences(PREFS_FILE, 0);
}
public String getStringValue() {
prefs.getString("STRING_VALUE_KEY", "")
}
}
public class SomeActivity extends SuperActivity {
....
}
然后你可以打电话:
getActivity().getStringValue();
从我想到的任何地方......