DialogFragment でもひとつ備忘
なんというか微妙なハマり方をしております。以下なカンジの Dialog を云々してまして
public static class MyAlertDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater factory = LayoutInflater.from(getActivity()); final View inputView = factory.inflate(R.layout.dialog_layout, null); final EditText editView = (EditText)inputView. findViewById(R.id.dialog_edittext); AlertDialog.Builder Builder = new AlertDialog.Builder(getActivity()); Builder.setView(inputView); Builder.setTitle("何かを入力"); Builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { String password = // SharedPreferences から設定値取得 if (editView.equals(password)) { // ココ (!!) dialog.dismiss(); } else { Toast.makeText(getActivity(), "パスワードが違います", Toast.LENGTH_LONG).show(); } } }); Builder.setCancelable(true); return Builder.create(); } }
みたいな事してまして、パスワードな文字列比較して合致してる条件分岐の_ココ (!!)_でもう少しごにょごにょする必要が出てまいりました。ここからが本題。
_ココ (!!)_に記述しなければならない処理は当初この DialogFragment な subclass が記述されてる Activity クラスのメソドの中で定義されてました。Activity クラスの属性を使いたい放題に使っております。具体的に引用しちゃうと以下なカンジ。
mHandler.removeCallbacks(mSCEngine); // mHandler はインスタンス属性 isContinue = false; // isContinue もインスタンス属性 logOutput(); // logOutput はインスタンスメソド Intent i = new Intent(this, PCPreferencesActivity.class); startActivityForResult(i, 0);
最後に Activity を kickoff なさっているのですがこれも又色々アレな訳です。
で、_ココ (!!)_の中で以下な記述にしていたのですが
HogeActivity hogeActivity = (HogeActivity)getActivity(); hogeActivity.mHandler.removeCallbacks(mSCEngine); hogeActivity.isContinue = false; hogeActivity.logOutput(); Intent i = new Intent(hogeActivity, PCPreferencesActivity.class); hogeActivity.startActivityForResult(i, 0);
で、ここまで書いて、あらら? って事に気づいてるのですが以下な部分は
hogeActivity.startActivityForResult(i, 0);
以下な記述でしたね。
startActivityForResult(i, 0);
確認してみるか。
結果
上記が不具合の原因でしたね。上記の形でも Activity クラスのインスタンスメソドにした対処でもどちらでも動くみたいですが、どうしたものか。
つうか、不具合の原因を記録を残してる最中に発見とか微妙すぎるorz
もひとつ
上記 AlertDialog なソレですが、
によれば以下な実装を盛り込む必要があるとのこと。
@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getDialog().setCanceledOnTouchOutside(false); }
なんかこのあたり、何回もヤられては忘れて、というあたりもアレですorz