端末の向きを変えると異常終了

 端末の向きを変更すると異常終了する。
 作ってるアプリを起動し、「横向き(LANDSCAPE)←→縦向き(PORTRAIT)」の変更をするとアプリが異常終了するんだ。
 どうも Activity が初期化されてしまうのが原因のようだ。
 Android では画面の向きを変える際、Activity が初期化されてしまうらしい。
 それで予期しない初期化が起きて、異常終了するみたい。

 それじゃ、画面の向きを固定すればいい話し。
 でも、固定したくない場合もあるよね。
 その場合、「向きを変えても初期化しない」ようにすればいい。

Manifest の設定

 初期化しないようにするには、AndroidManifest.xml に configChanges=”orientation” を追加する。

<activity android:name=".XmSpriteView_Test"
		android:label="@string/app_name"
		android:configChanges="orientation">
</activity>

 orientation は、初期化をAndroid に任せず、アプリが行うということらしい。

 この設定は、eclipse の機能を使うと簡単に追加・設定できるよ。

1. eclipse でAndroidManifest.xml を開く

2. ウィンドウ下にある、「アプリケーション」タブをクリック

3. 設定するActivity をクリック

4. 右下のエリアにある、「Config changes」の「選択」ボタンをクリック。
 するとダイアログが出るので、その中の「orientation」をチェック。

 以上で設定が追加される。

Posted in アプリ設定, 画面. Tags: , , . 端末の向きを変えると異常終了 はコメントを受け付けていません。 »

「画面サイズ設定」ってナニよ?

 エミュレータ・ベース(VBox)で作ってたアプリを、端末で実行したら拡大表示されてしまった。
 いや、拡大表示っていうのは、正確じゃない。
 画像表示は拡大されて、ボタン等は横幅が圧縮されてしまってる。
 ちょうど、”小さな画面” に押し込まれた感じ。なんだけど…。

	VBoxの画面サイズは、800x600
	端末のタブレットも、800x600

 画面サイズは同じなのに、これはどういうことなんだろ…?

画面サイズを調べる

 原因は「端末の画面サイズ」だろうと予想がつく。
 なぜなら、ボタン等の左右端は、画面端から一定の長さを保つようにしているから。
 だから小さい画面になると、左右幅が圧迫されて横幅が小さくなってしまうんだ。
 でも前述のように、端末は800×600のハズ…。
 なにはともあれ、画面サイズをまず調べてみることにした。

 画面サイズは、下記方法で取得できる。

◆Activityの場合

	WindowManager wm = (WindowManager) getSystemService( Activity.WINDOW_SERVICE );
	Display display = wm.getDefaultDisplay();
	int width = display.getWidth();
	int height = display.getHeight();

◆Viewの場合

	WindowManager wm = (WindowManager) context.getSystemService( Context.WINDOW_SERVICE );
	Display display = wm.getDefaultDisplay();
	int width = display.getWidth();
	int height = display.getHeight();

 結果は…

	width  = 533
	height = 400

 やはり、画面サイズが小さいようだ。
 とすると、アプリ側で画面サイズの設定が必要…ということなのかな?

実は必要、画面サイズ設定(解像度設定)

 調べると、AndroidManifest.xml に supports-screens が必要らしい。
 supports-screens は、アプリでサポートしている画面解像度を設定するようだ。
 たとえば、下記のような感じ。

	<manifest xmlns:android="http://schemas.android.com/apk/res/android">
		<supports-screens
			android:largeScreens="true"
			android:normalScreens="true"
			android:smallScreens="true"
			android:anyDensity="true" />
	 </manifest>

 それぞれの意味は…

	largeScreens … ラージスクリーンのサポート
	normalScreens … ノーマルスクリーンのサポート
	smallScreens … スモールスクリーンのサポート
	anyDensity … ピクセル密度を調整可能

 ということのよう。
 これらの設定がない場合、解像度設定は、SDK Version の設定(後述)に従うらしい。
 そして、SDK Version の設定もない場合、すべてfalse となるらしい。

 supports-screens もSDK Version もない…
 その場合は、SDK 1.5相当のサポートとなり、normalScreens で動作することになる。
 つまり、「端末がlargeScreens の解像度でも、normalScreens の解像度で動作」する。
 ──今回のような「小さな画面サイズ」になってしまうようだ。

 PCに例えると、「17インチ・モニター(1024×768)で、15インチ設定(800×600)」にした感じかな。
 それと、これには逆の現象もあるらしい。
 本来、画面いっぱいに表示されるアプリが、小さく表示されてしまうようなんだ。
 原因は同じで、supports-screens もSDK Version の設定もないせいで起きるみたい。

 現在、作っているアプリは、800×480での動作を対象としている。
 なので、下記を追加したことで、画面サイズの問題はひとまず解決。

	<supports-screens
		android:largeScreens="true"
		android:anyDensity="true" />

SDK Version の設定

 前記 supports-screens とは別の設定でも、画面サイズを設定できる。
 別の設定とは、minSdkVersin もしくは targetSdkVersion の設定。
 それぞれは…

	minSdkVersino … 指定SDKバージョン以上で動作
	targetSdkVersion … 指定SDKバージョンでのみ動作

 …ということらしい。
 なので正確には、画面サイズ設定ではない。
 しかしこれらの設定をすると、SDKでサポートしている設定が supports-screens に設定されるため、同様の結果がえられるんだ。

 今回、下記を追加したことでも、画面サイズの問題は解決した。

	<uses-sdk android:minSdkVersion="4" />

※. 参考資料
http://developer.android.com/guide/practices/screens_support.html

未解決がひとつ…

 さて。
 画面サイズの問題は、supports-screens もしくは、minSdkVersion で解決した。
 けれども、「画像表示が拡大されてしまう」不具合は直らなかった。
 これはピクセル密度が関係した不具合で…
 解決方法は、またページを改めて。
 →「ピクセル密度ってナニよ?」

by the way…

 ここらへんって、基本中の基本っていうか、すごく重要なことだと思うんだけど…。
 手元にある緑本には記述が見当たらない。
 なんだかなぁ…。
 入門書だからこそ、解説してほしい事項なのになぁ。

Posted in アプリ設定, 画面. Tags: , , , , , . 「画面サイズ設定」ってナニよ? はコメントを受け付けていません。 »