컨텍스트가없는 클래스에서 getResources ()를 호출하는 방법은 무엇입니까?
내 지원서에는 많은 수업과 활동이 있습니다. Droid는 컨텍스트가없는 클래스입니다. Mygame은 SurfaceView를 확장하고 SurfaceHolder.Callback을 구현하는 클래스입니다. mygame 클래스에서 Droid 개체를 만들고 배경 이미지와 위치를 설정하고 있습니다. 이를 위해 작성한 코드는 다음과 같습니다.
block1 = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.birdpic), 100, 10);
Droid 클래스의 생성자는 다음과 같습니다.
public Droid(Bitmap bitmap, int x, int y) {
this.bitmap = bitmap;
this.x = x;
this.y = y;
}
특정 시나리오에서 Droid 클래스 자체에서 Droid 개체의 배경 이미지와 위치를 설정해야합니다. 여기에 문제가 있습니다.이 작업을 수행하는 코드 스 니펫은 다음과 같습니다.
if(checkflag)
{
myObj.centerblock=new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.blast), myObj.xpos, myObj.ypos);
}
문제는 Droid 클래스에 컨텍스트가 없다는 것입니다. 그래서 여기서 getResources ()를 사용할 수 없습니다. 아래 코드를 시도했지만 충돌합니다.
if(checkflag)
{
myObj.centerblock=new Droid(BitmapFactory.decodeResource(myObj.getResources(), R.drawable.blast), myObj.xpos, myObj.ypos);
}
누구든지 나를 도울 수 있습니다. 배경 이미지를 설정하고 Droid 클래스 자체에서 Droid 개체에 대해 배치하고 싶습니다.
컨텍스트는 시스템에 대한 핸들입니다. 리소스 해결, 데이터베이스 및 기본 설정에 대한 액세스 권한 획득 등과 같은 서비스를 제공합니다. 응용 프로그램 별 리소스와 클래스 및 응용 프로그램 환경에 대한 정보에 액세스 할 수있는 "인터페이스"입니다. 활동과 서비스는 또한 Context를 확장하여 애플리케이션이 실행되는 환경 정보에 액세스하기 위해 모든 메소드를 상속합니다.
즉, 리소스에 대한 특정 정보를 가져 오거나 수정하려면 특정 클래스에 컨텍스트를 전달해야합니다. 생성자에서 컨텍스트를 전달할 수 있습니다.
public classname(Context context, String s1)
{
...
}
이에 대한 일반적인 해결책은 컨텍스트 인스턴스를 만들 때 또는 처음 만든 후 컨텍스트를 사용해야하기 전에 클래스에 컨텍스트 인스턴스를 전달하는 것입니다.
또 다른 해결책은 Droid 개체를 코드에 상당히 밀접하게 연결하더라도 응용 프로그램 컨텍스트에 액세스하는 정적 메서드를 사용하여 Application 개체를 만드는 것입니다.
편집, 예제 추가
Droid 클래스를 다음과 같이 수정하십시오.
public Droid(Context context,int x, int y) {
this.bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.birdpic);
this.x = x;
this.y = y;
}
또는 다음과 같은 응용 프로그램을 만듭니다.
public class App extends android.app.Application
{
private static App mApp = null;
/* (non-Javadoc)
* @see android.app.Application#onCreate()
*/
@Override
public void onCreate()
{
super.onCreate();
mApp = this;
}
public static Context context()
{
return mApp.getApplicationContext();
}
}
그리고 컨텍스트가 필요할 때마다 App.context ()를 호출합니다. 그러나 모든 함수를 애플리케이션 컨텍스트에서 사용할 수있는 것은 아니며 일부 함수는 활동 컨텍스트에서만 사용할 수 있지만 getResources ()에 대한 필요와 확실히 관련됩니다.
다음과 같이 매니페스트의 애플리케이션 정의에 android : name을 추가해야합니다.
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:name=".App" >
예 : app_name 문자열 가져 오기 :
Resources.getSystem().getString( R.string.app_name )
This always works for me:
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:
block1 = new Droid(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic), 100, 10);
//OR
builder.setLargeIcon(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic));
//OR
final Intent intent = new Intent(ctx, MainActivity.class);
//OR
NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
//ETC...
}
Not related to this question but example using a Fragment to access system resources/activity like this:
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);
It can easily be done if u had declared a class that extends from Application
This class will be like a singleton, so when u need a context u can get it just like this:
I think this is the better answer and the cleaner
Here is my code from Utilities package:
public static String getAppNAme(){
return MyOwnApplication.getInstance().getString(R.string.app_name);
}
'IT박스' 카테고리의 다른 글
배치 파일 : 상대 경로가있는 디렉토리의 모든 파일 나열 (0) | 2020.12.09 |
---|---|
Django의 GenericForeignKey를 모델 목록으로 제한하려면 어떻게해야합니까? (0) | 2020.12.08 |
Git이 파일을 감지하지 못하고 .gitignore에 없습니다. (0) | 2020.12.08 |
캔버스를 부모만큼 넓고 높이 만들기 (0) | 2020.12.08 |
0에 가까운 부동 값이 0으로 나누기 오류를 일으킬 수 있습니까? (0) | 2020.12.08 |