ページ 11

[android]画面のViewサイズを求めたいがエラーが発生する

Posted: 2014年11月10日(月) 12:39
by LL
お久しぶりですLLです。
現在このサイトのAndroidのページを参考にSurfaceViewを利用したチープなゲームを作っている最中なのですが,
元のページのサンプルプログラムが機種依存(座標直打ち)で気持ち悪かったので、画面サイズを取得してそこから初期座標を求めると言うプログラムを作っています。
本題ですが、その過程で
http://techbooster.org/android/hacks/16066/
のサイトを参考にデフォルトで作られたレイアウトのxmlからViewサイズを求めようとしました。
しかし、参考サイト通りにonWindowFocusChangedでfindViewByIdしてもなぜか中身がnullで起動時エラーを起こしてしまいます。
[ RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout1); ]のコード部分です。
デバッガを通しても何故その部分でエラーが発生するのかが分からず困っております。どうかご助力お願いします。

コード:

package jp.denpa.testaplcation;


import android.app.Activity;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.Window;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
	
	public static Display mDisplay;				//ディスプレイ情報
	public static Point mDispSize;				//ディスプレイサイズ(ステータスバーも含めた画面全体描画領域)
	public static Point mViewSize;				//ビューサイズ(実際にコンテンツが描画される領域)
    
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// タイトルバーを隠す場合
		requestWindowFeature(Window.FEATURE_NO_TITLE);		//なお、このメソッドはSetContantViewを通る前に指定すること(しないとエラー)
		
		setContentView(new GameSurfaceView(this));

		//ディスプレイ情報の取得
		mDisplay = getWindowManager().getDefaultDisplay();	
		mDispSize = new Point();			//ディスプレイサイズ格納用の構造体クラス
		mDisplay.getSize(mDispSize);	//ディスプレイサイズの格納

		mViewSize = new Point();
		
		//センサーの初期化
		AcSensor.Inst().onCreate(this);
	}
	
	//xmlで指定した高さや幅はOnCreate時に取得すると0しか取得できない。
	//しかしOnWindowFocusChangedメソッド内で取得するとアプリ起動時にViewSizeが取得できる
	@Override
	public void onWindowFocusChanged(boolean hasForcus){
		super.onWindowFocusChanged(hasForcus);
		
	    //Viewサイズを取得する
		//描画用xmlの情報を取得
	    RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout1);     //ここでrlにnullが入ってしまっているが原因が不明
		mViewSize.x = rl.getWidth();
		mViewSize.y = rl.getHeight();
	}
	
	
	//アクティビティが動き始めるとき
	@Override
	protected void onResume(){
		super.onResume();
		
		//アクティビティが動くときセンサーを動かし始める
		AcSensor.Inst().onResume();
	}
	
	//アクティビティが一時停止する時
	@Override
	protected void onPause(){
		super.onPause();
		//アクティビティ中断時センサーを停止
		AcSensor.Inst().onPause();
	}
}
main_layout.xml

コード:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/relativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="jp.denpa.testaplcation.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

Re: [android]画面のViewサイズを求めたいがエラーが発生する

Posted: 2014年11月10日(月) 13:16
by softya(ソフト屋)
onCreateでsetContentView(new GameSurfaceView(this));とされていますので、main_layoutはこのアクティビティに割り付けられてません。
なので、relativeLayout1が見えないと思います。

Re: [android]画面のViewサイズを求めたいがエラーが発生する

Posted: 2014年11月10日(月) 14:34
by LL
そうか、SurfaceViewをsetContentViewに入れていたことにすっかり気がつかなかった・・・
これはこの手段による解決方法がなさそうなので解決にチェックをいれておきます。
(あるとすればタイトルバーなどを全部消してディスプレイサイズで計算かな。)