SDKでダイアログ表示 ― 2013/12/26
今回は、ダイアログの表示を行います。
ダイアログは SDKの機能を使うので native側のプログラムではないのですが、共通部分でいろいろ変更点があったので挙げておきます。
ダイアログの表示には、DialogFragmentを使用します。
Dialogを直接 create(), show()でもダイアログは表示されますが、アクティビティがダイアログの再生成をするとかで DialogFragmentを使うべき…らしいです。
BaseActivity.java
/******************** アクティビティ ********************/ public class BaseActivity extends FragmentActivity { static { System.loadLibrary("native"); } public final static int KEY_BACK = 1; // バックキー public final static int KEY_YES = 2; // ダイアログ用 public final static int KEY_NO = 3;
基本アクティビティの変更点です。
Activityではなく FragmentActivityを継承しています。
FragmentActivityを使うためにプロジェクトには android-support-v4.jarを追加しています。
また、アプリ側で汎用的に使えるように KEY_YESと KEY_NOを定義しています。
AppActivity.java
package app; import sys.BaseActivity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; /******************** アクティビティ ********************/ public class AppActivity extends BaseActivity { static public AppActivity app; /********** 開始 **********/ @Override protected void onCreate(Bundle _savedInstanceState) { super.onCreate(_savedInstanceState); app = this; } /************** 終了確認 **************/ static public void open_dialog() { ExitDialogFragment _dlg = new ExitDialogFragment(); // 終了確認ダイアログ _dlg.show(app.getSupportFragmentManager(), "dialog"); } /******************** 終了ダイアログ ********************/ public static class ExitDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("アプリを終了しますか"); builder.setPositiveButton("終了", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { key_status = KEY_YES; } }); builder.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { key_status = KEY_NO; } }); return builder.create(); } } } /***************** End of File ***************************************************/
java側で独自の処理があるので、BaseActivityを継承した AppActivityを作成しています。
nativeから open_dialog()を呼んでダイアログを表示します。
ExitDialogFragmentが使用するダイアログのクラスです。
ボタンを押したときは key_statusに値を入れて BaseActivityの処理で native側に送っています。
AppMain.cpp
/************************ 終了確認ダイアログ ************************/ static void open_dialog(void) { JNIEnv* env; Bool attach_flag = FALSE; if ( sys::g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6) < 0 ) { if ( sys::g_JavaVM->AttachCurrentThread(&env, NULL) < 0 ) { return; } attach_flag = TRUE; } jclass clazz = env->FindClass("app/AppActivity"); if ( clazz ) { jmethodID mid = env->GetStaticMethodID(clazz, "open_dialog", "()V"); if ( mid ) { env->CallStaticVoidMethod(clazz, mid); } } if ( attach_flag ) { sys::g_JavaVM->DetachCurrentThread(); } } /****************************** 稼働 戻り値 アプリ続行か ******************************/ Bool update_app(void) { switch ( phase ) { case PHASE_MAIN : // メイン cnt++; if ( sys::key_status == sys::KEY_BACK ) { // バックキー open_dialog(); // 終了確認ダイアログ phase = PHASE_DIALOG; } break; case PHASE_DIALOG : // 終了確認ダイアログ switch ( sys::key_status ) { case sys::KEY_YES : sys::Renderer::fade_out(60); end_cnt = 60; phase = PHASE_EXIT; break; case sys::KEY_NO : phase = PHASE_MAIN; break; } break; case PHASE_EXIT : // 終了 if ( --end_cnt == 0 ) { return FALSE; // アプリ終了 } break; } sprite[SPR_PHOTO].draw(0.0f, 0.0f); // 背景 for (int i = 0; i < 4; i++) { // ビー玉 int t = ((cnt + i*15) % 60) - 30; sprite[SPR_BALL_BLUE + i].draw(((i*180 + cnt*4) % 720) - 360, 400 - (30*30 - t*t)/2); } return TRUE; }
native側のサンプルです。
バックキーを押すと、ダイアログを表示するようになっています。
プロジェクト一式は、こちらです。
コメント
トラックバック
このエントリのトラックバックURL: http://raseene.asablo.jp/blog/2013/12/26/7157464/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。