비 활동 클래스에서 getResources () 사용 파일에 액세스 할 수 있도록 “리소스”개체에

비 활동 클래스에서 getResources 메서드를 사용하려고합니다. 리소스 폴더에 저장된 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.xmlandroid: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;
    }
}


답변

내 대답은 다음과 같습니다.

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.getResources().getXml(R.xml.samplexml);


답변

컨텍스트를 사용할 수 있습니다. 지금 시도해보십시오. 부모가 ViewGroup입니다.

Context context = parent.getContext();


답변

컨텍스트를 전달하고 모든 작업을 수행 할 필요가 없습니다.

Context context = parent.getContext();

편집 : 부모는 ViewGroup입니다.