将上下文传递给非活动类以使用AssetManager.getAssets()

时间:2014-03-28 13:56:48

标签: java android xml dom

我正在开发一个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();
  }
}

2 个答案:

答案 0 :(得分:1)

您在初始化之前尝试访问contextContext成员),从而导致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();
    }

    ...

}