[英]Pass context to a non-Activity Class to use AssetManager.getAssets()
我正在开发一个Android应用,并且正在尝试在Assets文件夹中打开一个xml文件,其中包含对也位于Assets文件夹中的图像的引用。 我在非活动类中使用AssetManager并尝试将上下文传递给其构造函数,但没有成功。Eclipse中没有错误,但是当我运行该应用程序时,它会崩溃。 我用于2个类和XML的代码如下。
XML档案:
<scene>
<sprite>
<img src="100789.jpg" positionx="100" positiony="200" name="100789.jpg"/>
</sprite>
<sprite>
<img src="100788.jpg" positionx="2" positiony="20" name="100788" />
</sprite>
</scene>
主班(活动)
import android.content.Context;
....
public class Test extends AndroidGame {
Context context=getApplicationContext();
@Override
public Screen getStartScreen() {
return new LoadingScreen(this, context);
}
}
负荷等级(屏幕)
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import android.content.Context;
import android.content.res.AssetManager;
....
public class LoadingScreen extends Screen {
private Context context;
public Document doc;
public LoadingScreen(Game game, Context context) {
super(game);
this.context=context;
}
AssetManager gi = con.getAssets();
@Override
public void update(float deltaTime) {
try {
InputStream inStream = gi.open("assets.xml");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(inStream);
doc.getDocumentElement().normalize();
}catch (Exception e) {
e.printStackTrace();
}
Graphics g = game.getGraphics();
Assets.background = g.newPixmap(doc.getDocumentElement().getElementsByTagName("sprite").item(0).getChildNodes().item(1).getAttributes().getNamedItem("name").getNodeValue(), PixmapFormat.RGB565);
....
....
game.setScreen(new MainMenuScreen(game));
}
那我做错什么了吗?
我还尝试将以下代码放入构造函数中,但没有成功:
public LoadingScreen(Game game, Context context) {
super(game);
this.context=context;
AssetManager gi = con.getAssets();
try {
InputStream inStream = gi.open("assets.xml");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(inStream);
doc.getDocumentElement().normalize();
}catch (Exception e) {
e.printStackTrace();
}
}
您尝试在初始化Context
之前访问context
( Context
成员),从而导致NullPointerException
。 移动AssetManager gi = con.getAssets();
方法内部
@Override
public void update(float deltaTime) {
AssetManager gi = context.getAssets();
...
}
由于AndroidGame
类是从Activity
继承的,因此您必须牢记Activity的生命周期。 直到调用onCreate()
之前,活动没有Context
,在此之前调用getApplicationContext()
将返回null。 因此,您需要在onCreate内设置上下文字段。
基本上
public class Test extends AndroidGame {
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
this.context = getApplicationContext();
}
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.