Использование getResources() в неактивном классе

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

Пример:

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

Ответ 1

Вам придется передать объект 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 как параметр

Ответ 2

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

Ответ 3

Существует еще один способ без создания объекта. Проверьте ссылку . Спасибо за @cristian. Ниже я добавляю шаги, упомянутые в приведенной выше ссылке. Для меня я не люблю создавать для этого объект и доступ. Поэтому я попытался получить доступ к 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;
    }
}

Ответ 4

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

Ответ 5

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

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);

Ответ 6

Мы можем использовать контекст Context context = parent.getContext(); Где родительский элемент ViewGroup.

Ответ 7

это можно сделать, используя

context.getResources().getXml(R.xml.samplexml);

Ответ 8

ну нет необходимости передавать контекст и делать все это... просто сделайте это

Context context = parent.getContext();

Изменить: где parent - это ViewGroup

Ответ 9

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

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);

Ответ 10

В приложении-путеводителе Udacity Basic 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 
}
}

Это класс non 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];
}
}