我有一个读取XML文件的方法,解析它并将各个元素加载到数组中。代码本身在包含在Activity类中时起作用。它需要在2个不同的Activity中使用,所以我创建了一个实用程序类,这样我就可以从每个Activity中调用一个副本。但是,当它从实用程序类运行时,我得到一个零点异常。这告诉我,我打破了我能做什么以及从哪里做的规则。我怀疑它与访问资源有关,因为我也尝试访问字符串资源(就像测试一样),并且还会抛出NPE。
这是实用程序类。第一个Log.i出现在LogCat中,但第二个没出现。
class Utils extends MainActivity
{
String debugTag = DEBUG_TAG + "/Utils";
public void loadRankFile() throws XmlPullParserException, IOException
{
int eventType = -1;
boolean boolFoundRanks = false;
int intCounter = 0;
// this line appears in LogCat
Log.i(debugTag, "Inside loadRankFile utility.");
// this line causes the NPE
XmlResourceParser scoutRanks = getResources().getXml(R.xml.scoutranks);
// this line does not appear in LogCat
Log.i(debugTag, "xml file loaded");
.
.
.
}
这是调用上述方法的Activity中的代码:
public class RankProgressActivity extends MainActivity
{
String debugTag = DEBUG_TAG + "/RankProgressActivity";
Utils utilities = new Utils();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.rank_progress);
try
{
initSelectScout();
utilities.loadRankFile();
initSelectRank();
}
catch (IOException e)
{
Log.i(debugTag, "Failure initializing Scout Progress activity items", e);
}
catch (XmlPullParserException e)
{
Log.e(debugTag, "Rank file parse error.", e);
}
.
.
.
}
我确定我犯了一个经典错误,但是我没有看到它,而且我还没能找到指导。对于任何反馈,我们都表示感谢。我对Java和Android比较陌生,所以这对我来说是一次学习经历。
提前谢谢。
答案 0 :(得分:0)
您的Utils类不应该扩展Activity。活动是面向用户的界面,这意味着当您想要向用户显示某种UI时,您可以实现一个Activity。 阅读Activity的文档。
您的Utils类看起来应该是这样的:
class Utils
{
private static final String DEBUG_TAG = "Utils";
public ArrayList<String> parseRankFile(Context context) throws XmlPullParserException, IOException
{
ArrayList<String> scoutRanks = new ArrayList<String>();
Log.i(DEBUG_TAG, "Inside loadRankFile utility.");
XmlResourceParser scoutRanksParser = context.getResources().getXml(R.xml.scoutranks);
Log.i(DEBUG_TAG, "xml file loaded");
// do your parsing and populate the scoutRanks ArrayList
return scoutRanks;
}
}
然后在你的Activity中你会像这样调用你的Utils方法:
ArrayList<String> scoutRanks = Utils.parseRankFile(this);