我正在开发一个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();
}
}
答案 0 :(得分:1)
您在初始化之前尝试访问context
(Context
成员),从而导致NullPointerException
。
在方法
AssetManager gi = con.getAssets();
@Override
public void update(float deltaTime) {
AssetManager gi = context.getAssets();
...
}
答案 1 :(得分:0)
由于AndroidGame
类继承自Activity
,因此您必须牢记活动生命周期。在调用Context
之前,活动没有onCreate()
,之前调用getApplicationContext()
将返回null。因此,您需要在onCreate中设置上下文字段。
基本上
public class Test extends AndroidGame {
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
this.context = getApplicationContext();
}
...
}