2013年3月31日日曜日

「Unexpected text found in layout file」の警告について


LayoutのXMLファイルを編集していると、以下の警告が表示されることがあります。

「Unexpected text found in layout file」

予期しないテキストがレイアウトファイルの中で検出されたということなのですが、
ファイルをどう確認しても、警告となる原因が見つかりません。

きっと、見た目では確認できないゴミテキストが紛れ込んでいるのでしょう。

こんなときは、いったんEclipseを再起動すると良いでしょう。

案の定、再起動後に同じファイルを確認すると、今度は、確かに不要なテキストが目に見えるかたちで存在していました。

従って、これを削除することで問題が解決できました。

2013年3月23日土曜日

「This file is derived. Do you really want to edit it?」のメッセージについて


ファイルを編集しようとすると、以下の警告ダイアログが表示されることがあります。



メッセージは、

「This file is derived. Do you really want to edit it?」

と表示されていて、要するに、ファイル属性が「derived」であるが、本当に編集してもいいですか?といった内容です。

このメッセージが表示されたときの対処方法は以下の通りです。

【その1】
まず、編集しようとしているファイルが、Rクラスなど、そもそもgen [Generated Java Files]デレクトリに自動生成されるファイルの場合は、[No]クリックして、編集をやめる必要があります。

【その2】
今まで普通に編集できたファイルが、突然警告表示されるようになってしまった場合は、おそらく、誤ってgen [Generated Java Files]デレクトリへファイルを移動させてしまって、その後、もとの場所へ戻すなどの操作をした場合が考えられます。
このような時は、以下のように、ファイルの属性を変更してあげれば、編集が可能になります。

①ファイルの右クリックから[Properties]をクリックする。




②AttributesのDerivedにあるチェック項目を外してから、[Apply]のクリックでファイルの属性を変更します。





2013年3月10日日曜日

レイアウトエディタのリソース参照エラー


グラフィックスライブラリによる描画において、その描画をeclipseのレイアウトエディタで確認しようとすると、以下のエラーが出力されて、悩んでしまうことがあります。

android.content.res.Resources$NotFoundException: Could not resolve resource value: 0x7F05000A.

これは、指定したリソースが参照できないというエラーです。

リソースの定義は、以下のように正しく行っています。

/res/values/color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
     <!-- Top Page用 -->
     <color name="tile_light">#4169e1</color>
     <color name="tile_dark">#0000cd</color>
     <color name="tile_char">#ffffff</color>
</resources>


R.javaファイルにもリソースIDが保存されているようです。

public static final class color {
    public static final int tile_char=0x7f05000b;
    public static final int tile_dark=0x7f05000a;
    public static final int tile_light=0x7f050009;
}


色を指定方法にも問題はないです。

private Paint mPaint = new Paint ();

mPaint.setColor(getResources().getColor(R.color.tile_dark));


このように、何も問題がないように思われるのに、レイアウトエディタで確認してみると、エラーになってしまう場合は、eclipseを再起動してみてください。

eclipseの再起動によりレイアウトエディタにリソースが認識されて、正しく描画されるようになります。

2013年3月3日日曜日

Avoid object allocations during draw/layout operations (preallocate and reuse instead)


Viewを継承したクラスで、円などを描画させようとしたときに、eclipseから警告が出力されて悩んでいる人も多いかと思います。

例えば、以下のようなコーディングをすると

@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);

Paint paint = new Paint ();
paint.setColor(Color.BLUE);
canvas.drawCircle(100f, 100f, 50f, paint);

}

new Paint()に対して、以下の警告が出力されます。

Avoid object allocations during draw/layout operations (preallocate and reuse instead)

これは、onDraw()関数が呼ばれるたびに、Printオブジェクトが作成されてしまうのを避けてくださいという警告です。
従って、以下のように、Paintオブジェクトをメンバ変数で保持して、使い回すようにコーディングすればよいでしょう。

Paint mPaint = new Paint ();

@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);

mPaint.setColor(Color.BLUE);
canvas.drawCircle(100f, 100f, 50, mPaint);

}

尚、この警告は無駄なオブジェクト作成を指摘しているものなので、そのまま実行しても問題なく動きます。
とは言っても、ガーベージコレクションによるメモリ解放が多発し、パフォーマンスも落ちると思いますので、できる限りオブジェクトを使い回すようにコーディングしたほうがよいでしょう。