7

私の問題は、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」の両方を試しましたが、両方ともアプリでは機能しますが、プレビューでは機能しません。また、ビューのコンストラクターからコンテキストをプライベート コンテキスト メンバーに保存しようとしましたが、どちらも役に立ちませんでした。

4

2 に答える 2

10

コードは問題ありませんが、残念ながら ADT プラグインにはまだいくつかのバグがあり、そのうちの 1 つがあります。Layout Editor には、カスタム ビューのレンダリングに関する問題があります。私は同じ問題を抱えていましたが、私が見つけた唯一のワークアウトは、View.isInEditModeをチェックし、リソースからではなく、他の方法で int 配列を初期化することです。したがって、コードは次のようになります。

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

ところで、メソッドでリソースを作成したりロードしたりしないでくださいonDrawgetResources().getIntArrayある種のキャッシングを使用していると思いますが、とにかくパフォーマンスが低下する可能性があります。

于 2012-07-18T15:20:18.713 に答える
0

デザイナーでリソースにアクセスするには、アンドロイドの独自の属性をハイジャックする必要がある一種の回避策を見つけました。

以下はアイデアを提供するはずですが、タイプ 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 ..
}
于 2013-07-19T09:15:56.967 に答える