您如何安全地共享需要Android活动的代码?

时间:2014-11-21 18:51:39

标签: android

我想避免重复需要在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事件处理程序中访问此数据。 根据我的经验,每当我停止并恢复应用程序时,在片段之间导航,更改首选项等...我对活动的所有变量都为空。

2 个答案:

答案 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();

从我想到的任何地方......