Я пытаюсь использовать метод getResources в классе non-activity. Как получить ссылку на объект "resources", чтобы я мог получить доступ к файлу xml, хранящемуся в папке ресурсов?
Пример:
XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
Я пытаюсь использовать метод getResources в классе non-activity. Как получить ссылку на объект "resources", чтобы я мог получить доступ к файлу xml, хранящемуся в папке ресурсов?
Пример:
XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
Вам придется передать объект 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
как параметр
Неплохая идея передать объекты Context
. Это часто приводит к утечкам памяти. Мое предложение состоит в том, что вы этого не делаете. Я сделал множество приложений для Android, не передавая контекст классам без активности в приложении. Лучшей идеей было бы получить доступ к ресурсам, к которым вам нужен доступ, в то время как ваш в Activity
или Fragment
, и удерживать его в другом классе. Затем вы можете использовать этот класс в любых других классах вашего приложения для доступа к ресурсам без необходимости пропускать объекты Context
.
Существует еще один способ без создания объекта. Проверьте ссылку . Спасибо за @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;
}
}
У вас есть доступ к 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 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];
}
}