web-dev-qa-db-ja.com

非アクティビティクラスでgetResources()を使用する

非アクティビティクラスでgetResourcesメソッドを使用しようとしています。 「resources」オブジェクトへの参照を取得して、resourcesフォルダーに保存されているxmlファイルにアクセスするにはどうすればよいですか?

例:

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

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をパラメーターとして受け入れる場所

140
LuckyLuke

Contextオブジェクトを渡すことはお勧めできません。これは多くの場合、メモリリークにつながります。私の提案は、あなたはそれをしないことです。コンテキストをアプリの非アクティビティクラスに渡すことなく、多数のAndroidアプリを作成しました。より良いアイデアは、ActivityまたはFragmentにいる間にアクセスする必要のあるリソースを取得し、それを別のクラスに保持することです。その後、アプリ内の他のクラスでそのクラスを使用して、Contextオブジェクトを渡さなくてもリソースにアクセスできます。

30
Jason Crosby

オブジェクトを作成せずにもう1つの方法もあります。 参照 を確認してください。 @cristianに感謝します。以下に、上記のリファレンスで言及した手順を追加します。私にとっては、そのためのオブジェクトを作成してアクセスするのは好きではありません。そこで、オブジェクトを作成せずにgetResources()にアクセスしようとしました。この投稿を見つけました。それで答えとして追加したいと思いました。

オブジェクトを介して非アクティビティクラスwithout passing a contextgetResources()にアクセスするには、手順に従います。

  • 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;
    }
}
12

Contextにアクセスできますか?または、おそらくgetApplicationContext()でアクセスできます

7
Kristian

ここに私の答えがあります:

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

このようにコンテキストを使用できます親がViewGroupである場合.

Context context = parent.getContext();
3

これは次を使用して行うことができます

context.getResources().getXml(R.xml.samplexml);
3
A.R.Asha

これは私にとって常に機能します:

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
Elroy

コンテキストを渡してすべてを行う必要はありません...単にこれを行うだけです

Context context = parent.getContext();

編集:親はViewGroupです

1

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 
}
}

これはFragmentPageAdapterを拡張する非Activityクラスです

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
Satadru Saha

単純なクラスでコンテキストを宣言し、resフォルダーからファイルからデータを取得します

public class FileData
{
      private Context context;

        public FileData(Context current){
            this.context = current;
        }
        void  getData()
        {
        InputStream in = context.getResources().openRawResource(R.raw.file11);
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        //write stuff to get Data

        }
}

アクティビティクラスでこのように宣言します

public class MainActivity extends AppCompatActivity 
{
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        FileData fileData=new FileData(this);
     }

}
0
sagar