fragmentを使って「アプリ」を作る2
TRANSCRIPT
次のFragmentにパラメータを渡したい
Lesson 5https://github.com/fkmhrk/AndroidFragmentLesson/tree/lesson5
タイトル画面(fragment_title.xml)に名前入力欄を追加しました。
この名前入力欄に入力された名前を、次のMainFragmentに渡してみましょう。
(ホームボタンで中断しても、ちゃんと動作するように!)
Lesson 5のお題
ダメな例 1
コンストラクタに引数追加しちゃう
public MainFragment(String name) { mName = name;}
引数無しコンストラクタが無くなるので、再生成時にコンストラクタが見つからなくて死ぬ
setArguments()
Bundleに詰めるのがベストプラクティス
Fragment next = new MainFragment();
Bundle args = new Bundle();args.putString(ARGS_NAME, name);next.setArguments(args);
transaction.replace(R.id.container, next);
getArguments()
setがあるならgetもある
Bundle args = getArguments();String name = args.getString(ARGS_NAME);mNameText.setText(name + "さんこんにちは!");
newInstance()
インスタンスを作るstatic methodを用意する
public static MainFragment newInstance(String name) { MainFragment fragment = new MainFragment();
Bundle args = new Bundle(); args.putString(ARGS_NAME, name); fragment.setArguments(args); return fragment;}
Fragmentから
結果を受け取りたい
Lesson 6https://github.com/fkmhrk/AndroidFragmentLesson/tree/lesson6
setTargetFragment()
呼び出し元のFragmentは保持できる
public static LoginFragment newInstance( Fragment target, int requestCode) { LoginFragment fragment = new LoginFragment(); fragment.setTargetFragment(target, requestCode); // 中略
return fragment;}
interfaceを用意する?
キャストしたりと面倒じゃない?
public interface LoginListener { void onLoginFinished(String username);}
// キャストする
LoginListener l = (LoginListener)getTargetFragment();
onActivityResult()
onActivityResult()で結果を返す
FragmentのonActivityResult()はpublic
Fragment target = getTargetFragment();
Intent data = new Intent();data.putExtra(EXTRA_NAME, username);target.onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, data);
DialogFragmentを使って
ダイアログを出そう
Lesson 7https://github.com/fkmhrk/AndroidFragmentLesson/tree/lesson7
独自のDialogFragmentを作る
DialogFragmentを継承しよう
public class ConfirmDialogFragment extends DialogFragment {}
newInstance()も作る
呼び出し元に結果を伝えようpublic class ConfirmDialogFragment extends DialogFragment { public static ConfirmDialogFragment newInstance( Fragment target, int requestCode) { ConfirmDialogFragment fragment = new ConfirmDialogFragment(); fragment.setTargetFragment(target, requestCode); // 中略
return fragment; }}
onCreateDialog()
onCreateDialog()で、ダイアログを作る
@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // ダイアログ作成
return builder.create();}
選択の結果はonActivityResult()
「はい」の時だけonActivityResult()を呼ぶのでもOK
@Overridepublic void onClick(DialogInterface dialog, int which) { if (which != DialogInterface.BUTTON_POSITIVE) { return; } Fragment target = getTargetFragment();
target.onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);}