图形布局ADT预览中的资源$ NotFoundException(但app实际上是Works)

Rum*_*raK 7 layout android exception adt

我的问题是加载XML中定义的字符串数组在应用程序中工作,但会导致ADT图形布局预览中的错误.

现在,由于此错误,我无法在图形布局中看到任何图形,并且很难与其他图形一起使用.但是如果我构建并运行我的应用程序,视图正在加载并显示字符串.

所以我想我的代码是正确的但是:

  • 我缺少图形布局预览的一些限制和一些解决方法
  • 或者,即使它似乎在应用程序中运行,我也会遗漏一些显而易见的事情并做错事

我有一个自定义视图,我在array.xml文件中获取由我定义的数组.

public class ScoreTable extends View {
  [...]
  @Override
  protected void onDraw(Canvas canvas) {
    [...]
    int score_vals[] = getResources().getIntArray(R.array.score_vals);
    [...]
  }
  [...]
}
Run Code Online (Sandbox Code Playgroud)

我的数组在res/values/array.xml中定义:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="score_vals">
        <item >10</item>
        <item >20</item>
        <item >50</item>
    </array>
</resources>
Run Code Online (Sandbox Code Playgroud)

图形布局为空白,并说:

Int array resource ID #0x7f050000
Exception details are logged in Window > Show View > Error Log
Run Code Online (Sandbox Code Playgroud)

但当然我有"public static final int score_vals = 0x7f050000;" 在R.java!

此错误的详细信息是50深度堆栈,但重新开始:

android.content.res.Resources$NotFoundException: Int array resource ID #0x7f050000
    at android.content.res.Resources.getIntArray(Resources.java:405)
    at com.threecats.poker.ScoreTable.onDraw(ScoreTable.java:53)
    at android.view.View.draw(View.java:6740)
[...]
Run Code Online (Sandbox Code Playgroud)

那么,getResources().getXXXArray()应该在ADT图形布局预览的上下文中工作吗?

我想提一下,我在XML中尝试使用"array"和"array-integer",并且都在应用程序中工作,但在预览中不工作.此外,我试图从私有Context成员的视图的构造函数中保存Context ...也没有帮助.

And*_*ich 10

你的代码没问题,但不幸的是ADT插件中仍然存在一些错误,其中有一个.布局编辑器在渲染自定义视图时遇到麻烦.我有同样的问题,我发现的唯一的锻炼是检查View.isInEditMode并以其他方式初始化int数组,但不是来自资源.所以你的代码看起来像这样:

int score_vals[];
if (isInEditMode()) {
    score_vals = { 10, 20, 50 };
} else {
    score_vals = getResources().getIntArray(R.array.score_vals);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,不要在方法中创建或加载任何资源onDraw.我想getResources().getIntArray使用某种缓存,但无论如何,你的性能可能会受到影响.

  • 谢谢!我做了更改,现在我在构造函数中获取了数据,这些数据由Activity加载:`gameData =((FooActivity)context).gameData;` - 但ADT现在说`错误:ScoreTable无法实例化. `java.lang.ClassCastException:com.android.layoutlib.bridge.android.BridgeContext无法强制转换为com.foo.FooActivity` - 所以看起来Context是存根的,这会导致预览中的所有错误.我似乎没有别的选择,只能使用`isInEditMode()`并复制代码中的XML值进行预览......哎呀! (2认同)