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

时间:2012-07-18 14:35:27

标签: android exception layout 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);
    [...]
  }
  [...]
}

我的数组在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>

图形布局为空白,并说:

Int array resource ID #0x7f050000
Exception details are logged in Window > Show View > Error Log

但当然我有“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)
[...]

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

我想提一下,我在XML中尝试使用“array”和“array-integer”,它们都在应用程序中运行,但在预览中却没有。 此外,我试图从私有Context成员的视图的构造函数中保存Context ...也没有帮助。

2 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:0)

我找到了一种解决方法,你必须劫持android自己的属性才能访问设计师的资源。

以下应该提供这个想法,但你必须找到int []

类型的本机android属性

此自定义视图XML应在使用资源

时在图形布局预览中呈现
<!-- Could override individual attributes here too rather than using a style -->
<com.github.espiandev.showcaseview.ShowcaseView
     style="@style/ShowcaseView"/>

styles.xml - 指定一些要使用的资源的样式

<style name="ShowcaseView" parent="match_fill">
    <!--# Cling drawable -->
    <item name="android:src">@drawable/cling</item>
    <!--# Title #-->
    <item name="android:contentDescription">@string/showcase_title</item>
    <!--# Description #-->
    <item name="android:description">@string/showcase_description</item>
    <!--# Button Text #-->
    <item name="android:text">@string/ok</item>
    <item name="sv_titleTextColor">#33B5E5</item>
    <item name="sv_detailTextColor">#FFFFFF</item>
    <item name="sv_backgroundColor">#3333B5E5</item>
    <item name="sv_buttonBackgroundColor">#3333B5E5</item>
    <item name="sv_buttonForegroundColor">#33B5E5</item>
</style>

attrs.xml - 与设计时预览兼容的自定义属性定义

<!-- The android attrs assume the corresponding android format / data type --> 
<declare-styleable name="ShowcaseView">
    <!--# Cling drawable -->
    <attr name="android:src"/>
    <!--# Title #-->
    <attr name="android:contentDescription"/>
    <!--# Description #-->
    <attr name="android:description"/>
    <!--# Button Text #-->
    <attr name="android:text"/>
    <attr name="sv_backgroundColor" format="color|reference" />
    <attr name="sv_detailTextColor" format="color|reference" />
    <attr name="sv_titleTextColor" format="color|reference" />
    <attr name="sv_buttonBackgroundColor" format="color|reference" />
    <attr name="sv_buttonForegroundColor" format="color|reference" />
</declare-styleable>

ShowcaseView.java - 使用自定义视图中的自定义属性

public ShowcaseView(Context context) {
    this(context, null, R.styleable.CustomTheme_showcaseViewStyle);
}

public ShowcaseView(Context context, AttributeSet attrs) {
    this(context, attrs, R.styleable.CustomTheme_showcaseViewStyle);
}

public ShowcaseView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // Get the attributes for the ShowcaseView
    final TypedArray styled = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ShowcaseView, 0, 0);
    showcase = styled.getDrawable(R.styleable.ShowcaseView_android_src);
    titleText = styled.getString(R.styleable.ShowcaseView_android_contentDescription);
    subText = styled.getString(R.styleable.ShowcaseView_android_description);
    buttonText = styled.getString(R.styleable.ShowcaseView_android_text);
    backColor = styled.getInt(R.styleable.ShowcaseView_sv_backgroundColor, Color.argb(128, 80, 80, 80));
    detailTextColor = styled.getColor(R.styleable.ShowcaseView_sv_detailTextColor, Color.WHITE);
    titleTextColor = styled.getColor(R.styleable.ShowcaseView_sv_titleTextColor, Color.parseColor("#49C0EC"));
    styled.recycle();
    // Now make use of the fields / do further initialization ..
}