このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com ロゴ
作成 February 15, 2018、更新 March 24, 2020(様式変更)
トップページ > Android 開発トップ > Backボタンを処理する
line
Android 開発
line

ここでは、Back ボタンを処理する手順を記録しています。

画面の下に表示されている(配置されている) Back ボタン ( こんなボタンです。 ) 。 これを正しく処理しないと、非常に使いにくいアプリになります。 詳細は Android Developer の 「Back ボタンと Up ボタンを使用したナビゲーション」 にありますが、要は、正しく実装してください、ということだと思います。

ここでは、Back ボタンの検出と処理方法を、私がどう実装したか、書いています。

このページ、および開発関連ページは、PC向けデザインとなっております。 画面サイズの小さいスマホでは、快適な表示が得られませんので、ご了承ください。

ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

▼ セクション一覧

キー入力を検出する
私の実装方法


キー入力を検出する

投稿 October 31, 2018、更新 July 24, 2018(様式変更)

android_main 関数で、

state->onInputEvent = engine_handle_input;

と設定していますので、入力は engine_handle_input 関数が受け取ります。 この関数は、main.cpp で、次のように定義されています。

static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)

第2引数で受け取る AInputEvent* event を使って、 AInputEvent_getType(event) 関数AINPUT_EVENT_TYPE_KEY を返すとき、発生したのはキー入力ということがわかります。

キー入力の実行は、UP イベント(指を離した)が発生したときだけでよいと考えられるので、 AKeyEvent_getAction(event) 関数AKEY_EVENT_ACTION_UP を返すとき、キー処理をする、とします。
※ 実機テストでは、押しっぱなしでも処理されてしまいましたが・・・

キーの UP イベントであったとき、 AKeyEvent_getKeyCode(event) 関数でキーコードを調べて、どのキーの処理をするかを判断します。

AKEYCODE_BACK であったとき、Back キーですので、戻る機能を処理します。 処理したときは、engine_handle_input 関数1 を返す必要があります。 もし 0 を返すと、アプリがサスペンドされ、バックグラウンドになります(ホーム画面になる)。

▲ページ先頭へ

私の実装方法

投稿 February 15, 2018、更新 July 24, 2018(様式変更)

私は、なるべく今後簡単にコーディングができるように、 CAppCore と名前を付けたクラスを定義し、 それを継承した CApp クラスを用意しました。

class CApp : public CAppCore

グローバルで、CApp g_app を用意して、キー入力処理を行う関数

bool CAppCore::coreInputEventKey(struct android_app* app, AInputEvent* event)

を定義しました。

main.cpp ではキー入力イベントがあったことを判定したら、この関数を呼び出して処理を行います。 main.cpp は、なるべく何もいじらないようにしたいと思いました。

static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) {
	struct engine* engine = (struct engine*)app->userData;
	if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
		// ここにはタッチの処理を記述します。
	}

	// キー入力があるとき
	if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) {
		if (g_app.coreInputEventKey(app, event)) {
			return 1;
		}
	}
	return 0;
}

coreInputEventKey 関数が trueを返したら、1 を返しています。「処理した」という意味になります。

CAppCore クラスでは、

bool CAppCore::coreInputEventKey(struct android_app* app, AInputEvent* event)
{

	//	アップのときだけ処理すればよいと考えられます。
	if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_UP) {

		switch (AKeyEvent_getKeyCode(event)) {

		case AKEYCODE_BACK:
			return OnKeyUpBack(app, event);

		default:
			return OnKeyUp(app, event, AKeyEvent_getKeyCode(event));
		}
	}
	return false;
}

のようにして、Back キーのときには OnKeyUpBack 関数を、 それ以外のキーのときには OnKeyUp 関数を呼び出しています。 今は Back キーだけ知りたかったのでこうなっていますが、他のキーについて特別な処理が欲しい場合は、拡張するかも知れません。

どちらの関数も、CAppCore クラスに

virtual bool OnKeyUpBack(struct android_app* app, AInputEvent* event)
{
	return false;
}

のように仮の実装をしておいて、とりあえず(正しくなくても)ビルドが通るようにしています。

アプリで処理する必要があるとき(コードを実装するとき)、CApp クラスで

protected:
	bool OnKeyUpBack(struct android_app* app, AInputEvent* event);

と定義して、実装しています。 具体的には、トップ画面でない画面だったらトップ画面に戻す、という処理を入れています。

▲ページ先頭へ
line
関連トピックス

C/C++ による文字列操作 CString を代用

C/C++ で、MFC の CString を代用する、最低限欲しかった機能を持ったクラスを作成しました。

C/C++ による現在日時の取得

C/C++ で現在時刻を取得する方法を検討しています。

C/C++ によるログ出力

C/C++ で、ログファイルを出力する方法について、書いています。

line
その他のおすすめ
line

Android 開発トップ

Android ネイティブアプリ開発に関する情報は、こちらからどうぞ。

JavaScriptが無効です
▲ページ先頭へ

© 2017-2021 StraightApps.com 無断転載を禁じます。No reproduction without permission.