Google Androidで画面遷移

マクドナルドにて一人もくもく会
先日のメニュー表示に引き続き、書籍を読みながら、画面遷移のプログラムを書いてみた。

シチュエーションは、メニューを表示させ、そこからメニュー専用の画面に飛ぶというもの。
今回はじめて、一つのアプリに複数のActivityを作った。
一つはメイン画面で、もう一つはメニュー画面。
遷移をするためには、Intentオブジェクトが必要で、ここに遷移先の名前や渡すデータをセットしstartActivity()をコールすれば、遷移してくれた。
他にも、エミュレータの向きを変更するショートカットやタイトルの消去など、細かいことを知ることができて有意義だった。

メモ

  • 画面遷移
    • キーワードは、startActivity()メソッド、Intentクラス、Bundleクラス
    • Activityを追加したときは、AndroidManifest.xmlのactivity要素を追加する
    • 【遷移元】
      • startActivity()をコールする
      • 引数はIntentインスタンス
      • android.content.Intentクラス
      • Intent.setClassName()で遷移先のActivityを指定する
      • 遷移先のActivityに情報を渡す場合は、Bundleインスタンスを生成する
      • Intent.putExtras()でBundleをセットする
      • 遷移先に情報を渡さない場合は、Bundleインスタンスを生成する必要なし
    • 【遷移先】
      • getIntent()で遷移元からIntentを受け取る
      • Intent.getExtras()でBundleを取り出す
      • 遷移元でBundleインスタンスを設定していない場合、getExtras()はnullになる
  • ウィンドウタイトルの消去
    • requestWindowFeature()で消去できる
  • 背景色の変更
    • setBackgroundColor()で変更可能
    • Viewを継承したクラスを自分で作らないと背景色の変更は出来ない?
  • テーマの変更
    • ウィンドウタイトルの有無や背景色をセットにしたテーマを設定することでも見栄えを変更できる
    • AndroidManifest.xmlまたはjavaソースコードから設定することが可能。
    • AndroidManifest.xmlは、application要素またはactivity要素にandroid:theme属性を追加する。
    • application要素に追加すると、アプリ全体に適用される。
    • javaソースコードは、setTheme()で設定する。(setContentViewメソッドの前にコールしないといけないらしい)
    • javaソースコードからは、Activityごとにしかテーマを設定できない。
    • デフォルトテーマはBlack
package com.example.android.helloworldmenu;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;

public class HelloWorldMenu extends Activity {
	final int MENU_ID_SETTING = 0;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        
        setContentView(R.layout.main);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	super.onCreateOptionsMenu(menu);
    	
    	MenuItem menuItem = menu.add(0, MENU_ID_SETTING, 0, "Setting");
    	menuItem.setIcon(android.R.drawable.ic_menu_preferences);
    	
    	return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	switch (item.getItemId()) {
    	case MENU_ID_SETTING:
    		transSetting();
    		return true;
    	}
    	return false;
    }
    
	// 設定画面に遷移
    private void transSetting() {
    	Intent intent = new Intent();
    	intent.setClassName(getPackageName(), getClass().getPackage().getName()+".Setting");
    	startActivity(intent);
    }
}
package com.example.android.helloworldmenu;

import android.app.Activity;
import android.os.Bundle;
import android.view.WindowManager;

public class Setting extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        
        setContentView(new SettingView(this));
        DebugUtility.showToast(this, "Setting.onCreate()");
    }
}
package com.example.android.helloworldmenu;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class SettingView extends View {
	public SettingView(Context context) {
		super(context);
		setBackgroundColor(Color.WHITE);
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		canvas.drawText("Setting", 100, 100, new Paint());
	}
}
package com.example.android.helloworldmenu;

import android.content.Context;
import android.widget.Toast;

public class DebugUtility {
	public static void showToast(Context context, String str) {
		Toast toast = Toast.makeText(context, str, Toast.LENGTH_SHORT);
		toast.show();
	}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.android.helloworldmenu"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" 
    			 android:label="@string/app_name" 
    			 android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
    			 android:debuggable="true">
        <activity android:name=".HelloWorldMenu"
                  android:label="@string/app_name"
                  android:screenOrientation="landscape"
                  android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Setting"
        		  android:label="@string/app_name"
                  android:screenOrientation="landscape"
                  android:configChanges="keyboardHidden|orientation">
        	<intent-filter>
        		<action android:name="android.intent.action.MAIN" />
        	</intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="3" />
</manifest>