fragmentを使って「アプリ」を作る2

21
Fragmentを使って 「アプリ」を作る DialogFragmentとか

Upload: hirokazu-fukami

Post on 19-Jul-2015

390 views

Category:

Software


2 download

TRANSCRIPT

Fragmentを使って「アプリ」を作る 2

DialogFragmentとか

前回の予告のおさらい

● 次のFragmentに値を渡したい

● Fragmentから結果を受け取りたい

● DialogFragmentを使って

ダイアログを出したい

次のFragmentにパラメータを渡したい

Lesson 5https://github.com/fkmhrk/AndroidFragmentLesson/tree/lesson5

タイトル画面(fragment_title.xml)に名前入力欄を追加しました。

この名前入力欄に入力された名前を、次のMainFragmentに渡してみましょう。

(ホームボタンで中断しても、ちゃんと動作するように!)

Lesson 5のお題

ダメな例 1

コンストラクタに引数追加しちゃう

public MainFragment(String name) { mName = name;}

引数無しコンストラクタが無くなるので、再生成時にコンストラクタが見つからなくて死ぬ

ダメな例 2

setterで渡すのは?

public void setName(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

ログイン画面(LoginFragment)を追加しました。

ログインボタンを押すと、ユーザー名を呼び出し元のFragmentに伝えましょう

Lesson 6のお題

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

メイン画面(MainFragment)にメニューを追加しました。

ログアウトを押すと、「ログアウトしますか?」のダイアログを表示しましょう

Lesson 7のお題

独自の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);}

show()で表示

使う時はインスタンスを作ってshow()

ConfirmDialogFragment dialog = ConfirmDialogFragment.newInstance( this, REQUEST_CONFIRM);dialog.show(getFragmentManager(), "");