ページ 11

androidADTで画像表示

Posted: 2013年7月26日(金) 21:35
by fooshan
こんにちは。
現在 eclipceADTにて、androidの開発を行っています。
今回、質問したのは本サイトの「androidの館」で、紹介されているゲームの基本骨格を利用して、
自分で用意した画像を表示しようとしたのですが、うまくいきません。

エラーは表示されませんが、実行時に、エミュレーター内でエラーが出てしまいます。
内容は、「unfortunately has stopped 」です。
また、LogCatで調べたところ、実行時に
error opening trace file: No such file or directory (2)
FATAL EXCEPTION: main
と表示されています。

色々調べてみたところ
Resources res = context.getResources();
ここが原因のようです。(この位置を消すと起動する)
しかし、問題が見当たらず、行き詰まってしまいました。
どこを修正すれば良いのでしょうか?


以下、ソースです。
GameMgr.java

コード:

package com.example.test;
import java.util.LinkedList;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;


@SuppressLint("WrongCall")
public class GameMgr
{
	private LinkedList<Task> _taskList = new LinkedList<Task>();//タスクリスト
	
	GameMgr(Context context)
	{	
		_taskList.add(new Title(context));
	}

	public boolean onUpdate()
	{
		for( int i=0 ; i<_taskList.size() ; i++ )
		{
			if( _taskList.get(i).onUpdate() == false)//更新失敗
			{
				_taskList.remove(i);//タスクの排除
				i--;
			}
		}
		return true;
	}
	public void onDraw(Canvas cnvs)
	{
		cnvs.drawColor(Color.WHITE);
		for( int i=0 ; i<_taskList.size() ; i++ )
		{
			_taskList.get(i).onDraw(cnvs);//描画
		}
	}
}

Title.java

コード:

package com.example.test;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;

public class Title extends Task
{	
	private Context context;

	public Title(Context context)
	{
	this.context = context;
	}

	Paint paint = new Paint();
	Resources res =  context.getResources();//ここの位置で問題が発生
	Bitmap title_img =  BitmapFactory.decodeResource(res, R.drawable.enemy_2);

	@Override
	public void onDraw(Canvas cnvs)
	{
		cnvs.drawBitmap(title_img, 110, 110, paint );
	}
}

Title内で context.getResources() を利用するためにcontextを、スーパークラスであるGameMgrから継承して使っています。
継承の順番は、
MainActivity

GameSurface

GameMgr

Title

となっています。

Re: androidADTで画像表示

Posted: 2013年7月26日(金) 21:42
by みけCAT
検証コードを書いてみました。

コード:

import java.util.*;
import java.lang.*;

class Zikken {
    public static int func1() {
        System.out.println("func1");
        return 1;
    }
    public static int func2() {
        System.out.println("func2");
        return 2;
    }
}

class Test {
    public Test() {
        this.hensu=Zikken.func2();
    }
    int hensu=Zikken.func1();
    public int gethensu() {
        return hensu;
    }
}

class Main
{
	public static void main (String[] args) throws java.lang.Exception
	{
		Test tst=new Test();
        System.out.println(tst.gethensu());
	}
}
実行結果は

コード:

func1
func2
2
となりました。ここからコンストラクタの代入処理より変数初期化の代入処理の方が先に行われていることがわかります。
よって、クラス変数のcontextにコンストラクタの引数のcontextを代入する前にcontext.getResources()が呼び出され、
その結果(ぬるぽで?)死んでいると考えられます。

Re: androidADTで画像表示

Posted: 2013年7月27日(土) 08:37
by へにっくす
Title.javaで
内部変数に代入している部分は、いつ実行されていると思いますか?
そこがヒントです。

すくなくとも、コンストラクタより後に実行されるとは思っていないよね?

Re: androidADTで画像表示

Posted: 2013年7月27日(土) 14:14
by fooshan
みけCAT様、へにっくす様

順番が、「コンストラクタ→内部変数の初期化」だと思っていました。

原因が分かったところで、色々試行錯誤してみましたが、できませんでした。

改変した点は、GameMgrに問題の「Resources res = context.getResources();」を入れ、コンストラクタによって、 res を Titleに持っていく方法です。
しかし、結果は変わらずエラーがでます。

変更点は以下です。
GameMgr.java

コード:

	GameMgr(Context context)//コンストラクタ
	{	
		Resources res =  context.getResources();
		_taskList.add(new FpsContorol());
		_taskList.add(new Title(res));
	}

Title.java

コード:

	Resources res;
	public Title(Resources res)//コンストラクタ
	{
		this.res = res;

	}

Re: androidADTで画像表示

Posted: 2013年7月27日(土) 22:38
by へにっくす
変更点だけ書かれても分かりませんよ。
Title.javaについてみると以下のようになってしまいますが、あってますか?
あってるとするなら、何の解決にもなっていないので当然としか言えないのですけど?

コード:

package com.example.test;
 
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
 
public class Title extends Task
{   
    private Context context;
    Resources res;                // ここに追加?

    // コンストラクタをこう変えた?
    public Title(Resources res)
    {
			this.res = res;
    }
    // ここ以降は変えてないのか?
    Paint paint = new Paint();
    Resources res =  context.getResources();//ここの位置で問題が発生
    Bitmap title_img =  BitmapFactory.decodeResource(res, R.drawable.enemy_2);
 
    @Override
    public void onDraw(Canvas cnvs)
    {
        cnvs.drawBitmap(title_img, 110, 110, paint );
    }
}
変更点を含めた全部のソースを載せてください。

Re: androidADTで画像表示

Posted: 2013年7月28日(日) 01:59
by fooshan
ご回答有難うございます。
デバッグをしているとき、ある箇所で間違いを犯していることに気づきました。
まったく見当違いな箇所で間違いをしていました。

context をGameSurfaceからGameMgrに渡しているのですが、その渡し方に問題があったようです。

無駄な回答をさせてしまって申し訳ないです。