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

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

Пример:

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

Вам придется передать объект context . Либо this если у вас есть ссылка на класс в activity, или 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 как параметр

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

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

Выполните шаги для доступа к getResources() в классе non activity 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; } } 

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

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

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

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

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

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

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

 Context context = parent.getContext(); 

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

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

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

В приложении-путеводителе Udacity's 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 } } This is the non Activity class that extends 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]; } }