Использование getResources () в неактивном классе - PullRequest
114 голосов
/ 05 октября 2011

Я пытаюсь использовать метод getResources в неактивном классе.Как получить ссылку на объект «ресурсы», чтобы я мог получить доступ к XML-файлу, хранящемуся в папке ресурсов?

Пример:

XmlPullParser xpp = getResources().getXml(R.xml.samplexml);

Ответы [ 11 ]

140 голосов
/ 05 октября 2011

Вам нужно будет передать ему объект context.Либо this, если у вас есть ссылка на класс в активе, либо getApplicationContext()

public class MyActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        RegularClass regularClass = new RegularClass(this);
    }
}

Затем вы можете использовать его в конструкторе (или установить его в качестве переменной экземпляра):

public class RegularClass(){
    private Context context;

    public RegularClass(Context current){
        this.context = current;
    }

    public findResource(){
        context.getResources().getXml(R.xml.samplexml);
    }
}

Где конструктор принимает Context в качестве параметра

30 голосов
/ 28 августа 2013

Это не очень хорошая идея, чтобы передать Context объектов вокруг.Это часто приводит к утечкам памяти.Я предлагаю, чтобы вы этого не делали.Я сделал множество приложений для Android, не передавая контекст в неактивные классы в приложении.Лучшей идеей было бы получить ресурсы, к которым вам нужен доступ, пока вы находитесь в Activity или Fragment, и удерживать их в другом классе.Затем вы можете использовать этот класс в любых других классах вашего приложения для доступа к ресурсам без необходимости передавать Context объекты.

12 голосов
/ 22 сентября 2015

Существует еще один способ без создания объекта.Проверьте ссылку .Спасибо за @ кристиан.Ниже я добавлю шаги, упомянутые в приведенной выше ссылке.Для меня я не люблю создавать объект для этого и доступа.Поэтому я попытался получить доступ к getResources() без создания объекта.Я нашел этот пост.Поэтому я подумал добавить его в качестве ответа.

Выполните шаги, чтобы получить доступ к getResources() в неактивном классе without passing a context через объект.

  • Создать подкласс Application, например public class App extends Application {.См. Код рядом с шагами.
  • Установите атрибут android:name вашего тега <application> в AndroidManifest.xml, чтобы он указывал на ваш новый класс, например, android:name=".App"
  • ВonCreate() метод экземпляра вашего приложения, сохраните ваш контекст (например, this) в статическое поле с именем app и создайте статический метод, который возвращает это поле, например, getContext().
  • Теперь вы можетеиспользуйте: App.getContext() всякий раз, когда вы хотите получить контекст, а затем мы можем использовать App.getContext().getResources() для получения значений из ресурсов.

Вот как это должно выглядеть:

public class App extends Application{

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
    }

    public static Context getContext(){
        return mContext;
    }
}
7 голосов
/ 05 октября 2011

У вас есть доступ к Context?Или, скорее всего, вы можете получить к нему доступ по getApplicationContext()

5 голосов
/ 04 мая 2015

вот мой ответ:

public class WigetControl {
private Resources res;

public WigetControl(Resources res) 
{
    this.res = res;
}

public void setButtonDisable(Button mButton)
{
    mButton.setBackgroundColor(res.getColor(R.color.loginbutton_unclickable));
    mButton.setEnabled(false);
}

}

и вызов может быть таким:

        WigetControl control = new WigetControl(getResources());
        control.setButtonDisable(btNext);
3 голосов
/ 29 декабря 2016

Мы можем использовать контекст. Вот так попробуйте сейчас, где родителем является ViewGroup.

Context context = parent.getContext();
3 голосов
/ 30 июля 2012

это можно сделать с помощью

context.getResources().getXml(R.xml.samplexml);
1 голос
/ 06 сентября 2016

В приложении-путеводителе базового курса Udacity по ANdroid я использовал концепцию фрагментов.Я застрял на некоторое время, испытывая трудности с доступом к некоторым строковым ресурсам, описанным в строковом файле XMLНаконец-то получено решение.

Это основной класс активности

пакет com.example.android.tourguidekolkata;

import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState)
{
  //lines of code
   //lines of code
    //lines of code
    YourClass adapter = new YourClass(getSupportFragmentManager(), getApplicationContext()); 
    //lines of code
    // getApplicationContext() method passses the Context of main activity to the class TourFragmentPageAdapter 
}
}

Это не класс Activity, который расширяет FragmentPageAdapter

public class YourClass extends FragmentPagerAdapter {
private String yourStringArray[] = new String[4];
Context context;

public YourClass (FragmentManager fm, Context context)
{
    super(fm);
    this.context = context; // store the context of main activity
    // now you can use this context to access any resource 
    yourStringArray[0] = context.getResources().getString(R.string.tab1);
    yourStringArray[1] = context.getResources().getString(R.string.tab2);
    yourStringArray[2] = context.getResources().getString(R.string.tab3);
    yourStringArray[3] = context.getResources().getString(R.string.tab4);
}
@Override
public Fragment getItem(int position)
 {
 }
@Override
public int getCount() {
return 4;
}

@Override
public CharSequence getPageTitle(int position) {
// Generate title based on item position
return yourStringArras[position];
}
}
1 голос
/ 21 февраля 2015

Это всегда работает для меня:

import android.app.Activity;
import android.content.Context;

public class yourClass {

 Context ctx;

 public yourClass (Handler handler, Context context) {
 super(handler);
    ctx = context;
 }

 //Use context (ctx) in your code like this:
 XmlPullParser xpp = ctx.getResources().getXml(R.xml.samplexml);
 //OR
 final Intent intent = new Intent(ctx, MainActivity.class);
 //OR
 NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
 //ETC...

}

Не относится к этому вопросу, но пример использования фрагмента для доступа к системным ресурсам / действиям выглядит так:

public boolean onQueryTextChange(String newText) {
 Activity activity = getActivity();
 Context context = activity.getApplicationContext();
 returnSomething(newText);
 return false;
}

View customerInfo = getActivity().getLayoutInflater().inflate(R.layout.main_layout_items, itemsLayout, false);
 itemsLayout.addView(customerInfo);
1 голос
/ 26 августа 2013

ну, не нужно передавать контекст и делать все это ... просто сделайте это

Context context = parent.getContext();

Редактировать: где родительский элемент - ViewGroup

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...