Android: Как вы получаете доступ к строковому массиву из strings.xml в пользовательском классе?
Я хотел бы получить свой массив строк без расширения Activity в моем пользовательском классе. Есть ли способ сделать это?
String[] foo_array = getResources().getStringArray(R.array.foo_array);
не будет работать без расширения Activity, поэтому мне нужен обход.
Ответы
Ответ 1
Передайте контекст конструктору пользовательского класса и используйте тот же
new CustomClass(ActivityName.this);
Тогда
Context mContext;
public CustomClass(Context context)
{
mContext = context;
}
используйте контекст
String[] foo_array = mContext.getResources().getStringArray(R.array.foo_array);
Также имейте в виду
Не сохраняйте долговечные ссылки на контекст-активность (ссылка на активность должна иметь тот же жизненный цикл, что и сама деятельность)
http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html
Также проверьте это
android getResources() из класса без активности
Edit:
Измените это
public class CustomClass(Context context)
{
}
Для
public class CustomClass
{
Context mContext;
public CustomClass(Context context) // constructor
{
mContext = context;
}
}
Ответ 2
попробуйте это,
Context context=getApplicationContext();
String[] foo_array = context.getResources().getStringArray(R.array.foo_array);
И не используйте контекст активности, связанный с жизненным циклом активности.
Обновление
getApplicationContext()
- это класс Context. Это означает, что в любом случае расширенный контекст имеет этот метод. Это также означает, что вы сможете использовать это из service
или из других ресурсов.
Но, если пользовательский класс не расширяет Activity/context, вам необходимо передать Context как параметр для использования getApplicationContext()
если вы заявляете свою активность следующим образом
myMethod(Activity activity) //this is bad
Бад, если он похож на следующий,
myMethod(Context context) //this is ok
но из объявления выше не проходят Activity
или service
Context
, поскольку у них есть собственный жизненный цикл. вместо этого вы будете использовать getApplicationContext()
Ответ 3
Вам нужно передать контекст Activity в пользовательский класс.
private Context context;
public CustomClass(Context context)
{
this.context=context;
}