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

 端末の向きを変更すると異常終了する。
 作ってるアプリを起動し、「横向き(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: , , , , , . 「画面サイズ設定」ってナニよ? はコメントを受け付けていません »

設定モードの作り方 (設定画面)

 アプリの動作設定等を行う画面。
 なんとなくわかってきたので、必要手順等、作成方法をまとめておく。
 なお、「設定モード」としたのは、画面のみの作成に止まらない、全体的なものであるから。

 以下の作業に、特に順番はない。

◆設定画面の作成

[ AndroidManifest.xml ]
●Activity の追加

 PreferenceActivity を追加する。
●↓のように、の中に記述。

 AndroidManifest.xml

1
2
3
<application>
    <activity android:name="MyPrefs"></activity>
</application>

 ※.は、既存のもので新設はしない。
 ※.”MyPrefs” は、PreferenceActivity のclass名。(任意)

[ MyPrefs.java ] extends PreferenceActivity
●PreferenceActivity の作成
 PreferenceActivity を継承したclassを作成する。

●PreferenceActivity の役割
 有体にいえば、「設定画面の起動(表示)」。
 画面内容自体は、別のxmlに記述する。
●xmlの指定
 MyPrefs.java

1
addPreferencesFromResource(R.xml.prefes);

※.prefes は、画面内容のxml名。(任意)

[ prefes.xml ]
● prefes.xml の作成
 ファイル名に特に決まりはない。
 PreferenceActivity から引用されるので、それの記述に合わせる必要がある。

・作成場所
  /res/xml/

● prefes.xml の役割
 有体にいえば、設定画面の内容。
 記述内容がそのまま画面に表示される。
 ※.記述内容についてはここでは解説しない。

◆設定画面の実行(表示)

●概要
 設定画面の実行は、Intent によって行う。
 Intent を作成し、そのIntent に PreferenceActivity を割りつける、ことになる。
 例えばボタンであれば、onClick()で↓を実行する。

 <例>

1
2
Intent intent = new Intent(this, com.migimaki.android.MyPrefs.class);
startActivity(intent);

 ※.Intent の第二引数は、パッケージ名となることに注意。

 ざっと、こんなところだろうかね。
 動作から推察するに、「アプリmainのActivityから、別のActivityを実行する」といったところかな。
 フツウのclassとちがって、呼び出し側・実行側に内包されない。

 そこでちょっとした問題。
 「Activity の遷移」なので、”戻る”ボタンで戻れてしまうのだ。
 便利といえば便利なのだが、ゲーム系だと予期しない動作を引き起こしかねない。
 ちょっと注意が必要だね。

参考
Androidアプリの設定画面を作成する

Posted in アプリ設定. Tags: . 設定モードの作り方 (設定画面) はコメントを受け付けていません »