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

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

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

このページ、および開発関連ページは、PC向けデザインとなっております。 画面サイズの小さいスマホでは、快適な表示が得られませんので、ご了承ください。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

キー入力を検出する

投稿 February 15, 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);
と定義して、実装しています。
具体的には、トップ画面でない画面だったらトップ画面に戻す、という処理を入れています。

▲ページ先頭へ


関連トピックス
関連トピックはありません。


その他のおすすめ
おすすめ記事はありません。

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

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